【发布时间】:2020-05-15 10:22:07
【问题描述】:
我有一个宏,我在其中连续搜索文本,如果一列没有我指定的文本,则将其删除。这是我的代码:
Private Sub Test()
Dim lColumn As Long
lColumn = ActiveSheet.Cells(2, Columns.Count).End(xlToLeft).Column
Dim i As Long
Dim myCell As Range
Dim myRange As Range
Set myRange = Worksheets("2019").Range(Cells(2, 1), Cells(2, lColumn))
For Each myCell In myRange
If Not myCell Like "*($'000s)*" And Not myCell Like "*Stmt Entry*" And Not myCell Like "*TCF*" And_
Not myCell Like "*Subtotal*" And Not myCell Like "*Hold*" Then
myCell.EntireColumn.Select
Selection.Delete
End If
Next
End Sub
我的问题是,当我执行宏时,它只会删除一些列,但不会删除范围末尾的列。如果我再次运行宏,它将成功删除我要求它删除的所有列。
如果我将宏切换为 - 比方说 - 使单元格变为粗体而不是删除它们,它每次都能完美运行。
我错过了什么?
非常感谢!
【问题讨论】:
-
如果是循环删除,应该从右向左循环。
-
我该怎么做?
-
您在迭代集合时正在修改它。这通常意味着意外的、奇怪的行为。考虑
Union-ing 列而不是Select-ing 列,然后运行联合Range对象的.Delete方法一次,在循环之后 而不是在每次迭代时删除Selection。向后循环以保持低效地修改您正在迭代的集合只是......向后循环。 -
@BigBen 我也是。行打了几十遍,列的歌舞一模一样。 here's one
-
建议不要使用ActiveSheet获取最后一列;使用您真正感兴趣的工作表。无法保证 ActiveSheet 会是您所期望的。