【问题标题】:How to make vba code to run auto-close only on active workbook?如何使 vba 代码仅在活动工作簿上运行自动关闭?
【发布时间】:2017-06-14 02:11:40
【问题描述】:

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

这是问题所在,当我单击工作簿 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

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

谢谢!

【问题讨论】:

    标签: vba excel


    【解决方案1】:

    好吧,我不确定从中了解您的最终目标,但我可以回答“技术”问题。从技术上讲,如果您想检查给定的工作簿是否处于活动状态: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
    

    注意,如果您已经在当前宏的开头禁用了事件(通常建议这样做),则不需要此额外代码。

    【讨论】:

    • 嗨,我已经尝试过你的代码,它本质上就是我想要做的。但是,它不起作用。我希望它仅在包含它的工作簿是“活动工作簿”时才运行workbook_beforeclose 例程。我是否需要激活和停用工作簿,以便宏知道哪个是哪个?
    • @Carmen,本质上,这个想法是,如果您通过来自wb1 的代码关闭wb2,请找到一种在关闭它之前停用wb2 的方法,即激活wb1。类似wb1.Activate : wb2.close
    • 我了解它的技术部分,并且从那以后一直在试验它。我已经分别激活了 wb1 和 wb2 并按照建议插入了wb1.activate : wb2.close,但它仍然无法正常工作。我是否将代码添加到工作簿代码或我的模块/工作表中? Sub Workbook_BeforeClose(Cancel As Boolean) If Not Application.ActiveWorkbook Is Me Then Exit Sub Application.Run "Sheet12.UpdateGreen_Click" End Sub 即使我在每个工作簿中定义了应该激活和停用的内容,我仍然收到错误。
    • @Carmen 我认为问题可能很简单。如果您在关闭 wb2 之前禁用事件,则事件 Workbook_BeforeClose 将不会触发。 Application.EnableEvents = False: wb2.Close false: Application.EnableEvents = True
    • 谢谢!!我目前正在查看它是否有效。可能会有一点延迟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 2019-01-23
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多