VBA-Klassenmodul-Tutorial und Beispiele

In diesem Tutorial erfahren Sie mehr über Klassenmodule in VBA. Sie erfahren, was sie sind und wie Sie sie verwenden.

VBA-Klassenmodule - Einführung

Wenn Sie Module in den Visual Basic Editor (VBE) einfügen, um Ihren Code einzugeben, haben Sie vielleicht bemerkt, dass Sie auch ein sogenanntes "Klassenmodul" einfügen können.

Klassenmodule vs. Module

Die Klassenmodule funktionieren ganz anders als die gewöhnlichen Module, da sie das Erstellen eines Component Object Model (COM) erleichtern, das dann in Ihrem normalen VBA-Code verwendet werden kann

Effektiv erstellen Sie ein Objekt, das genauso funktioniert wie ein eingebautes Excel-Objekt, wie z. B. „Arbeitsblätter“. Im Worksheets-Objekt haben Sie eine Reihe von Eigenschaften und Methoden, mit denen Sie die Anzahl der Arbeitsblätter innerhalb einer Arbeitsmappe oder jeden einzelnen Namen eines Arbeitsblatts oder zahlreiche andere Informationen abrufen können

Wenn Sie auf diese Weise ein neues Objekt erstellen, erstellen Sie einen Baustein, der überall in VBA verwendet werden kann. Das Objekt verfügt über eine Reihe von Eigenschaften und Methoden, auf die Ihr VBA-Code von überall in der Arbeitsmappe aus zugreifen kann, ohne den Code immer wieder neu schreiben zu müssen.

Sie können nicht nur von einem Standard-VBA-Modul aus auf Ihr neues Objekt verweisen, sondern es auch im Code hinter einer UserForm verwenden, die Teil Ihrer benutzerdefinierten Anwendung ist

Sie können es auch verwenden, wenn Sie Active-X-Steuerelemente auf einem Arbeitsblatt platziert haben, z. B. eine Befehlsschaltfläche oder ein Dropdown-Menü. Diese Steuerelemente verwenden alle VBA, und Ihr neues Objekt kann problemlos in den Ereigniscode für diese Steuerelemente integriert werden.

Sie können Ihr Objekt auch in ein Excel-Add-In umwandeln. Ihr Objekt steht automatisch anderen Benutzern zur Verfügung, die dieses Add-In geladen haben. Dadurch wird Ihre Excel-Anwendung um Ihre eigene mehrschichtige Architektur erweitert

Excel ist eine mehrschichtige Anwendung. Es gibt die Client-Services-Schicht, die das eigentliche Arbeitsblattfenster steuert, mit dem der Benutzer vertraut ist. Das Excel-Objektmodell ist die nächste Ebene darunter. Drücken Sie F2 in einem VBA-Modul und Sie können die große Anzahl von Objekten und Mitgliedern dieser Objekte sehen, die die Engine von Excel sind. Beachten Sie, dass Ihr neues Objekt auch hier angezeigt wird.

Schließlich befindet sich darunter die Datendienstschicht, die alle Daten enthält, die Sie in die Arbeitsblätter und Zellen eingegeben haben. Excel greift darauf über das Excel-Objektmodell zu.

Durch das Erstellen eines Klassenmoduls können Sie das Excel-Objektmodul mit Ihren eigenen benutzerdefinierten Objekten und Elementen erweitern

In diesem Artikel wird erläutert, wie Sie mithilfe von Klassenmodulen eine einfache Hierarchie von Objekten erstellen.

Vorteile der Verwendung von Klassenmodulen

  1. Sie können einen robusten Baustein entwickeln, der in einer Vielzahl unterschiedlicher Excel-Anwendungen verwendet werden kann
  2. Sobald es gründlich getestet wurde, liefert es immer die richtigen Ergebnisse, genauso wie die integrierten Excel-Objekte
  3. Wenn Code an anderer Stelle in der Anwendung aktualisiert wird, funktioniert das neue Objekt weiterhin auf die gleiche Weise.
  4. Sie können Ihr neues Objekt in anderen Excel-Anwendungen als Add-In verwenden
  5. Die Objekte können in anderen Anwendungen wiederverwendet werden und helfen beim Debuggen

