由 PasteSpecial 操作触发的激活事件

Activation event getting triggered by PasteSpecial operation

在 VBA 中对基于 sheet 上的公式复制粘贴范围进行操作的模块进行编程时,当前激活的 sheet 的 Worksheet_Activate 事件被触发。

我知道我可以使用 Application.EnableEvents = False 来禁用触发器,但是,我想了解为什么 Range 对象的 PasteSpecial 操作会触发 Worksheet_Activate 方法,因为我在 Range.PasteSpecial documentation, or what actions triggerWorksheet_Activate 事件中找不到任何相同的提及。

对于可重现的示例,请创建一个包含两个 sheet 的工作簿,Sheet1Sheet2,并在 Sheet1 中插入代码:

Public Sub Worksheet_Activate()

    MsgBox "Sheet 1 has been activated."

End Sub

添加一个单独的模块,代码如下:

Public Sub copy_and_paste_in_sheet2()

    Set Rng1 = ThisWorkbook.Worksheets("Sheet2").Range("A1:A10")
    Rng1.Copy

    Set rng2 = ThisWorkbook.Worksheets("Sheet2").Range("B2:B12")
    rng2.PasteSpecial xlPasteFormulas

End Sub

同时Sheet1被激活,运行copy_and_paste_in_sheet2宏,显然Worksheet_Activate事件for Sheet1 尽管在第二个模块中没有明显的代码明确这样做,但仍被触发。

我希望尽管使用需要 Activate 命令才能工作的 Select 操作,但理想情况下 PasteSpecial 操作不应触发 Worksheet_Activate 事件。能否请您指导我查看此行为的相关文档?

这似乎是您在处理 Excel 时可能遇到的奇怪事情之一:PasteSpecial 快速 "activates" 您要粘贴到的 sheet。您可以看到屏幕闪烁(至少我可以看到,使用的 VM 在屏幕更新方面相当慢)。此外,如果您将类似的事件代码放入 sheet2,您将看到它也会被触发。

奇怪的是,在触发的 sheet 中,您仍然看到 sheet1 为 ActiveSheet。所以下面的代码(作为 Sheet2 的事件例程)将打印 "activate 2 Sheet1"

Public Sub Worksheet_Activate()
     Debug.Print "activate 2 " & ActiveSheet.Name
End Sub

我怀疑您是否会找到该行为的任何文档。你最好的选择是接受这个并且(正如你已经写过的那样)使用 Application.EnableEvents = False