© 2005 - 2012 : NoNet - www.excelei.de

Eine Webseite für EXCEL-Freunde mit Beispielen, Tutorials, Downloads etc. von NoNet


PayPal: Spenden

Makros/VBA-Code einer Mappe werden in eigens dafür vorgesehenen "Containern" gespeichert, die man "Module" nennt. Je nach Zweck bzw. Gültigkeit des VBA-Codes kann das VBA-Projekt daher in verschiedene Module unterteilt werden.






VBA Klassenmodule

VBA Klassenmodule

Meldung in Excel 2003

Meldung in Excel 2007

Klassenmodul des Tabellenblattes

Name des Objektes / Moduls

Verwendungszweck

Gültigkeit

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
    Rechtsklick im Blattregister unten - Code anzeigen...

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

Beispiel : Klassenmodul eines Tabellenblattes :

Test : Klassenmodul eines Tabellenblattes