在单个文件中的所有打开的工作簿中重新使用带有“Worksheet_Change”事件的 VBA 宏

Posted

技术标签:

【中文标题】在单个文件中的所有打开的工作簿中重新使用带有“Worksheet_Change”事件的 VBA 宏【英文标题】:Re-using a VBA macro with "Worksheet_Change" event in all open workbooks in a single file 【发布时间】:2017-02-14 08:18:00 【问题描述】:

应在单个 Excel 文件 (*.xlsm) 内的所有打开的工作簿中执行以下 VBA 代码 sn-p:

Private Sub Worksheet_Change(ByVal Target As Range)
...
End Sub

我们不希望复制每个工作簿中的代码以减少代码重复。

当尝试通过 Excel 的“宏”对话框创建新宏时,它提供了将宏定位到以下位置的可能性:

    所有打开的工作簿 此/当前工作簿 当前文件

在选择(1)与宏名称结合时,例如, “MultiSelect” Excel 在 VBA 编辑器中跳转并根据给定名称搭建一个基本方法:

Sub MultiSelect()
...
End Sub

我们的问题:如何保证对这个宏中的“Worksheet_Change”事件做出反应?

【问题讨论】:

cpearson.com/excel/AppEvent.aspx 在link之后显示“事件代码位置”部分,其中提到“对于工作表(工作表和图表工作表)级别的事件,事件过程代码必须放在工作表中与该工作表关联的模块”。最后,这是否意味着在这种情况下无法防止代码重复? 您可以在单独的工作簿中编写事件处理程序来处理应用程序级事件,然后将其转换为加载项。对于处于您这种情况的人来说,这是一个受欢迎的选择。 知道了 :) 它正在工作 :) 感谢您的帮助!尤其是阅读Application Events In A New Class Module 很有帮助。 单一问题:“App_SheetChange”事件过程被调用了两次。我们可以防止这种情况发生吗? 【参考方案1】:

在“Robin Mackenzie”的帮助下,我找到了解决方案:) 特别是阅读Application Events In A New Class Module 部分很有帮助。因此,我创建了一个名为“CExcelEvents”的新类:

Private WithEvents App As Application

Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    'gets the code more robust when the SheetChange event is called twice
    If Me.EnableEvents = False Then
        Exit Sub
    End If

    Application.EnableEvents = False
    ...//code to centralize
    Application.EnableEvents = True
    Me.EnableEvents = False
End Sub

Private Sub Class_Initialize()
    'setting a variable for this object
    Me.EnableEvents = True
    Set App = Application
End Sub

并在每个工作表中添加 - CExcelEvents 中的中心代码必须执行 - 以下对象创建脚手架:

Private XLApp As CExcelEvents

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    Set XLApp = New CExcelEvents
    Application.EnableEvents = True
End Sub

要防止事件循环,请参阅:Run a macro when certain cells change in Excel but from my Personal workbook

【讨论】:

以上是关于在单个文件中的所有打开的工作簿中重新使用带有“Worksheet_Change”事件的 VBA 宏的主要内容,如果未能解决你的问题,请参考以下文章

请参阅其他工作簿中的 UDF 参数说明

如何在保存到 OneDrive 的 Excel 工作簿中运行 SQL 查询?

有没有办法将 excel 工作簿中的单个工作表导出到使用 pandas 分隔 csv 文件?

运行带有排除项的宏多张工作表

将 Excel 工作簿中的所有图表导出到 windows 文件夹

自动更新外部工作簿中的值