2017-02-14 4 views
0

Der folgende VBA-Code-Snippet sollte in allen geöffneten Arbeitsmappen in einer einzigen Excel-Datei (* XLSM) ausgeführt werden:Wieder mit einem VBA-Makro mit „Worksheet_Change“ Ereignis in allen geöffneten Arbeitsmappen in einer einzigen Datei

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

Wir möchten den Code nicht in jede Arbeitsmappe kopieren, um die Codeverdopplung zu reduzieren.

Beim Versuch, ein neues Makro über das Excel "Macro" Dialog zu schaffen, es bietet die Möglichkeit, das Makro in suchen:

  1. alle geöffneten Arbeitsmappe
  2. diese/aktuelle Arbeitsmappe
  3. aktuelle Datei

Bei Auswahl von (1) in Kombination mit einem Makronamen, z „Multiselect“ Excel springt in den VBA-Editor und Gerüsten eine grundlegende Methode nach dem angegebenen Namen:

Sub MultiSelect() 
... 
End Sub 

Unsere Frage: Wie auf „Worksheet_Change“ Ereignisse innerhalb dieser Makro gewährleisten reagieren?

+3

http://www.cpearson.com/excel/AppEvent.aspx –

+0

Nach [link] (http://www.cpearson.com/e xcel/Events.aspx) zeigt den Abschnitt "Event Code Location", wo erwähnt wird, dass "_For Blatt (sowohl Arbeitsblatt als auch Diagrammblatt) Level-Ereignisse, die Ereignis Prozedur Code in das Sheet-Modul zu diesem Blatt_ platziert werden muss". Schließlich bedeutet das, dass es in diesem Fall keine Möglichkeit gibt, die Code-Duplizierung zu verhindern? –

+2

Sie können den Ereignishandler in eine separate Arbeitsmappe schreiben, um ein Ereignis auf Anwendungsebene zu behandeln und dieses dann in ein Add-In zu verwandeln. Das ist eine beliebte Wahl für Menschen in Ihrer Situation. –

Antwort

2

Mit Hilfe von "Robin Mackenzie" fand ich eine Lösung :) Vor allem, lesen Abschnitt Application Events In A New Class Module geholfen. So habe ich eine neue Klasse mit dem Namen "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 

und in jedem Arbeitsblatt hinzugefügt - wenn die zentrale Code, der sich in CExcelEvents ausgeführt werden muss - das folgende Objekterstellung Gerüst:

Private XLApp As CExcelEvents 

Private Sub Worksheet_Change(ByVal Target As Range) 
    Application.EnableEvents = False 
    Set XLApp = New CExcelEvents 
    Application.EnableEvents = True 
End Sub 

eventloops Um zu verhindern, finden Sie unter: Run a macro when certain cells change in Excel but from my Personal workbook

Verwandte Themen