Hinweise zu den Beispielen finden Sie hier: Home: VBA-Beispiele
Kategorien: Basics ▸ Ereignisse und Ereignisse ▸ Basics
Ereignisprozeduren sind Makros, die als Reaktion auf bestimmte Ereignisse ausgeführt werden. Der Begriff „Ereignis“ kann weit gedehnt werden, primär sind allerdings gerade die Ereignisse von Interesse, die beim Arbeiten mit Steuerelementen, Tabellen und Arbeitsmappen eintreten können.
Mit Excel97 erhielten Ereignisprozeduren ein völlig neues System. Während man unter Excel 5/7 noch über die On-Event-Eigenschaft oder über die Methoden der Objekte Prozeduren zuwies, sind diese seit Excel97 in der Entwicklungsumgebung fester Bestandteil der Objekte. Dies erleichtert erstens den Überblick über die Ereignisprozeduren und zweitens müssen die Zuordnungen zwischen Prozedur und Ereignis nicht immer neu hergestellt werden, da diese nun fest an das jeweilige Objekt gebunden sind. Auch kann man nun durch die einfache Übergabe von Parametern, die Caller-Eigenschaft, die man unter Excel 5/7 immer wieder einsetzen musste, verzichten.
Die erste Frage, die auftaucht, ist: Wo finde ich diese Ereignisprozeduren überhaupt?
Es wird zwischen 5 Objektereignissen unterschieden:
Kategorien: Basics ▸ Ereignisse und Ereignisse ▸ Basics
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.
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
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. |
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:
Kategorien: Basics ▸ Ereignisse und Ereignisse ▸ Basics
Bei den Workbook-Ereignissen trifft eingeschränkt das zu, was bei den Application-Ereignissen steht. Der markanteste Unterschied ist, dass Workbook-Ereignisse - wie der Name schon sagt - nur die Elemente der Mappe mit dem Code betreffen und dass wir hier kein Klassenmodul einfügen müssen.
Im Visual-Basic-Editor (Alt & F11) reicht es, im Projektfenster auf Diese Arbeitsmappe doppelzuklicken und dann von Allgemein auf Workbook zu wechseln. Nun stehen im rechten Drop-Down-Feld die Ereignisse zur Verfügung:
Bei verschiedenen Prozeduren werden auch Parameter übergeben. Diese verhalten sich wie folgt:
Cancel: | Die Boolsche Variable steht standardmäßig auf False. Setzt man sie auf True, wird das Ereignis nicht mehr ausgeführt. So kann man z. B. das Schließen der Arbeitsmappe verhindern, indem man Cancel = True innerhalb der Prozedur BeforeClose setzt. |
Sh: | Sh steht für das aktive Tabellenblatt. Man beachte auch die Eigenschaften und Methoden, die Sh zur Verfügung stehen. So erhält man z.B. über Sh.Name den Namen des aktiven Blattes. |
Target: | Target steht für den aktiven Bereich und wird häufig dazu benutzt, um den Bereich zum Ausführen eines bestimmten Makros zu bestimmen. So kann man mit: If Target.Address = $A$1 erreichen, daß das Makro nur dann ausgeführt wird, wenn die Zelle A1 aktiv ist. |
Wn: | Stellt das aktive Fenster dar. |
Kategorien: Basics ▸ Ereignisse und Ereignisse ▸ Basics
Wie der Name schon sagt, geht es bei den Worksheet-Ereignissen um Aktivitäten in Bezug auf das einzelne Tabellenblatt.
Im Visual-Basic-Editor (Alt & F11) wird dazu im Projektfenster auf die jeweilige Tabelle doppelt geklickt und dann von "Allgemein auf "Worksheet gewechselt. Nun stehen im rechten Drop-Down-Feld die Ereignisse zur Verfügung.
Im Gegensatz zu den Workbook-Ereignissen, welche bei allen Tabellenblättern auftreten, sind die Worksheet-Ereignisse an das Tabellenblatt gebunden, indem sie stehen.
Bei verschiedenen Prozeduren werden auch Parameter übergeben. Diese verhalten sich wie folgt:
Cancel: | Die Boolsche Variabel steht standardmäßig auf False. Setzt man sie auf True, wird das Ereignis nicht mehr ausgeführt. So kann man z. B. das Öffnen des Auswahlmenüs verhindern, indem man Cancel = True innerhalb der Prozedur "BeforeRightClick setzt. |
Target: | Target steht für den aktiven Bereich und wird häufig dazu benutzt, um den Bereich zum Ausführen eines bestimmten Makros zu bestimmen. So kann man mit: If Target.Address = $A$1 erreichen, daß das Makro nur dann ausgeführt wird, wenn die Zelle A1 aktiv ist. |
Kategorien: Basics ▸ Ereignisse und Ereignisse ▸ Basics
Die OnEvent-Methoden können in jeder beliebigen Prozedur stehen. Normalerweise stehen sie jedoch im Workbook_Open-Ereignis und sollten vor dem Beenden der Mappe mit z. B. Application.OnKey "" wieder entschärft werden. Durch die Zeichenfolge "" werden die OnEvents deaktiviert.
Kategorien: Basics ▸ Ereignisse und Ereignisse ▸ Basics
Um Chartereignisse nutzen zu können, muss man vorher ein Klassenmodul erstellen. Dieses ist im Gegensatz zu den Application-Ereignissen jedoch recht einfach zu bewerkstelligen.
Gehen Sie im Visual-Basic-Editor auf Einfügen ▸ Klassenmodul und geben folgendes ein:
Public WithEvents Diagramm As Chart
Um alles übersichtlicher zu gestalten, sollte man der Klasse den Namen Diagrammklasse geben (unter Eigenschaften/Namen). Nun stehen in der linken Drop-Down-Liste die neue Klasse und in der rechten die dazugehörigen Eigenschaften zur Verfügung. Damit die Ereignisprozeduren ausgeführt werden, muss man nun das Diagramm der Diagrammklasse zuordnen. Dies geschieht in einem beliebigen Modul durch folgenden Code:
Dim MeinDiagramm As New Diagrammklasse Sub DiagrammZuordnen() Set MeinDiagramm.Diagramm = Worksheets(1).ChartObjects(1).Chart End Sub
Wie man erkennen kann, übergeben auch die Chartereignisse Parameter. Da man nun allerdings eine Klasse definiert hat, sind diese derart vielfältig, dass sie hier nicht aufgeführt werden. Sie sind aber in der Online-Hilfe ausreichend erklärt.