我正在修改电子表格。当工作表更改时,程序员为每张工作表制作一个宏。这很好,因为它在添加新信息时会对纸张详细信息进行颜色协调,因此我希望保留此功能。
我编写了一个宏来对数据进行排序并允许删除和添加新员工,这与更改事件宏相冲突,并且如果它们都可操作则导致我的宏出错。
Q值。是否有办法在宏运行时绕过工作表更改事件,然后在宏完成后再次将其置于适当位置?
以下是更改事件的代码。
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
当我引用工作表或范围时,我的宏会出现错误。
答案 0 :(得分:28)
我认为您需要EnableEvents
对象的Application
属性。当您将EnableEvents
设置为False时,您的代码所做的任何操作都不会触发任何事件,并且其他任何事件代码都不会运行。例如,如果您的代码更改了一个单元格,它通常会触发Change事件或SheetChange事件。但是,如果你像这样构建它
Application.EnableEvents = False
Sheet1.Range("A1").Value = "new"
Application.EnableEvents = True
然后更改A1将不会触发任何事件。
有时必须让代码触发事件代码,有时却不是。如果要阻止它,请使用EnableEvents
。
答案 1 :(得分:3)
这是对@Dick Kusleika答案的重要修改。
关闭EnableEvents设置时,最好包含错误处理以重新启用EnableEvents。如果不这样,并且脚本抛出错误,则更改事件触发器(您的脚本)将停止工作,直到您手动将EnableEvents重新打开为止。
理想情况下,您可以在重新触发更改事件的任何代码之前放置以下行。第一行告诉VBA在遇到错误时转到名为“enableEventsOn”的标签。第二行绕过了更改事件。
On Error Goto enableEventsOn:
Application.EnableEvents = False
然后在重新触发更改事件的代码之后立即放置此代码。这会将更改事件触发器重新打开,并将正常的错误处理返回到您的脚本。
Application.EnableEvents = True
On Error Goto 0
最后,将此代码放在脚本的末尾。这是上面提到的标签。如果在“On Error Goto enableEventsOn:”和“On Error Goto 0”之间遇到错误,则脚本将转到此处并重新打开EnableEvents,并在下次更改工作表时准备好启动脚本。
enableEventsOn:
Application.EnableEvents = True
答案 2 :(得分:0)
我个人认为风险太大。
我使用一个名为“skip_update”的变量,在每个宏的开头设置为“True”,在结束时设置为false。
例如:
dim skip_update as Boolean = False
sub auto_macro_when_modify()
if skip_update == True then
exit sub ' NO CHANGE !
end if
end sub
sub other_macro
skip_update = True
' ( do stuff)
skip_update = False
end sub
答案 3 :(得分:0)
您可以在执行会触发事件例程更改的条目时按住CTRL键。我有一个例程来对给定列中选定范围内的值求和。如果我将光标从第1行拖到第5行,突出显示它们,然后将这些数据的总和保存到剪贴板。此列中单元格中的任何条目都会触发例程。如果我在执行预期操作时按住CTRL键或列中单元格中的任何条目,则不会启动例程。可能无法用于更复杂的ChangeEvent场景。