Nachteile der Verwendung von Klassenmodulen

  1. Sie können schwer zu erstellen und zu verstehen sein.
  2. Namenskonventionen sind sehr wichtig, da Sie dies sehen, wenn Sie Ihr Objekt in einem normalen Modul verwenden.
  3. Wenn Sie noch kein Klassenmodul erstellt haben, können diese schwer zu verstehen sein und es gibt eine steile Lernkurve
  4. Änderungen zur Laufzeit nicht möglich - Sie müssen das Projekt neu einstellen.
  5. Wenn Eigenschaften und private Variablen denselben Namen haben, können Endlosschleifen auftreten, die zu Fehlern führen

Einfügen eines Klassenmoduls

Wählen Sie Einfügen | Klassenmodul aus dem VBE-Menü (Visual Basic Editor). Das neue Klassenmodul wird automatisch „Klasse 1“ genannt, aber dies muss sofort in den Namen geändert werden, den Sie für Ihr Objekt verwenden werden

Sie ändern den Namen im Eigenschaftenfenster, auf das der Pfeil zeigt. Sie geben einfach Ihren neuen Namen ein, und dieser ändert sich in der Sammlung Klassenmodule

Wenn das Eigenschaftenfenster nicht sichtbar ist, wählen Sie Ansicht | Eigenschaften im VBE-Menü oder drücken Sie F4

Rufen Sie Ihr neues Klassenmodul „MyItem“ auf und doppelklicken Sie auf den Namen in der Baumansicht im Projekt-Explorer, um das Codefenster dafür anzuzeigen.

Erstellen eines Objektelements

In diesem Beispiel wird ein Objekt der obersten Ebene namens „MyItems“ mit einem darunter liegenden Mitgliedsobjekt namens „MyItem“ erstellt, das die individuellen Daten für jedes Element enthält. Einmal erstellt, funktioniert es genauso wie ein eingebautes Excel-Objekt. Zum Beispiel gibt es ein Objekt namens "Worksheets", das eine Sammlung jedes Arbeitsblatts in Ihrer Arbeitsmappe ist. Es gibt auch ein Objekt namens "Sheet", das jedes einzelne Arbeitsblatt in Ihrer Arbeitsmappe darstellt und alle Eigenschaften und Methoden für jedes Arbeitsblatt enthält. Dieses Objekt bezieht sich auf das Sammlungsobjekt „Arbeitsblätter“.

Sie können die Sammlung „Arbeitsblätter“ durchlaufen und jedes „Blatt“ der Reihe nach anzeigen. Auf dieselbe Weise können Sie die Sammlung „MyItems“ durchlaufen und die Eigenschaften anzeigen, die Sie im Mitglied „MyItem“ erstellt haben.

Als erstes müssen Sie das Unterobjekt für die Mitgliederebene erstellen, das die tatsächlichen Elemente in der Sammlung des Objekts der obersten Ebene enthält. Dies ist das Äquivalent der Elemente (z. B. Name, Sichtbar, Anzahl) innerhalb des "Tabellen"-Objekts in Excel. Dieser Code wird in das Klassenmodul namens "MyItem" eingegeben.

Klassenmodule haben Eigenschaften und Methoden. Eigenschaften sind praktisch wie Variablen, da sie Datenwerte wie Variablen enthalten, und Methoden sind wie Unterroutinen oder Funktionen.

Im Unterobjekt werden wir zwei Eigenschaften für das Objekt erstellen - Item und Detail

Zunächst müssen zwei String-Variablen deklariert werden, die die Werte für die Eigenschaften enthalten:

12 Privates mItem als StringPrivates mDetail als String

Diese müssen im Abschnitt Deklarationen am Anfang des Codes für das Klassenmodul deklariert werden, damit sie in allen Unterroutinen im gesamten Modul verwendet werden können

Sie müssen eindeutige Namen erhalten, um sie von den Eigenschaften zu unterscheiden, die wir erstellen werden. Daher wurde vor jedem Namen ein „m“ (für Mitglied) gesetzt.

