Modul (allgemeines Modul)
|
In die allgemeinen Module (z.B. "Modul1") eines VBA-Projektes gehört der Hauptcode,
der sich auf die globale Funktionalität der Mappe bzw. des AddIns bezieht. Insbesondere
globale Variablen, die in allen anderen Modulen der Mappe ebenfalls verwendet werden
und UDFs (User defined Functions) - also selbst definierte Funktionen - müssen in
diesen allgemeinen Modulen gespeichert sein, damit sie problemlos in anderen Modulen
aufgerufen und referenziert werden können.
Ein allgemeines Modul ist solange GLOBAL (die darin enthaltenen SUBs und FUNCTIONs
also überall "bekannt" und damit aufrufbar), solange zu Beginn des Moduls nicht die
folgende Zeile enthalten ist :
Option Private Module
Mit dieser Codezeile wird ein Modul als PRIVATE deklariert, so dass die darin enthaltenen
SUBs nur innerhalb dieses Moduls bekannt sind und somit auch nicht über "Extras -
Makros" (Tastenkombination Alt+F8) in Excel gestartet werden können.
|
Global
(in der gesamten Mappe bekannt, solange kein Option Private Module gesetzt wurde)
Weitere Infos in der Excel Onlinehilfe zu "Private"
|
Klassenmodul "DieseArbeitsmappe"
(englisch. : "ThisWorkbook")
|
Im Klassenmodul "DieseArbeitsmappe" werden sog. "Ereignismakros/Ereignisprozeduren"
(engl. : Event procedures) gespeichert, die automatisch ausgelöst/gestartet werden,
wenn ein bestimmtes "Ereignis/Event" eintritt. Ein solches Ereignis kann z.B. Eine
Zelländerung (Bearbeitung), eine Neuberechnung oder einfach das Anklicken/Markieren
einer anderen Zelle oder eines anderen Bereiches sein. Auch das Anklicken per rechter
Maustaste ist ein solches "Ereignis". Für verschiedene Ereignisse stehen eigene Ereignisprozeduren
zur Verfügung, z.B. :
Private Sub Workbook_Open()
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Workbook signalisiert hierbei, dass es sich um Ereignisse handelt, die für die gesamte
Arbeitsmappe gültig sind, Open und SheetChange(...)spezifizieren, um welches Ereignis
es sich handelt. Sh ist das betreffende Sheet (Tabellenblatt) und Target der betreffende
Bereich bzw. die betreffende Zelle in dem das Ereignis ausgelöst wurde. Mit der Anweisung
Msgbox Sh.Name kann bspw. Der Name des Blattes angezeigt werden, in dem das Ereignis
auftrat, mit Msgbox Target.Address wird die Zelladresse dieses Blattes angezeigt,
die das Ereignis auslöste.
|
In der gesamten Arbeitsmappe.
Reagiert auf "Ereignisse" :
z.B. Aktualisierung einer PIVOT-Tabelle, Rechtsklick, Blattwechsel, Zelländerung,
Bei Öffnen, Speichern, Schließen, Drucken einer Mappe etc.
|
Klassenmodul eines Tabellenblattes
|
Jedes Tabellenblatt verfügt ähnlich wie die gesamte Arbeitsmappe über ein eigenes
Klassenmodul, das die Ereignismakros des entsprechenden Tabellenblattes beinhaltet.
Die Anzahl der Ereignisse auf Tabellenblättern ist nicht identisch mit der Anzahl
der Ereignisse der Arbeitsmappe. Diese Ereignisse gelten jeweils nur für das einzelne
Tabellenblatt und NICHT für die gesamte Mappe. Somit können die einzelnen Tabellenblätter
unterschiedliche (auch mehrere) Ereignisse beinhalten, z.B. :
"Tabelle1" soll auf Änderungen im Bereich B5:D10 reagieren :
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B5:D10")) _
Is Nothing Then
MsgBox "Zelle im Bereich wurde geändert !"
End If
End Sub
"Tabelle2" soll auf Rechtsklick reagieren :
Private Sub Worksheet_BeforeRightClick( _
ByVal Target As Range, Cancel As Boolean)
MsgBox "Rechtsklick in Zelle " & Target.Address
Cancel = True 'Kein Kontextmenü anzeigen
End Sub
"Tabelle3" soll bei Aktivierung des Blattes geschützt werden :
Private Sub Worksheet_Activate()
MsgBox "Blatt wurde deaktiviert !"
ActiveSheet.Protect userinterfaceonly:=True
End Sub
Die Klassenmodule der einzelnen Tabellenblätter werden in Foren häufig auch "Codemodule
des Blattes" genannt.
Die Klassenmodule der Tabellenblätter erreicht man entweder :
Direkt im VB-Editor :
- Durch Doppelklick auf das Tabellenblatt im Projekt-Explorer des VBA-Editors (Blattname
ist dann blau/grau unterlegt und der Name erscheint im Eigenschaftenfenster)
Oder (aus der Excel-Tabelle heraus) :
- Rechtsklick auf den Namen des Tabellenblattes im Blattregister unten, dann "Code
anzeigen,,,," auswählen
=> Klassenmodul wird im VB-Editor angezeigt
|
Gültig nur für Ereignisse jedes EINZELNEN Tabellenblattes, das den Code enthält.
|
Eigene Klassenmodule
|
In eigenen Klassenmodulen (meist mit dem Prefix cls benannt, clsCheckbox etc.) kann
man für verschiedene Excel-Objekte eigene Ereignisse programmieren die man z.B. für
alle Instanzen dieser Klasse verwenden kann. Dieses etwas komplexe Thema lässt sich
anhand eines kleinen Beispiels erklären :
Für jede Checkbox auf einem Tabellenblatt soll ein bestimmtes Ereignis (z.B. bei
Anklicken) automatisch ausgelöst werden.
(Codebeispiel folgt später...)
|
Je nach individueller Programmierung.
Generell jedoch innerhalb des gesamten VBA-Projektes der Mappe.
|
Klassenmodul von UserForms
|
Auch die UserForms enthalten jeweils ein eigenes Klassenmodul in das der Hauptcode
für alle Steuerelemente des entsprechenden Userforms gespeichert wird. Jedes Steuerelement
(Comboboxen, Textboxen, Optionbuttons, Commandbuttons etc.) enthält verschiedene
Ereignisse, die in der deklarierenden Datei (Library, OCX, DLL, TLB etc.) enthalten
sind. Die am häufigsten verwendeten (Standard-)Steuerelemente befinden sich in der
Datei FM20.DLL, in der die entsprechenden Ereignisse dieser Steuerelemente definiert
sind. Per Doppelklick auf ein Stuerelement (oder auch direkt auf das UserForm) gelangt
man in das Klassenmodul des UserForms und dort direkt in den Standard-Ereignis-Code
des angeklickten Steuerelementes.
|
Nur innerhalb des Userforms.
Ereignisse des UserForms und der Steuerelemente innerhalb des UserForms.
Besonderheit :
Ereignisse in UserForms können NICHT per
Application.
EnableEvents=False
deaktiviert werden !
|
Externe Klassenmodule/Libraries
|
Auch in externen Libraries, die z.B. per Visual Studio programmiert wurden, können
Klassenmodule enthalten sein, die im VBA-Editor per "Extras - Verweise" referenziert
werden können.
|
Im gesamten VBA-Projekt
|