Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 删除列中的空白单元格_Excel_Vba - Fatal编程技术网

Excel 删除列中的空白单元格

Excel 删除列中的空白单元格,excel,vba,Excel,Vba,以下代码将值表转换为单列 问题是,在我的表中,每列中的行数每连续一列减少一行。与下表类似 我对编写代码非常陌生,只知道最基本的内容。我复制了一个在线脚本,将一系列值转换为一列。我为删除空白单元格而编写的代码部分极大地降低了代码的速度。将大约250000个点转换为一列大约需要9个小时。我希望减少处理时间,因为这是我希望经常使用的脚本 Sub CombineColumns() Application.ScreenUpdating = False Application.EnableEvents =

以下代码将值表转换为单列

问题是,在我的表中,每列中的行数每连续一列减少一行。与下表类似

我对编写代码非常陌生,只知道最基本的内容。我复制了一个在线脚本,将一系列值转换为一列。我为删除空白单元格而编写的代码部分极大地降低了代码的速度。将大约250000个点转换为一列大约需要9个小时。我希望减少处理时间,因为这是我希望经常使用的脚本

Sub CombineColumns()

Application.ScreenUpdating = False
Application.EnableEvents = False

Dim rng As Range
Dim iCol As Long
Dim lastCell As Long
Dim K As Long

K = 484
'set K equal to the number of data points that created the range


Set rng = ActiveCell.CurrentRegion
lastCell = rng.Columns(1).Rows.count + 1

For iCol = 2 To rng.Columns.count
    Range(Cells(1, iCol), Cells(rng.Columns(iCol).Rows.count, iCol)).Cut
    ActiveSheet.Paste Destination:=Cells(lastCell, 1)
    lastCell = lastCell + rng.Columns(iCol).Rows.count

Next iCol
Dim z As Long
Dim m As Long

z = K ^ 2

For Row = z To 1 Step -1
    If Cells(Row, 1) = 0 Then
    Range("A" & Row).Delete Shift:=xlUp

    Application.StatusBar = "Progress: " & Row & " of z: " & Format((z - Row) / z, "Percent")
    DoEvents

    End If

Next

Application.StatusBar = False
Application.ScreenUpdating = True
Application.EnableEvents = True

End Sub
样本表结构

因为我给出了错误的信息,说明应该在哪里发布

下面的代码几乎可以立即执行您想要的操作

我使用数组来限制与工作表的交互次数

Sub foo5()
Dim ws As Worksheet
Dim rng() As Variant
Dim oarr() As Variant
Dim i&, j&, k&


Set ws = ThisWorkbook.Worksheets("Sheet19") 'Change to your sheet
With ws
    rng = .Range("A1", .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, .Cells(1, .Columns.Count).End(xlToLeft))).Value
    ReDim oarr(1 To Application.WorksheetFunction.CountA(rng), 1 To 1)
    k = 1
    For i = LBound(rng, 1) To UBound(rng, 1)
        For j = LBound(rng, 2) To UBound(rng, 2)
            If rng(i, j) <> "" Then
                oarr(k, 1) = rng(i, j)
                k = k + 1
            End If
        Next j
    Next i
    .Range("A1", .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, .Cells(1, .Columns.Count).End(xlToLeft))).Clear
    .Range("A1").Resize(UBound(oarr), 1).Value = oarr
End With
End Sub
Sub-foo5()
将ws设置为工作表
Dim rng()作为变量
Dim oarr()作为变体
尺寸i&,j&,k&
将ws=ThisWorkbook.Worksheets(“Sheet19”)更改为工作表
与ws
rng=.Range(“A1”、.Cells(.Cells(.Rows.Count,1).End(xlUp).Row、.Cells(1.Columns.Count).End(xlToLeft)).Value
ReDim oarr(1对应用程序.工作表函数.计数A(rng),1对1)
k=1
对于i=LBound(rng,1)到UBound(rng,1)
对于j=LBound(rng,2)到UBound(rng,2)
如果rng(i,j)“,则
oarr(k,1)=rng(i,j)
k=k+1
如果结束
下一个j
接下来我
.Range(“A1”、.Cells(.Cells(.Rows.Count,1).End(xlUp).Row、.Cells(1、.Columns.Count).End(xlToLeft))。清除
.范围(“A1”).调整大小(UBound(oarr),1)。值=oarr
以
端接头

因为我给出了错误的信息,说明应该在哪里发布

下面的代码几乎可以立即执行您想要的操作

我使用数组来限制与工作表的交互次数

Sub foo5()
Dim ws As Worksheet
Dim rng() As Variant
Dim oarr() As Variant
Dim i&, j&, k&


Set ws = ThisWorkbook.Worksheets("Sheet19") 'Change to your sheet
With ws
    rng = .Range("A1", .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, .Cells(1, .Columns.Count).End(xlToLeft))).Value
    ReDim oarr(1 To Application.WorksheetFunction.CountA(rng), 1 To 1)
    k = 1
    For i = LBound(rng, 1) To UBound(rng, 1)
        For j = LBound(rng, 2) To UBound(rng, 2)
            If rng(i, j) <> "" Then
                oarr(k, 1) = rng(i, j)
                k = k + 1
            End If
        Next j
    Next i
    .Range("A1", .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, .Cells(1, .Columns.Count).End(xlToLeft))).Clear
    .Range("A1").Resize(UBound(oarr), 1).Value = oarr