Die Variablen werden als Private deklariert, sodass sie von niemandem gesehen werden können, der das Objekt verwendet. Sie sind Arbeitsvariablen zur Verwendung innerhalb des Objektcodes und nicht als Teil des endgültigen Objekts vorhanden.

Der nächste Schritt besteht darin, Code einzurichten, um Zugriff auf die beiden Eigenschaften zu gewähren. Sie tun dies mit Hilfe einer Property Let- und einer Property Get-Anweisung für jede Eigenschaft. Diese müssen öffentlich sein, sonst hat das Objekt der obersten Ebene keine sichtbaren Eigenschaften

123456789101112131415 Öffentliche Eigenschaft Let Item (vdata als String)mItem = vdataEnd-EigenschaftÖffentliche Eigenschaft Get Item () As StringArtikel = mArtikelEnd-EigenschaftÖffentliche Eigenschaft Let-Detail (vdata als String)mDetail = vdataEnd-EigenschaftÖffentliche Eigenschaft Details abrufen () als ZeichenfolgeDetail = mDetailEnd-Eigenschaft

Dieser Code erstellt die Mittel zum Lesen und Schreiben von Werten in die beiden Eigenschaften (Item und Detail) unter Verwendung der beiden privaten Variablen, die im Deklarationsabschnitt des Moduls definiert wurden.

Der Parameter ‚vdata‘ wird verwendet, um Daten an die betreffende Eigenschaft zu übergeben.

Wichtig ist, dass jede Eigenschaft eine 'Let'- und eine 'Get'-Anweisung hat und der Eigenschaftsname in jedem Fall gleich ist. Sie könnten am Ende zwei verschiedene Eigenschaften haben, wenn Sie falsch geschrieben werden - eine, aus der Sie lesen können, und eine, in die Sie schreiben können!

Um beim Erstellen dieses Codes zu helfen, können Sie Insert | . verwenden Verfahren im VBE-Menü zum Erstellen eines Code-Skeletts, das den Anfangscode für die Eigenschaften "Get" und "Let" für einen bestimmten Eigenschaftsnamen erstellt

Dadurch wird ein Popup-Fenster angezeigt, in dem Sie den Eigenschaftsnamen eingeben und in den Optionsfeldern „Eigenschaft“ auswählen:

Klicken Sie auf „OK“ und der Skelettcode wird dem Klassenmodul hinzugefügt:

1234567 Öffentliche Eigenschaft Get MyProperty() als VarianteEnd-EigenschaftÖffentliche Eigenschaft Let MyProperty(ByVal vNewValue As Variant)End-Eigenschaft

Dies verhindert Fehler bei den Namen von Eigenschaften. Sie fügen Ihren Code einfach zwischen den Anweisungen „Public Property“ und „End Property“ ein.

Sie haben jetzt ein Objekt namens "MyItem", das alle Daten für diese Übung enthält.

Sind Sie es leid, nach VBA-Codebeispielen zu suchen? Probieren Sie AutoMacro aus!

Erstellen einer Sammlung

Der nächste Schritt besteht darin, ein Objekt der obersten Ebene als Collection-Objekt zu erstellen, um Zugriff auf die Eigenschaften zu gewähren, die Sie im 'MyItem'-Objekt eingerichtet haben

Auch hier müssen Sie ein Arbeitsobjekt definieren, das als Sammlungsobjekt fungiert, genauso wie Sie die beiden String-Variablen im 'MyItem'-Objekt definiert haben.

1 Private mItems als Sammlung

Auch dieses muss einen eindeutigen Namen haben, weshalb dem Namen ein 'm' (Mitgliedsobjekt) vorangestellt ist, und es wird auch als 'Privat' deklariert, damit es nicht erscheint, wenn das neue Objekt erstellt wird Gebraucht

Als Nächstes müssen Sie den Class_Initialize-Code auffüllen. Dies wird ausgeführt, wenn Sie das Objekt zum ersten Mal in Ihrem Code verwenden, und es bestimmt, welche Werte in das Objekt geladen werden

Sie können auf diese Unterroutine zugreifen, indem Sie im ersten Dropdown-Menü „Klasse“ und im zweiten Dropdown-Menü des Modulfensters „Initialisieren“ auswählen

