2014-10-01 64 views
1

如果我运行此代码,其中<>是运算符将该行的单元格与前一行的单元格进行比较,它永远不会结束并且将继续添加行而不会破坏符合条件的第一行。If语句永不结束如果使用<>运算符

Dim rRng As Range 
Dim rCell As Range 

Set rRng = Range("B2:B30") 

For Each rCell in rRng.Cells 
If InStr(1, rCell.Value, "Foo") = 2 And rCell.Value <> rCell.Offset(-1, 0).Value Then 
    rCell.EntireRow.Insert 
EndIf 
Next rCell 

但是,如果我改变<>到=,它只会增加其中所述当前小区和前一小区的值是“foo”的行。

为什么添加多行?为什么它不会中断?

+2

由于'rRng'随着每个插入的行而增长,并且当条件第一次遇到时不会退出循环。 – GSerg 2014-10-01 23:05:17

+0

但是,当我使用=而不是<>时,它不会继续无限增长。它通过插入许多行来增长。为什么<>运算符会导致无限数量的插入,导致rRng不断增长? – 2014-10-01 23:06:45

+3

因为当你在两个相邻行之间插入一行具有相同值的行时,可以打破在相邻行上有两个相等值的情况:你现在有一个空白行将它们分开,所以在下一次迭代中,'='将失败并停下来。相反,当你在两行之间添加一行时,其中一行是'Foo',另一行不行,这种不平等的情况就会被保留下来:'Foo'行现在被推下来,仍然不等于它的现在行,相邻的行(新插入的行),并在下一次迭代时触发'<>'。 – GSerg 2014-10-01 23:15:49

回答

2

在Excel中,当您在其中插入一行时,范围会增大。

您首先将初始范围捕获为“B2:B30”,但在第一行插入后,它变为“B2:B31”,将插入点向下移动后的所有行。
重要的是,插入点位于当前行之前,因此在插入之后插入的行代替当前行,并且当前行向下移动,所以它将在下一次迭代中再次考虑。

=按照您的预期工作,因为它需要两个相邻行(当前和前一个)中的值相等才能进行插入,并且当您在具有相同值的两个相邻行之间插入一行时,您打破平等的情况:你现在有一个空白的行将它们分开,所以在下一次迭代中=条件将不会被满足。

相反,<>要求两个相邻行(当前和前一个)中的值不同,并且在两行之间插入一行时,其中一行是Foo而另一行不是,不等式情况被保留:原来的Foo行现在被按下,仍然不等于它现在相邻的行(新插入的行具有空值),并且将在下一次迭代中触发<>