我正在寻找有关Excel VBA中For Each循环的一些帮助。
Set ListofCells = Range(ActiveCell, Range("C12:C9999").Find("!!End Measures!!"))
For Each SingleCell In ListofCells
If ActiveCell.Value = "!!End Measures!!" Then
ActiveCell.Offset(1, 0).Select
Exit For
ElseIf ActiveCell.Value = "" Then
ActiveCell.EntireRow.Delete
End If
Next SingleCell
由于某种原因,我希望尽早退出循环,据我所知,绝对没有理由。在我的电子表格中,我希望删除从ActiveCell到入口区域结束的所有未使用的行,我将其称为“!! End Measures !!”。我也尝试过:
Set ListofCells = Range(ActiveCell, ActiveCell.End(xlDown))
和它一样的行为。比预期更早地结束循环。
如果我将这些循环中的4个连续放入然后它按预期运行....但我希望找出为什么这可能会提前退出而不必做一些奇怪的事情,比如循环这个4或5次
非常感谢任何帮助,如果我能回答任何问题或提供更多信息,我会很高兴。
答案 0 :(得分:3)
有几件事引起了我的注意。
一。定义你正在循环的内容会很好。
两个。你在循环中使用Activecell,但我认为这不是你想要做的,我想你想要SingleCell
三。删除行时,您的范围可能会发生变化。由于您不需要任何成员,因此重新启动循环可能会更容易,除非这需要几分钟才能运行。考虑一下:
Dim ListofCells As Range, SingleCell as Range
StartItUp:
Set ListofCells = Range(ActiveCell, Range("C12:C9999").Find("!!End Measures!!"))
For Each SingleCell In ListofCells.Cells
If SingleCell.Value = "!!End Measures!!" Then
SingleCell.Offset(1, 0).Select
Exit For
ElseIf SingleCell.Value = "" Then
SingleCell.EntireRow.Delete
GoTo StartItUp
End If
Next SingleCell
答案 1 :(得分:3)
如果您只是想将ActiveCell中的所有行删除到包含"!!End Measures!!"
的行,则可以用一行替换现有代码:
Range(ActiveCell, Range("C12:C9999").Find("!!End Measures!!").Offset(-1, 0)).EntireRow.Delete
稍强一些版本(不依赖于ActiveCell
,但只是删除"!!End Measures!!"
和之前的非空白单元格之间的所有行)将是:
Dim EndMeasures As Range
Dim LastMeasure As Range
Set EndMeasures = Columns(3).Find("!!End Measures!!")
'Check that there are blank rows before deleting
If IsEmpty(EndMeasures.Offset(-1).Value) Then
Set LastMeasure = EndMeasures.End(xlUp)
Range(LastMeasure.Offset(1), EndMeasures.Offset(-1)).EntireRow.Delete
End If