在单个文件中的所有打开的工作簿中重新使用带有“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 宏的主要内容,如果未能解决你的问题,请参考以下文章
如何在保存到 OneDrive 的 Excel 工作簿中运行 SQL 查询?
有没有办法将 excel 工作簿中的单个工作表导出到使用 pandas 分隔 csv 文件?