End With
End Sub
Sub-foo5()
将ws设置为工作表
Dim rng()作为变量
Dim oarr()作为变体
尺寸i&,j&,k&
将ws=ThisWorkbook.Worksheets(“Sheet19”)更改为工作表
与ws
rng=.Range(“A1”、.Cells(.Cells(.Rows.Count,1).End(xlUp).Row、.Cells(1.Columns.Count).End(xlToLeft)).Value
ReDim oarr(1对应用程序.工作表函数.计数A(rng),1对1)
k=1
对于i=LBound(rng,1)到UBound(rng,1)
对于j=LBound(rng,2)到UBound(rng,2)
如果rng(i,j)“,则
oarr(k,1)=rng(i,j)
k=k+1
如果结束
下一个j
接下来我
.Range(“A1”、.Cells(.Cells(.Rows.Count,1).End(xlUp).Row、.Cells(1、.Columns.Count).End(xlToLeft))。清除
.范围(“A1”).调整大小(UBound(oarr),1)。值=oarr
以
端接头


1。这是一个更好的问题。当您这样做时,不要发布代码和示例数据的图片。将代码和数据直接粘贴到帖子中,然后高亮显示,然后按Ctrl-k设置格式。请直接在此处发布代码。这样我就可以运行它了。您可以尝试在两部分之间放置一个msgbox,看看第二部分是否比第一部分慢。我假设这是真的,因为你删除了行,Excel需要移动很多单元格。我投票关闭这个问题,因为这个问题属于@ScottCraner——从截图上看,这不是有效的代码。行删除循环正在向后运行(或在错误的方向上运行,具体取决于您的观点)。@Comintern老实说,我按照他的描述,代码正在运行,我只是粗略地查看了一下代码。1。这是一个更好的问题。当您这样做时,不要发布代码和示例数据的图片。将代码和数据直接粘贴到帖子中,然后高亮显示,然后按Ctrl-k设置格式。请直接在此处发布代码。这样我就可以运行它了。您可以尝试在两部分之间放置一个msgbox,看看第二部分是否比第一部分慢。我假设这是真的,因为你删除了行,Excel需要移动很多单元格。我投票关闭这个问题,因为这个问题属于@ScottCraner——从截图上看,这不是有效的代码。行删除循环正在向后运行(或以错误的方向运行,具体取决于您的观点)。@Comintern老实说,我按照他的描述,代码正在运行,我只不过粗略地查看了一下代码。与非工作代码相比,工作代码的效率肯定有所提高@斯科特·克兰纳,我只是试着运行这个。当代码连续运行时,在第5304行之后,列被分配了一个N/a值,而我应该有大约117000个条目。@是的,我同意@zanwigz为你做了编辑工作?我刚在484x484网格上试过,不到一秒钟。如果有效,请单击答案旁边的复选标记,将其标记为正确。@ScottCraner我恐怕它仍然不适用于我。现在,它将把第二列移到第一列下面,然后代码结束。与非工作代码相比,工作代码无疑是效率上的改进@斯科特·克兰纳,我只是试着运行这个。当代码连续运行时,在第5304行之后,列被分配了一个N/a值,而我应该有大约117000个条目。@是的,我同意@zanwigz为你做了编辑工作?我刚在484x484网格上试过,不到一秒钟。如果有效,请单击答案旁边的复选标记,将其标记为正确。@ScottCraner我恐怕它仍然不适用于我。现在,它将把第二列移到第一列下面,然后代码结束。