VBAmacros快速删除行

我有几个非常大的ex​​cel数据文件,我需要通过它们,并删除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的标准电子表格,复制它,粘贴到一个新的工作表(格式等)。

您可以打开macros录制并手动执行此操作; 那么你将有确切的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循环,这通常加快这样的事情了很多!

如果您像pipe理数据库一样pipe理数据,并希望从中删除特定的行,并且可以对其进行过滤,则可以加快删除过程。 与简单的循环过程相比,这是非常快的:

我比较不同的例子(4806行)的时间。

  • 标准循环删除:2:25
  • 范围删除:0:20
  • 筛选删除:0:01

例如 :我在“Tabelle5”中有数据,并想要删除特定的行。 数据从第6行开始。第1列中以“OLD#”开头的每一行都应该被删除。

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)这里Range解决scheme(中间时间):

 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)过滤解决scheme(最短时间):

 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 

在这里,绿线将被排在最前面,并且绿色点击的范围将被整体删除。 这是我知道的最快的方式! 🙂

我希望这会帮助别人!

最好的问候汤姆

我find的最快捷的方法是清除行数据(.clear)然后sorting。 例如,我想摆脱显示为“=========”的分页符

 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 

现在sorting然后做一个xlUp最后一行(ws3.Range(“A1000000”)。结束(xlUp)。罗)等

删除行(在我的约220,000行的文件之一)需要3分钟。 清除内容需要10秒钟。

如果你需要在这之前将数据从下面的行移动到上面的一个,那么问题就变成了如何“移除”空行。 🙂

干杯,BJ