2017-06-11 49 views
0

这里是场景。我有多个Excel工作簿,可以相互复制和粘贴数据。所以这个宏的工作原理是从一个工作簿open.copy.close然后open.paste.close到另一个。我正在创建一个函数来在文件关闭时自动运行宏。如何让vba代码只在活动工作簿上运行自动关闭?

这是问题所在,当我单击工作簿1中的宏按钮时,它应该从工作簿2打开.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 

如何编写它在工作簿中的代码只能使这个运行,只有当打开/关闭受宏观时,它的主动/人类用户和关闭不?

谢谢!

回答

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“激活”一个宏。所以这种方法不起作用。另一种方法是在关闭工作簿之前禁用事件;以便事件Workbook_BeforeClose不会触发。之后,您可以根据需要启用事件。代码如下所示:

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

通知,如果你已经在当前的宏观,这是通常建议,那么就没有必要了这个额外的代码的开头已被禁用的事件。

+0

嗨,我试过你的代码,它实质上是我想要做的。但是,它不起作用。我希望它能够在例程'workbook_beforeclose'上运行,只有当包含它的工作簿是'活动工作簿'时。我是否需要激活和停用工作簿,以便宏知道哪个是哪个? – Carmen

+0

@Carmen,本质上,这个想法是,如果你通过'wb1'的代码关闭'wb2',通过激活'wb1',找到一种在关闭'wb2'前关闭它的方法。像'wb1.Activate:wb2.close'。 –

+0

我了解它的技术部分,并从此开始尝试使用它。我已经分别激活了wb1和wb2,并按照建议插入了'wb1.activate:wb2.close',但它仍然不起作用。是否将代码添加到工作簿代码或我的模块/工作表中? '子Workbook_BeforeClose(取消正如布尔) 如果不Application.ActiveWorkbook是我,然后退出子 Application.Run“Sheet12.UpdateGreen_Click” 结束Sub'我得到这个错误,我应该是每个工作簿定义后,即使激活和停用。 – Carmen

相关问题