如何使vba代码仅在活动工作簿上运行自动关闭?

时间:2017-06-11 15:52:15

标签: excel vba excel-vba

这是场景。我有多个excel工作簿,可以相互复制和粘贴数据。因此宏工作从open.copy.close从一个工作簿,然后open.paste.close到另一个工作簿。我正在创建一个函数,以便在文件关闭时自动运行宏。

这就是问题所在,当我点击工作簿1中的宏按钮时,应该从工作簿2中打开open.copy.close。但是,由于工作簿2中文件关闭时的自动运行,将发生错误(2个宏无法同时运行)任何解决方案?我正在寻找一个解决方案只有当文件关闭时自动运行宏如果它是一个活跃的工作簿。这就是我现在所拥有的:

Workbook 1
Sub workbook_beforeclose(cancel As Boolean)
Application.Run "Sheet1.UpdateYellowTabs_Click"

End Sub

Workbook 2
Sub Workbook_BeforeClose(Cancel As Boolean)
Workbook.BeforeClose
Application.Run "Sheet12.UpdateGreen_Click"
End Sub

如何在工作簿代码中对其进行编码,以便仅在人工用户激活/关闭时才运行,而不是在宏打开/关闭时运行?

谢谢!

1 个答案:

答案 0 :(得分:0)

嗯,我不确定从中了解你的最终目标,但我可以回答"技术"题。从技术上讲,如果要检查给定的工作簿是否处于活动状态:If Application.ActiveWorkbook Is Me

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  If Not Application.ActiveWorkbook Is Me Then Exit Sub ' <-- add this test

  ''''''''''''''''''''''''''
  ' Whatever code goes here
  ''''''''''''''''''''''''''
End Sub

修改

但问题是,调用wb2.close会使工作簿wb2成为&#34;活跃的&#34;一个在执行宏期间。所以这种方法不起作用。另一种方法是在关闭工作簿之前禁用事件;以便事件Workbook_BeforeClose不会触发。之后,您可以根据需要启用事件。代码如下所示:

' ... open wb2 and do the work with it
Application.EnableEvents = False
wb2.Close False
Application.EnableEvents = True

请注意,如果您已经在当前宏的开头禁用了事件(通常建议使用),则不需要此附加代码。