所有打开的工作簿中的“Worksheet_Change”事件在一个文件中重新使用VBAmacros

下面的VBA代码片段应该在一个Excel文件(* .xlsm)中的所有打开的工作簿中执行:

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

我们不想复制每个工作簿中的代码以减less代码重复。

当试图通过Excel“macros”对话框创build一个新的macros时,它提供了将macros定位在:

  1. 所有打开的工作簿
  2. 这个/当前的工作簿
  3. 当前文件

当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