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
时要防止它.
这是对@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)