12345678910 Private Unterklasse_Initialize()ObjItem als MyItem dimmenmItems einstellen = Neue SammlungFür n = 1 bis 3Set objItem = Neues MyItemobjItem.Item = Worksheets("Sheet1").Range("a" & n).WertobjItem.Detail = Worksheets("Sheet1").Range("b" & n).WertmItems.Objekt hinzufügenNächste NrEnd Sub

Der Code richtet ein Objekt namens „objItem“ ein, indem die Definition von „MyItem“ verwendet wird, die wir zuvor als Klassenmodul erstellt haben.

Es erstellt dann eine neue Sammlung basierend auf dem zuvor definierten 'mItems'-Objekt

Es durchläuft die in Sheet1 der Arbeitsmappe gespeicherten Werte und fügt sie in die Eigenschaften ein, die wir für das Objekt "MyItem" erstellt haben. Beachten Sie, dass bei der Verwendung von „objitem“ eine Dropdown-Liste mit den beiden Eigenschaften angezeigt wird, genau so, als ob Sie ein integriertes Excel-Objekt verwenden würden.

Das Item-Objekt wird dann dem Collection-Objekt hinzugefügt, das nun alle Daten in den Eigenschaftswerten enthält.

Die Eingabedaten müssen nicht einem Arbeitsblatt entnommen werden. Dabei kann es sich um statische Werte handeln oder um eine Verbindung zu einer Datenbank wie Microsoft Access oder SQL Server oder um ein anderes Arbeitsblatt.

Sie müssen dann eine öffentliche Funktion namens "Item" hinzufügen.

123 Öffentliches Funktionselement (Index als Integer) als MyItemArtikel setzen = mItems.Item(index)Endfunktion

Dadurch können Sie auf einzelne Objekte innerhalb des Sammlungsobjekts anhand ihrer Indexnummer verweisen. Diese Funktion bietet einen „Spiegel“ dessen, was im Hintergrund in der Sammlung „mMyItems“ vor sich geht.

Sie müssen außerdem eine Eigenschaft namens „Count“ hinzufügen, damit Ihr Code ermitteln kann, wie viele „MyItem“-Objekte sich in der „MyItems“-Sammlung befinden, falls Sie diese durchlaufen möchten.

123 Öffentliche Eigenschaft Get Count() As LongAnzahl = mItems.CountEnd-Eigenschaft

In diesem Fall benötigen Sie nur eine ‚Get‘-Eigenschaft, da sie schreibgeschützt ist. Es verwendet die mItems-Auflistung, da in diese bereits eine count-Eigenschaft integriert ist.

Sie haben jetzt ein Objekt (MyItems) mit einer vollständigen Hierarchie, die durch das Objekt „MyItem“ definiert ist.

Damit das Ganze funktioniert, müssen Sie jetzt ein Arbeitsblatt (Blatt1) mit Daten füllen, damit die Klasseninitialisierungsroutine diese in das Objekt einsammeln kann

Ihre Tabelle sollte so aussehen:

Verwenden Ihres neuen Objekts

Sie können Ihr Collection-Objekt (MyItems) jetzt in einem Standard-Excel-VBA-Modul verwenden. Geben Sie den folgenden Code ein:

12345678 Unter test_object()Dim MyClass als neue MyItems, n als IntegerMsgBox MyClass.CountFür n = 1 Zu MyClass.CountMsgBox MyClass.Item(n).ItemMsgBox MyClass.Item(n).DetailNächste NrEnd Sub

Dieser Code erstellt ein Objekt namens „MyClass“ basierend auf dem von Ihnen erstellten Sammlungsobjekt „MyItems“. Dadurch wird die Routine "Initialize" ausgelöst, die alle Daten aus dem Arbeitsblatt in das Objekt extrahiert.

Es zeigt die Anzahl der Elemente in der Sammlung an und durchläuft dann die Sammlung, wobei der Text "Artikel" und der Text "Detail" angezeigt werden. Sie werden feststellen, dass Sie, wenn Sie in Ihrem Code auf das Objekt "MyClass" verweisen, eine Liste der beiden Membereigenschaften sehen, die beim Hinzufügen der richtigen Eigenschaft hilft.

