VBA工作表更改事件绕过?

时间:2013-04-02 10:14:30

标签: vba excel-vba worksheet excel

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

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

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

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

4 个答案:

答案 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场景。