以下VBA代码段应在单个Excel文件(* .xlsm)中的所有打开的工作簿中执行:
Private Sub Worksheet_Change(ByVal Target As Range)
...
End Sub
我们不希望复制每个工作簿中的代码以减少代码重复。
尝试通过Excel" Macro"创建新的宏时对话框提供了在以下位置找到宏的可能性:
当选择(1)与宏名称组合时,例如"多选" Excel在VBA编辑器中跳转并根据给定名称支持基本方法:
Sub MultiSelect()
...
End Sub
我们的问题:如何保证对" Worksheet_Change"做出反应?这个宏内的事件?
答案 0 :(得分:2)
在“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