我有几个真正的大的Excel数据文件,我需要去通过他们所有,并删除所有行,在塔T细胞的值是1。现在我的代码如下所示:
Sub test()
Dim cell As Range
For Each cell In Worksheets("Sheet1").Range("T5", "T900000")
If cell.Value = 1 Then
cell.EntireRow.Delete
End If
Next cell
End Sub
这似乎是工作,但需要永远跑,我不得不这样做一堆倍。 是否有这样做的更好的方法,或某种方式来优化我已经让它运行得更快?
你认为当你为你遍历它们,你最终跳过行删除行这不工作...。 例如:想象你行具有数列A你看第一行1 ... 10,并决定将其删除。 你看看现在的第二排。 它具有数字3! 你从来没有看过第2行!
更好的方法是过滤你的标准列T中的电子表格,复制,粘贴我到一个新的工作表(包含格式等)。
您可以打开宏录制和手动做到这一点; 那么你将有确切的VBA代码。 我相信会快很多。
即使你不这样做,如果你想要做一个for each
在那里你删除的东西,颠倒顺序(开始在后向前)
如果你想使用一个循环,下面不应该跳过的项目。 我认为@Floris筛选方法可能会更快,虽然。
Sub Main()
Dim Row As Long
Dim Sheet As Worksheet
Row = 5
Set Sheet = Worksheets("Sheet1")
Application.ScreenUpdating = False
Do
If Sheet.Cells(Row, 20).Value = 1 Then
Sheet.Rows(Row).Delete xlShiftUp
Else
Row = Row + 1
End If
Loop While Row <= 900000
Application.ScreenUpdating = True
End Sub
更新我已经切换Application.ScreenUpdating
周围循环,这通常加速这样的东西了很多!
如果您管理您的数据,如数据库,并希望删除特定行了出来,并有可能对其进行过滤,还有一招,以加快删除过程。 这是相对于简单的循环过程非常快:
我比较不同的例子的时间(以4806行)。
- 标准循环缺失:2:25
- 范围缺失:0:20
- 筛选缺失:0:01
例如 :我在“Tabelle5”数据和要删除特定行。 该数据在第6行。每行1列,这与“老#”应该删除开始启动。
1)在此标准溶液(最长时间):
Dim i As Integer, counter As Integer
Dim strToRemove As String, strToRemoveRange As String
strToRemove = "OLD#"
strToRemoveRange = ""
counter = 0
With Tabelle5
For i = .UsedRange.Rows.Count To 6 Step -1
If Mid(.Cells(i, 1).value, 1, 4) = strToRemove Then
.Rows(i).Delete Shift:=xlUp
End If
Next i
End With
2)在这里,范围溶液(中间时间):
Dim i As Integer, counter As Integer
Dim strToRemove As String, strToRemoveRange As String
strToRemove = "OLD#"
strToRemoveRange = ""
counter = 0
With Tabelle5
For i = .UsedRange.Rows.Count To 6 Step -1
If Mid(.Cells(i, 1).value, 1, 4) = strToRemove Then
If strToRemoveRange = "" Then
strToRemoveRange = CStr(i) & ":" & CStr(i)
Else
strToRemoveRange = strToRemoveRange & "," & CStr(i) & ":" & CStr(i)
End If
counter = counter + 1
End If
If counter Mod 25 = 0 Then
If counter > 0 Then
.Range(strToRemoveRange).Delete Shift:=xlUp
strToRemoveRange = ""
counter = 0
End If
End If
Next i
If Len(strToRemoveRange) > 0 Then
'.Range(strToRemoveRange).Delete Shift:=xlUp
End If
End With
3)过滤溶液(最短的时间):
Dim i As Integer, counter As Integer
Dim strToRemove As String, strToRemoveRange As String
strToRemove = "OLD#"
strToRemoveRange = ""
counter = 0
With Tabelle5
For i = .UsedRange.Rows.Count To 6 Step -1
If Mid(.Cells(i, 1).value, 1, 4) = strToRemove Then
.Cells(i, 1).Interior.Color = RGB(0, 255, 0)
counter = counter + 1
End If
Next i
If counter > 0 Then
.Rows("5:5").AutoFilter
.AutoFilter.Sort.SortFields.Clear
.AutoFilter.Sort.SortFields.Add( _
Range("A5"), xlSortOnCellColor, xlAscending, , xlSortNormal).SortOnValue.Color = RGB(0, 255, 0)
.AutoFilter.Sort.Header = xlYes
.AutoFilter.Sort.MatchCase = False
.AutoFilter.Sort.Orientation = xlTopToBottom
.AutoFilter.Sort.SortMethod = xlPinYin
.AutoFilter.Sort.Apply
.Rows("6:" & CStr(counter + 5)).Delete Shift:=xlUp
.Rows("5:5").AutoFilter
End If
End With
这里的绿线将责令其顶部和一系列绿色命中将被全部删除。 这是我知道的最快方法! :-)
我希望这会帮助别人!
最好的问候汤姆
我发现的最快方法是清除行数据(.clear),然后排序。 例如,我想摆脱分页符,显示为“=========”
I=20
Do While i <= lRow3
If Left(Trim(ws3.Cells(i, 1)), 1) = "=" Then
ws3.Range(Rows(i - 7), Rows(i + 2)).Clear
'i = i - 7
'lRow3 = lRow3 - 10
End If
i = i + 1
Loop
现在排序然后做一个xlUp最后一行(ws3.Range( “A1000000”)。完(xlUp).Row)等。
删除行(在我的文件,这22万行左右一个。)需要3分钟。 清除下的内容物10秒需要。
那么问题就变成了如何“删除”的空行,如果您需要将数据从行下方移动到一个以上在此之前完成。 :)
干杯,BJ