我在 Excel 中有以下 VBA 代码。其目标是在找到给定文本时删除一行,并删除其正下方的行。它需要扫描大约 70 万行,大约需要一个小时才能扫描 10 万行。有人看到有什么优化吗?
Sub RemovePageHeaders()
Application.ScreenUpdating = False
Dim objRange As Range
Set objRange = Cells.Find("HeaderText")
While objRange <> ""
objRange.Offset(1, 0).Rows(1).EntireRow.Delete
objRange.Rows(1).EntireRow.Delete
Set objRange = Cells.Find("HeaderText")
Wend
MsgBox ("I'm done removing page headers!")
End Sub
提前致谢!
尝试下面的子。它从最底部的行循环到顶部,检查第 3 列中的“HeaderText”。如果找到,它将删除该行及其下面的一行。在具有 2 GB RAM 的 C2D E8500 上,在具有 100 万行的纸张上,每 100,000 行只需要一分多钟的时间。
Sub RemoveHeaders()
Dim i As Long
Application.ScreenUpdating = False
Debug.Print "Started: " & Now
For i = ActiveSheet.UsedRange.Rows.Count To 1 Step -1
If ActiveSheet.Cells(i, 3) = "HeaderText" Then
ActiveSheet.Range(i & ":" & i + 1).EntireRow.Delete
End If
Next i
Application.ScreenUpdating = True
Debug.Print "Finished: " & Now
End Sub
EDIT对于一个稍微贫民窟但可能更快的解决方案,请尝试以下操作:
- 将以下代码中的常量更改为每行中第一列空白的编号。例如,如果您的数据占据 A-F 列,您希望常数为 7(G 列)。
- 运行代码,它会将行号放在每个条目旁边。应该需要大约 30 秒。
- 按 C 列对整个数据进行排序;这应该需要不到一分钟的时间。
- 直观地找到“HeaderText”,选择并删除所有行。
- 按行编号的列(在我的示例中为“G”)排序。
-
删除行编号的列(在我的示例中再次为“G”)。
Sub NumberColumns()
Const BLANK_COLUMN = 7
Dim i As Long
For i = ActiveSheet.UsedRange.Rows.Count To 1 Step -1
ActiveSheet.Cells(i, BLANK_COLUMN) = i
Next i
Debug.Print "done"
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)