17

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

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

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

这是更改事件的代码。

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

4 回答 4

43

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

Application.EnableEvents = False
    Sheet1.Range("A1").Value = "new"
Application.EnableEvents = True

然后更改 A1 不会触发任何事件。

有时让您的代码触发事件代码是有益的,有时则不然。EnableEvents当你想阻止它时使用。

于 2013-04-02T13:03:33.230 回答
12

这是对@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
于 2016-08-18T01:15:11.720 回答
1

在我个人看来太冒险了。

我会使用一个名为“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
于 2013-04-02T10:24:37.930 回答
0

您可以在执行将触发事件例程更改的输入时按住 CTRL 键。我有一个例程来对给定列中选定范围内的值求和。如果我将光标从第 1 行拖到第 5 行,突出显示它们,则这些总和将保存到剪贴板。此列中单元格中的任何条目都会触发该例程。如果我在执行预期操作或列中单元格中的任何条目时按住 CTRL 键,则不会启动例程。可能不适用于更复杂的 ChangeEvent 场景。

于 2017-06-29T15:20:45.107 回答