删除 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
这比其他方法有一些优势:
- SPEED:在一个200,000行8列的table测试中,这个方法耗时19秒。这只是
SpecialCells(xlCellTypeBlanks)
方法完成相同 table. 所需的 34 秒的一半多一点
- 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
我看到几篇关于删除范围内的空白行的帖子和其他关于基于单个空白列删除 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
这比其他方法有一些优势:
- SPEED:在一个200,000行8列的table测试中,这个方法耗时19秒。这只是
SpecialCells(xlCellTypeBlanks)
方法完成相同 table. 所需的 34 秒的一半多一点
- 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