对于每个循环提前结束,我无法弄清楚为什么

时间:2017-11-16 20:53:26

标签: excel vba

我正在寻找有关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次

非常感谢任何帮助,如果我能回答任何问题或提供更多信息,我会很高兴。

2 个答案:

答案 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