【问题标题】:Excel 2007 VBA: Event refires after the same event procedure endsExcel 2007 VBA:同一事件过程结束后事件重新触发
【发布时间】:2015-04-02 02:11:04
【问题描述】:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)
    Application.EnableEvents = False

    ' Some code

    Application.EnableEvents = True

End Sub

“一些代码”用于捕获用户在某个单元格中粘贴了一些值。如果粘贴是在复制操作之后进行的,则程序可以正常工作。如果粘贴值是在剪切操作之后出现的,那么在执行到达 End Sub 后,程序会再次启动,我无法确定发生了什么变化会导致重新启动。

源单元格和目标单元格使用数据验证进行格式化。

【问题讨论】:

  • 您是否尝试过删除数据验证然后单步执行代码?
  • 是的。没有任何区别。

标签: vba excel events


【解决方案1】:

试试这个,你可以看到第一个触发的事件来自被剪切的范围,第二个来自粘贴目标。

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Source As Range)

    Application.EnableEvents = False

    Debug.Print Sh.Name, Source.Address()

    Application.EnableEvents = True

End Sub

【讨论】:

  • 那么问题就变成了,为什么当 EnableEvents = False 时会触发两个事件?是否有两个事件在第一个事件完成后被缓冲并执行?我该如何解决这个问题?另一件值得注意的事情:作为一种临时解决方法,我在不同的工作表中实现了一个标志,这样我就可以在执行任何代码之前检测到重新启动并退出子(懊恼)。奇怪的是,在工作表中更改标志的值解决了重新启动(当然,评估标志的代码从未使用过)。
  • @DatManCoo 剪切发生在您的工作表更改之前,粘贴发生在之后。你为什么不在代码的最后使用事件? xl 是否为粘贴目标提供内置事件过程?
  • 在操作的Cut部分引发的事件中,Source范围内将没有内容,所以你不能忽略那个事件吗?
  • Update1:​​我之前关于我在工作表中使用标志尝试解决问题的评论并没有无意中解决问题 - 当我实施解决方法时已经很晚了,我没有时间彻底测试。第二天的进一步测试揭示了我错误的初步结论。
  • Update2:我现在明白为什么在执行剪切和粘贴操作时要处理两个事件。这似乎是微软的一个糟糕的方法,但是嘿,我该判断谁......我相信开发人员有他们的理由。
猜你喜欢
  • 2017-05-16
  • 2016-05-10
  • 1970-01-01
  • 2021-02-10
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多