我看到幾篇關於刪除範圍內的空白行的文章,以及其他一些關於刪除基於單個空白列的表格行的文章,但沒有關於刪除完全空白的表格行的文章。什麼是刪除Excel表格的所有空行的最快方法?
這樣做最快的方法是什麼?
我在下面發佈了我的解決方案以幫助其他人,但我很想看看是否有人有更快的方法。
我看到幾篇關於刪除範圍內的空白行的文章,以及其他一些關於刪除基於單個空白列的表格行的文章,但沒有關於刪除完全空白的表格行的文章。什麼是刪除Excel表格的所有空行的最快方法?
這樣做最快的方法是什麼?
我在下面發佈了我的解決方案以幫助其他人,但我很想看看是否有人有更快的方法。
下面是我用來刪除空白表格行的過程。我有時會使用大型(用於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
這比其他方法的一些優點:
SpecialCells(xlCellTypeBlanks)
方法的一半。這應該有效。不知道它的速度更快,但它的另一種方式來做到這一點:
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,以滿足您的檯面尺寸):
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
感謝張貼此。我首先按原樣跑完,並在4分13秒內完成。屏幕更新和計算設置爲手動,它被縮減爲1分17秒 - 更快,但仍然比我發佈爲答案的方法所獲得的19秒慢得多....似乎應該有一個更快的方法。 – ChrisB