VBA工作表更改事件绕过?

use*_*643 15 excel vba worksheet excel-vba

我正在修改电子表格.当工作表更改时,程序员为每张工作表制作一个宏.这很好,因为它在添加新信息时会对纸张详细信息进行颜色协调,因此我希望保留此功能.

我编写了一个宏来对数据进行排序并允许删除和添加新员工,这与更改事件宏相冲突,并且如果它们都可操作则导致我的宏出错.

问:有没有办法在宏运行时绕过工作表更改事件,然后在宏完成后再次将其置于适当位置?

以下是更改事件的代码.

Private Sub Worksheet_Change(ByVal target As Excel.Range, skip_update As Boolean)
If skip_update = False Then
    Call PaintCell(target)
End If
End Sub
Run Code Online (Sandbox Code Playgroud)

当我引用工作表或范围时,我的宏会出现错误.

Dic*_*ika 31

我想你想要对象的EnableEvents属性Application.当您设置EnableEvents为False时,您的代码所做的任何操作都不会触发任何事件,也不会运行任何其他事件代码.例如,如果您的代码更改了一个单元格,它通常会触发Change事件或SheetChange事件.但是,如果你这样构造它

Application.EnableEvents = False
    Sheet1.Range("A1").Value = "new"
Application.EnableEvents = True
Run Code Online (Sandbox Code Playgroud)

然后改变A1将不会触发任何事件.

有时必须让代码触发事件代码,有时却不是.使用EnableEvents时要防止它.


Chr*_*isB 5

这是对@Dick Kusleika答案的重要修改。

关闭EnableEvents设置时,最好包括错误处理以重新启用EnableEvents。如果不这样做,并且脚本引发错误,则更改事件触发器(您的脚本)将停止工作,直到您手动重新启用EnableEvents。

理想情况下,您应将以下行紧接在任何重新触发您的更改事件的代码之前。第一行告诉VBA在遇到错误时转到名为“ enableEventsOn”的标签。第二行绕过更改事件。

On Error Goto enableEventsOn:
Application.EnableEvents = False
Run Code Online (Sandbox Code Playgroud)

然后,将此代码放在重新触发您的更改事件的代码之后。这将打开更改事件触发器,并向脚本返回正常的错误处理。

Application.EnableEvents = True
On Error Goto 0
Run Code Online (Sandbox Code Playgroud)

最后,将此代码放在脚本的末尾。这是上面提到的标签。如果在“ On Error Goto enableEventsOn:”和“ On Error Goto 0”之间遇到错误,则脚本将转到此处并重新启用EnableEvents,使其准备在下次更改工作表时启动脚本。

enableEventsOn:
Application.EnableEvents = True
Run Code Online (Sandbox Code Playgroud)

  • 我有一个故障安全子系统,出于这个确切的原因,我通常会在其他子系统的末尾插入并调用它。自动计算、屏幕更新、启用事件、显示警报等。关闭某个功能后,子程序多次出错,然后我试图找出 Excel 崩溃的原因。 (2认同)
  • @C-Love511 如果您有兴趣,请搜索基于自定义类的方法。这是我最喜欢的解决方案。创建一个自定义类,在其“Class_Terminasearch”事件中自动恢复事件、屏幕更新、计算模式等。然后在子中创建该类的新实例,当该子结束时,类实例范围缩小并恢复设置。查看此 CodeReview 帖子:https://codereview.stackexchange.com/q/182278/115996 (2认同)