【问题标题】:Using an if statement within a for loop- Excel VBA在 for 循环中使用 if 语句 - Excel VBA
【发布时间】:2013-08-26 23:08:49
【问题描述】:

我在 excel vba 的 for 循环中使用 if 语句时遇到问题。调试器的输出不是我所期望的。我可以发布我想要完成的完整代码,但我认为我已经将它缩小到我不理解的范围内。这是我的代码:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim i As Integer

For i = 9 To 60 Step 3

If Cells(i, "DR").Value < Cells(i, "EB").Value Then
    Debug.Print i & "-ifloopstart"
    Cells(i, "DR").Value = 999999
    Debug.Print i & "-ifloopend"
End If

Next i

End Sub

调试器的输出是:

9-ifloopstart
33-ifloopstart
51-ifloopstart
51-ifloopend
33-ifloopend
9-ifloopend

但是,我预计:

9-ifloopstart
9-ifloopend
33-ifloopstart
33-ifloopend
51-ifloopstart
51-ifloopend

有人能解释一下这是如何工作的吗?它似乎是循环回到 if 语句的开头,而不是结束 if 语句。如何修改代码以获得我期望的输出?我已经为此苦苦挣扎了好几个小时,看起来很简单:(。

【问题讨论】:

  • 更新工作表将再次触发事件代码,因此您应该在进行任何更改之前使用Application.EnableEvents=False。完成后设置回 True...

标签: excel vba if-statement for-loop


【解决方案1】:

每次使用Cells(i, "DR").Value = 999999 更新工作表时,都会再次调用Worksheet_Change

这样想。每次调用上述代码时,您都会修改一个单元格,这会再次触发工作表更改方法。

所以你实际上嵌套了这个函数的三个调用:

  • 调用一次,i = 9
    • 再次调用,i = 33
      • 再次调用,i = 51
      • 完成 i = 51 次通话
    • 完成 i = 33 次通话
  • 完成 i = 9 次通话

VBA 然后从每一个倒退到第一次运行您的方法时。

编辑:作为Tim says,您可以使用Application.EnableEvents=False 禁用此功能

【讨论】:

  • 哇,非常感谢所有回答的人!...我在这里发疯了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-07
  • 1970-01-01
  • 1970-01-01
  • 2014-03-13
相关资源
最近更新 更多