我建立了一個50,000行×12列的矩陣。在F欄中,我隨機放置了大約25,000個空格。
- 閱讀所使用的區域到一個數組
- 迭代通過陣列和讀與F列內容的那些行到結果陣列
- 清除原始數據
- 結果寫入陣列
很多步驟,但執行時間少於一秒;屏幕更新錯誤可能會更快;如果你有更多的專欄則時間更長。
編輯:屏幕更新錯誤並沒有顯着降低執行速度,當使用高分辨率定時器定時時,執行速度大約爲0.36秒。
EDIT2:在閱讀Tim Williams關於保存格式和公式的評論之後,我提出了一種不同的方法。這種方法將使用高級過濾器,並在與上述相同的數據上,將數據放在另一個工作表中,減去列F中具有空白的行。這需要數據中的第一行列標題;或者至少,F1具有唯一的非空白值。
要完成該過程大約需要0.15秒。 如果您還想將其複製到原始工作表上,並刪除添加的工作表,則需要大約0.3秒。
下面是一些代碼來做到這一點,但你必須改變它自己的規格:
===================== =========================
Sub DeleteBlankFRows2()
Dim WS As Worksheet, wsTemp As Worksheet, rTemp As Range
Dim R As Range, rCrit As Range
Dim I As Long
Set WS = Worksheets("Sheet5")
Set R = WS.Range("a1").CurrentRegion
Set rCrit = R.Offset(0, R.Columns.Count + 3).Resize(2, 1)
rCrit(1) = R(1, 6)
rCrit(2) = "<>"
Application.ScreenUpdating = False
Worksheets.Add
Set wsTemp = ActiveSheet
wsTemp.Name = "Temp"
R.AdvancedFilter xlFilterCopy, rCrit, Cells(1, 1)
Set rTemp = wsTemp.Cells(1, 1).CurrentRegion
WS.Cells.Clear
rTemp.Copy WS.Cells(1, 1)
Application.DisplayAlerts = False
wsTemp.Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
================== =====================
這是使用VBA陣列我的原代碼:
============ ===============
Sub foo()
Dim vSrc As Variant, vRes() As Variant
Dim rSrc As Range
Dim I As Long, J As Long, K As Long
Dim lRows As Long
'Or may need to use a different method to include everything
Set rSrc = Range("a1").CurrentRegion
vSrc = rSrc
'how many rows to retain
For I = 1 To UBound(vSrc)
If vSrc(I, 6) <> "" Then lRows = lRows + 1
Next I
ReDim vRes(1 To lRows, 1 To UBound(vSrc, 2))
K = 0
For I = 1 To UBound(vSrc)
If vSrc(I, 6) <> "" Then
K = K + 1
For J = 1 To UBound(vSrc, 2)
vRes(K, J) = vSrc(I, J)
Next J
End If
Next I
Cells.Clear
Range("a1").Resize(UBound(vRes, 1), UBound(vRes, 2)) = vRes
End Sub
1)如果你有更大的行數和2)你可能需要將lastrow調成Long,2)如果它是空的,似乎並不刪除第一行。否則,我認爲這應該是最快的方法 – Alex 2014-10-07 19:19:32
沒有時間測試或編寫代碼,但另一種選擇是對列F進行排序,然後刪除最下面的行。 – guitarthrower 2014-10-07 19:26:05
@guitarthrower - 在我的PC上從50k中刪除約10k行花了10秒。關閉計算/屏幕更新對我來說沒有任何影響。但是,首先通過colF排序數據刪除時間爲0.03秒 – 2014-10-07 19:59:52