Wenn Sie den Wert einer Zelle in den Eingabedaten in der Tabelle ändern, wird dieser automatisch in der Sammlung aktualisiert, wenn Sie den obigen Code erneut ausführen, da beim Bemaßen des Objekts die Initialisierungsroutine ausgeführt wird und alle neuen Daten aufnimmt

Wenn Sie das Wort „Static“ anstelle von „Dim“ verwenden, wird die Initialisierungsroutine nicht ausgeführt und die alten Werte werden beibehalten, solange der Code kontinuierlich ausgeführt wird. Wenn sich die Daten in der Tabelle ändern, wird dies nicht im Objekt widergespiegelt

1234567 Untertest_Static()Statische Myclass als neue MyItems, n als IntegerFür n = 1 Zu Myclass.CountMsgBox Myclass.Item(n).ItemMsgBox Myclass.Item(n).DetailNächste NrEnd Sub

Zusammenfassung zum Erstellen eines Objekts mit einem Klassenmodul

Wie Sie gesehen haben, ist das Erstellen einer Hierarchie von Klassenmodulen zur Verwendung als Objekt eine ziemlich komplizierte Angelegenheit, selbst für eine so einfache Struktur wie das hier bereitgestellte Beispiel. Der Spielraum für Fehler ist enorm!

Es hat jedoch enorme Vorteile, indem es Ihren Code eleganter und leichter lesbar macht. Es ist auch einfacher, es mit anderen Excel-Anwendungen und Entwicklern zu teilen, indem es in ein Add-In umgewandelt wird.

In diesem Beispiel zum Erstellen eines Objekts zum Speichern von Daten wäre es ein normaler Ansatz, ein mehrdimensionales Array zu erstellen, das die mehrspaltigen Tabellenkalkulationsdaten enthält, und Sie würden eine Codezeile schreiben, um jedes Element zu aktualisieren oder zu lesen das Array. Dies würde wahrscheinlich ziemlich chaotisch werden, und es könnten leicht Fehler gemacht werden, die verschiedenen Elemente anzugehen.

Mit Ihrem neuen Objekt können Sie einfach darauf und die darunter erstellten Elemente verweisen, um die Daten zu speichern.

Auch wenn sich die Daten in der Tabellenkalkulation (oder in einer verknüpften Datenbank, wenn Sie diese als Datenquelle in Ihrem Klassenmodul verwendet haben) ändern, wenn Sie die 'Dim'-Anweisung verwenden, wird die Initialisierungsroutine aufgerufen und die Daten werden sofort aktualisiert . Sie müssen keinen Code schreiben, um Ihr Array erneut aufzufüllen.

Verwenden eines Klassenmoduls zum Erstellen eines Variablen-Repositorys

Wenn Sie VBA-Code schreiben, verwenden Sie überall Variablen mit unterschiedlichen Gültigkeitsbereichen. Einige sind möglicherweise nur für eine bestimmte Prozedur definiert, einige für ein bestimmtes Modul und einige können globale Variablen sein, die in der gesamten Anwendung verwendet werden können

Sie können ein Klassenmodul erstellen, das eine große Anzahl von Variablen enthält, und da es sich um ein Objekt handelt, kann es überall in Ihrem Code verwendet werden, sogar in einem Benutzerformular oder in einem Active X-Steuerelement, das Sie auf einem Arbeitsblatt platziert haben.

Der zusätzliche Vorteil besteht darin, dass Sie beim Verweisen auf Ihr Variablenobjekt eine aufsteigend sortierte Liste aller im Objekt enthaltenen Variablennamen sehen.

Um ein Repository zu erstellen, müssen Sie ein neues Klassenmodul einfügen. Sie tun dies, indem Sie Einfügen | . verwenden Klassenmodul aus dem VB-Editor-Menü

Ändern Sie den Namen in „MyVariables“ mit derselben Methode wie zuvor in diesem Artikel beschrieben.

Geben Sie den folgenden Code ein:

