删除 Excel table 的所有空白行的最快方法是什么?

What's the quickest way to delete all blank rows of an Excel table?

我看到几篇关于删除范围内的空白行的帖子和其他关于基于单个空白列删除 table 行的帖子,但没有关于删除完全空白的 table 行的帖子。

最快的方法是什么?

我在下面发布了我的解决方案以帮助其他人,但我很想看看是否有人有更快的方法。

这是我用来删除空白 table 行的过程。我有时会处理大型(Excel)数据集,这种方法速度更快。它将 table 行加载到一个数组中,检查数组中的空白行,并在最后执行一个 range.delete 操作。

你使用的程序是这样的:

Sub Test()
    DeleteBlankTableRows ActiveSheet.ListObjects(1)
End Sub

ActiveSheet.ListObjects(1)(通常)是活动工作表上的第一个 table table。

这是实际的程序:

Sub DeleteBlankTableRows(ByVal tbl As ListObject)
    Dim rng As Range
    Set rng = tbl.DataBodyRange ' Get table data rows range.
    Dim DirArray As Variant
    DirArray = rng.Value2       ' Save table values to array.

    ' LOOP THROUGH ARRAY OF TABLE VALUES
    Dim rowTMP As Long
    Dim colTMP As Long
    Dim combinedTMP As String
    Dim rangeToDelete As Range

    '  Loop through rows.
    For rowTMP = LBound(DirArray) To UBound(DirArray)
        combinedTMP = vbNullString  ' Clear temp variable.

        ' Loop through each cell in the row and get all values combined.
        For colTMP = 1 To tbl.DataBodyRange.Columns.Count
            combinedTMP = combinedTMP & DirArray(rowTMP, colTMP)
        Next colTMP

        ' Check if row is blank.
        If combinedTMP = vbNullString Then
            ' Row is blank.  Add this blank row to the range-to-delete.
            If rangeToDelete Is Nothing Then
                Set rangeToDelete = tbl.ListRows(rowTMP).Range
            Else
                Set rangeToDelete = Union(rangeToDelete, tbl.ListRows(rowTMP).Range)
            End If
        End If
    Next rowTMP

    ' DELETE BLANK TABLE ROWS (if any)
    If Not rangeToDelete Is Nothing Then rangeToDelete.Delete
End Sub

这比其他方法有一些优势:

  1. SPEED:在一个200,000行8列的table测试中,这个方法耗时19秒。这只是 SpecialCells(xlCellTypeBlanks) 方法完成相同 table.
  2. 所需的 34 秒的一半多一点
  3. IDENTIFIES FULLY BLANK TABLE ROWS:与其他一些方法(如 this one - 尽管在某些情况下很有用)不同,此方法查找空白在一行的每个单元格中,而不仅仅是一个单元格。

这应该有效。不确定它是否更快,但这是另一种方法:

Sub delete_blank_table_rows()
Dim Rng As Range, tempRng As Range
Set Rng = Range("Table1")    ' Change as necessary
Set Rng = Range(Cells(Rng.Rows(1).Row, Rng.Columns(1).Column), Cells(Rng.Rows(Rng.Rows.Count).Row, Rng.Columns(Rng.Columns.Count).Column))

Dim i       As Long
For i = Rng.Rows.Count To 1 Step -1
    Cells(Rng.Rows(i).Row, Rng.Columns(1).Column).Select
    Set tempRng = Range(Cells(Rng.Rows(i).Row, Rng.Columns(1).Column), Cells(Rng.Rows(i).Row, Rng.Columns(Rng.Columns.Count).Column))

    If WorksheetFunction.CountA(tempRng) = 0 Then
        tempRng.Delete shift:=xlUp
    End If

Next i
End Sub

编辑:当然,要加快速度,您应该在运行时关闭屏幕更新和计算。

我认为这可能会更快(您可以修改 lastrow 和 lastcol 以满足您的 table 尺寸):

Sub delete_rows_blank2()

t = 1
lastrow = ActiveSheet.UsedRange.Rows.Count
lastcol = ActiveSheet.UsedRange.Columns.Count

Do Until t = lastrow

For j = 1 To lastcol

    If Cells(t, j) = "" Then

        j = j + 1

            If j = lastcol Then
            Rows(t).Delete
            t = t + 1
            End If

    Else

        t = t + 1

    End If

Next

Loop

End Sub