所有打开的工作簿中的“Worksheet_Change”事件在一个文件中重新使用VBAmacros
下面的VBA代码片段应该在一个Excel文件(* .xlsm)中的所有打开的工作簿中执行:
Private Sub Worksheet_Change(ByVal Target As Range) ... End Sub
我们不想复制每个工作簿中的代码以减less代码重复。
当试图通过Excel“macros”对话框创build一个新的macros时,它提供了将macros定位在:
- 所有打开的工作簿
- 这个/当前的工作簿
- 当前文件
当select(1)与macros名称组合时,例如“MultiSelect”,Excel将在VBA编辑器中跳转,并根据给定的名称脚手架构build一个基本的方法:
Sub MultiSelect() ... End Sub
我们的问题:如何保证在这个macros中的“Worksheet_Change”事件反应?
在“ Robin Mackenzie ”的帮助下,我发现了一个解决scheme:)尤其是阅读部分中的Application Events In New Class Module帮助。 所以,我创build了一个名为“ 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中的中央代码必须执行 – 以下对象创build脚手架:
Private XLApp As CExcelEvents Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Set XLApp = New CExcelEvents Application.EnableEvents = True End Sub
要防止事件回环,请参阅: 在Excel中,但在个人工作簿中某些单元格更改时运行macros