使用" Worksheet_Change"重新使用VBA宏。单个文件中所有打开的工作簿中的事件

时间:2017-02-14 08:18:01

标签: excel vba excel-vba

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

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

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

尝试通过Excel" Macro"创建新的宏时对话框提供了在以下位置找到宏的可能性:

  1. 所有打开的工作簿
  2. 此/当前工作簿
  3. 当前档案
  4. 当选择(1)与宏名称组合时,例如"多选" Excel在VBA编辑器中跳转并根据给定名称支持基本方法:

    Sub MultiSelect()
    ...
    End Sub
    

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

1 个答案:

答案 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