由 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 trigger 和 Worksheet_Activate
事件中找不到任何相同的提及。
对于可重现的示例,请创建一个包含两个 sheet 的工作簿,Sheet1
和 Sheet2
,并在 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
在 VBA 中对基于 sheet 上的公式复制粘贴范围进行操作的模块进行编程时,当前激活的 sheet 的 Worksheet_Activate
事件被触发。
我知道我可以使用 Application.EnableEvents = False
来禁用触发器,但是,我想了解为什么 Range
对象的 PasteSpecial
操作会触发 Worksheet_Activate
方法,因为我在 Range.PasteSpecial documentation, or what actions trigger 和 Worksheet_Activate
事件中找不到任何相同的提及。
对于可重现的示例,请创建一个包含两个 sheet 的工作簿,Sheet1
和 Sheet2
,并在 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