1

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

最快的方法是什么?

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

4

3 回答 3

3

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

您使用如下过程:

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

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

下面是实际过程:

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 列的表的测试中,此方法耗时 19 秒。SpecialCells(xlCellTypeBlanks)这只是同一张桌子所需的方法所需的 34 秒的一半多一点。
  2. 识别完全空白的表格行:与其他一些方法不同(比如这个- 尽管它在某些情况下很有用),此方法在行的每个单元格中查找空白,而不仅仅是一个。
于 2017-08-02T18:57:11.250 回答
1

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

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

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

于 2017-08-02T19:53:21.087 回答
0

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

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
于 2018-02-27T15:05:11.913 回答