12345678910111213141516 Private mV als VarianteÖffentliche Eigenschaft Variable1() als Variante abrufenVariable1 = mVEnd-EigenschaftÖffentliche Eigenschaft Let Variable1(ByVal vNewValue As Variant)mV = vNeuWertEnd-EigenschaftÖffentliche Eigenschaft Variable2() als Variante abrufenVariable1 = mVEnd-EigenschaftÖffentliche Eigenschaft Let Variable2(ByVal vNewValue As Variant)mV = vNeuWertEnd-Eigenschaft

Dieser Code richtet die Eigenschaften „Let“ und „Get“ für zwei Variablen („Variable1“ und „Variable2“) ein. Die Eigenschaften Let und Get sind für jede Ihrer Variablen erforderlich, damit sie gelesen / geschrieben werden können

Sie können Ihre eigenen Namen für die Variablen anstelle der Beispielnamen in diesem Code verwenden und weitere Variablen hinzufügen, um sicherzustellen, dass jede neue Variable eine 'Let'- und eine 'Get'-Anweisung hat.

Die private Deklaration der Variablen ‚mV‘ dient dazu, eine Arbeitsvariable zu erstellen, die nur innerhalb des Klassenmoduls zur Übertragung von Werten verwendet wird.

Um das Variablen-Repository zu verwenden, geben Sie den folgenden Code in ein Standardmodul ein:

123456 Global VarRepo als neue MyVariablesUnter TestVariableRepository()MsgBox VarRepo.Variable1VarRepo.Variable1 = 10MsgBox VarRepo.Variable1End Sub

Dieser Code erstellt eine globale Instanz Ihres "MyVariables"-Objekts, das Sie erstellt haben. Sie müssen diese Deklaration nur einmal an einer beliebigen Stelle in Ihrem Code ausführen.

Der Code zeigt zuerst den Wert von ‚Variable1‘ an, um anzuzeigen, dass er leer ist.

„Variable1“ wird der Wert 10 zugewiesen und der neue Wert innerhalb des Objekts wird dann angezeigt, um zu zeigen, dass diese Eigenschaft jetzt diesen Wert enthält.

Da die Instanz des 'MyVariables'-Objekts global definiert wurde, können Sie von überall in Ihrem Code auf jede der definierten Variablen innerhalb des Objekts verweisen.

Dies hat den großen Vorteil, dass Sie, wenn Sie Ihre Variablen überall in Ihrem Code verwenden möchten, nur eine globale Variable definieren müssen und von dieser Instanz aus auf alle Variablen im gesamten Code frei zugegriffen und sie geändert werden können.

Verwandeln Sie Ihr Objekt in ein Add-In

Bisher befindet sich der Code für die Objekterstellung in Ihrer Arbeitsmappenanwendung. Wenn Sie Ihr Objekt jedoch mit anderen Entwicklern oder in anderen eigenen Excel-Anwendungen teilen möchten, können Sie es in ein Add-In verwandeln

Dazu muss lediglich die Datei als Add-In gespeichert werden. Wählen Sie Datei | Speichern unter und ein Browserfenster wird angezeigt

Wählen Sie den Dateityp als Add-In (.xlam) aus der Dropdown-Liste für den Dateityp aus und klicken Sie auf OK. Die Datei wird standardmäßig im Add-In-Ordner gespeichert, aber Sie können den Speicherort ändern.

Anschließend können Sie die Add-In-Datei in Ihre Excel-Anwendungen einbinden, sodass Sie Ihr neues Objekt flexibel nutzen können

Um Ihr neues Add-In in Excel aufzunehmen, klicken Sie auf Datei im Excel-Menüband und dann auf Optionen unten im linken Bereich

Klicken Sie im erscheinenden Popup-Fenster im linken Bereich auf „Add-Ins“. Am unteren Rand des Fensters befindet sich eine Schaltfläche mit der Aufschrift "Go"

Klicken Sie darauf und ein „Add-In“-Popup-Fenster wird angezeigt. Klicken Sie auf „Durchsuchen“ und suchen Sie dann Ihre Add-In-Datei. Sie können dann in Ihrem Code auf Ihr Objekt verweisen.

Sie werden die Entwicklung der Website helfen, die Seite mit Ihren Freunden teilen

wave wave wave wave wave