我在excel中有超过60000
行我需要通过阅读F列来减少。我有一个功能宏但它需要永远。如果在列F
中值为0
或为null,我将删除行。我认为我的代码可能过于冗长。我在VBA很新。我在网上发现了这个代码,并试图将它变成我自己的代码。任何帮助是极大的赞赏。我的代码列在下面。
Private Sub CommandButton1_Click()
Dim rng As Range
Dim i As Long
Set rng = ThisWorkbook.ActiveSheet.Range("F1:F62000")
With rng
For i = .Rows.Count To 1 Step -1
If .Item(i) = "" Then
.Item(i).EntireRow.Delete
End If
For i = .Rows.Count To 1 Step -1
If .Item(i) = "0" Then
.Item(i).EntireRow.Delete
End If
Next i
End With
End Sub
答案 0 :(得分:2)
在循环中删除行是一个非常缓慢的过程。
这是一种更快的方法。这标识了需要删除的范围,然后一次删除它们。你还有很多不必要的代码我已经删除了。我没有测试下面的代码,但我认为它应该可行。
Private Sub CommandButton1_Click()
Dim rng As Range, delRng As Range
Dim i As Long
With ThisWorkbook.ActiveSheet
For i = 1 To 62000
If .Range("F" & i).Value = "" Or .Range("F" & i).Value = "0" Then
If delRng Is Nothing Then
Set delRng = .Range("F" & i)
Else
Set delRng = Union(delRng, .Range("F" & i))
End If
End If
Next i
End With
If Not delRng Is Nothing Then delRng.Delete
End Sub
注意:另一种更快的方法是使用.Autofilter
答案 1 :(得分:2)
为了应对列F
同时包含数字和文字的可能性,您可以分两个阶段使用Autofilter
:一个删除空白,另一个删除0
:
With ThisWorkbook.ActiveSheet.Range("F1:F62000")
.AutoFilter 1, ""
.Offset(1).EntireRow.Delete
.AutoFilter
.AutoFilter 1, 0
.Offset(1).EntireRow.Delete
.AutoFilter
End With
根据经验,这是按标准删除行的最快方法。但请注意,使用Autofilter
需要第一行作为标题行。如果不是这样,请插入空行。
答案 2 :(得分:0)
尝试在代码前使用Application.ScreenUpdating = False
,在代码后使用Application.ScreenUpdating = True
。
您的代码中有两个For i =
。一个在另一个里面......
只使用一个:
For i = .Rows.Count To 1 Step -1
If .Item(i) = "" Or .Item(i) = "0" Then
.Item(i).EntireRow.Delete
End If
Next i