Application-Ereignisse gelten für die gesamte Anwendung, für alle Fenster, Arbeitsmappen und Tabellenblätter. Um mit Ereignissen des Application-Objekts zu arbeiten, mu� man zuvor eine öffentliche Variable der Objektklasse in einem Klassenmodul definieren und danach ein Objekt der neuen Klasse und darin wieder ein Objekt der Klasse. Letzteres wird wiederum in einem einfachen Modul erstellt.
Was sich zunächst ein wenig kompliziert anhört, ist im Grunde recht einfach zu verwirklichen.
- Man wechselt in den Visual-Basic-Editor und geht auf Einfügen/Klassenmodul. Das Klassenmodul trägt den Namen Klasse1. Diesen wechselt man unter Eigenschaften/Namen in Anwendungsklasse. Dies bietet später eine bessere �bersicht, sollte man noch weitere Klassen definieren.
- Die öffentliche Variable wird definiert. Dazu gibt man folgenden Code ein: Public WithEvents Anwendung As Application. Danach stehen schon die Application-Ereignisse im rechten Listenfeld zur Verfügung. Diese erhält man, wenn man im linken Listenfeld auf "Anwendung" wechselt.
- Nun wird ein Objekt der neuen Klasse definiert. Dies geschieht in einem allgemeinen Modul (Einfügen/Modul):
Dim Anwendungsobjekt As New Anwendungsklasse.
- Nun wird unter der Deklaration des Objekts "Anwendungsobjekt" eine Prozedur erstellt, die der Variablen Anwendung der Anwendungsklasse einen Verweis auf das Anwendungsobjekt zuweist:
Sub ObjektZuordnen()
Set Anwendungsobjekt.Anwendung = Application
End Sub
Ab sofort können alle Ereignisse des Application-Objektes empfangen werden, wenn diese Routine ausgeführt wurde. Damit das neue Objekt immer zur Verfügung steht, sollte der letzte Code in Workbook_Open() der Mappe.
Wir können nun zum Besipiel jeden Blattwechsel in jeder offenen Mappe abfangen (also nicht nur in der mit dem Code), indem wir in das Klassenmodul eintragen:
Private Sub Anwendung_SheetActivate(ByVal Sh As Object)
MsgBox Sh.Name
End Sub
Hinweis:
Um Application-Ereignisse zu deaktivieren, setzt man einfach den Verweis auf das "Anwendungsobjekt" auf Nothing, also Set Anwendungsobjekt.Anwendung = Nothing
Parameter:
Die Application-Ereignisse haben feste Parameter, die mit übergeben werden (im vorigen Code-Beispiel ist das schon an ByVal Sh As Object zu sehen):
Wb: | Stellt die aktive Arbeitsmappe dar. |
Sh: | Steht für das aktive Tabellenblatt. |
Target: | Bezieht sich auf den aktiven Zellenbereich. |
Cancel: | Hat den Wert False. Wird er in der Ereignisprozedur (z. B. bei BeforeSave) auf True gesetzt, wird das Ereignis nicht ausgeführt, sprich es wird nicht gespeichert. U. a. lässt sich so auch gut das Schlie�en einer Mappe abfangen. |
Ereignisse:
Am einfachsten wählt man die natürlich über das Dropdown im Klassenmodul, wie es in der obigen Abbildung dargestellt ist. Hier eine kleine �bersicht:
- Anwendung_NewWorkbook(ByVal Wb As Excel.Workbook)
- Eine neue Arbeitsmappe wurde eingefügt.
- Anwendung_SheetActivate(ByVal Sh As Object)
- Ein anderes Blatt wurde aktiviert (Blattwechsel).
- Anwendung_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Excel.Range, Cancel As Boolean)
- Doppelklick wurde ausgeführt.
- Anwendung_SheetBeforeRightClick(ByVal Sh As Object, ByVal Target As Excel.Range, Cancel As Boolean)
- Klick mit der rechten Maustaste.
- Anwendung_SheetCalculate(ByVal Sh As Object)
- Neuberechnung eines Tabellenblattes.
- Anwendung_SheetChange(ByVal Sh As Object, ByVal Target As Excel.Range)
- Zelleninhalt eines Tabellenblattes wurde verändert.
- Anwendung_SheetDeactivate(ByVal Sh As Object)
- Ein Tabellenblatt wurde verlassen (Blattwechsel).
- Anwendung_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Excel.Range)
- Zellenmarkierung eines Tabellenblattes wurde geändert.
- Anwendung_WindowActivate(ByVal Wb As Excel.Workbook, ByVal Wn As Excel.Window)
- Ein neues Fenster wurde aktiviert (Fensterwechsel).
- Anwendung_WindowDeactivate(ByVal Wb As Excel.Workbook, ByVal Wn As Excel.Window)
- Ein Fenster wurde verlassen (Fensterwechsel).
- Anwendung_WindowResize(ByVal Wb As Excel.Workbook, ByVal Wn As Excel.Window)
- Die Grö�e eines Fensters wurde verändert.
- Anwendung_WorkbookActivate(ByVal Wb As Excel.Workbook)
- Eine neue Arbeitsmappe wurde aktiviert (Arbeitsmappenwechsel).
- Anwendung_WorkbookAddinInstall(ByVal Wb As Excel.Workbook)
- Eine Arbeitsmappe wurde als Add-In installiert.
- Anwendung_WorkbookAddinUninstall(ByVal Wb As Excel.Workbook)
- Eine Arbeitsmappe wurde als Add-In deinstalliert.
- Anwendung_WorkbookBeforeClose(ByVal Wb As Excel.Workbook, Cancel As Boolean)
- Eine Arbeitsmappe soll geschlossen werden.
- Anwendung_WorkbookBeforePrint(ByVal Wb As Excel.Workbook, Cancel As Boolean)
- Eine Arbeitsmappe soll ausgedruckt werden.
- Anwendung_WorkbookBeforeSave(ByVal Wb As Excel.Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)
- Eine Arbeitsmappe soll geschlossen werden.
- Anwendung_WorkbookDeactivate(ByVal Wb As Excel.Workbook)
- Eine Arbeitsmappe wurde verlassen (Arbeitsmappenwechsel).
- Anwendung_WorkbookNewSheet(ByVal Wb As Excel.Workbook, ByVal Sh As Object)
- In einer Arbeitsmappe wurde ein neues Tabellenblatt eingefügt.
- Anwendung_WorkbookOpen(ByVal Wb As Excel.Workbook)
- Eine neue Arbeitsmappe wurde geöffnet.