Erweitern der VBA-IDE: Projekte, Module und Co.

Die Visual Basic-Entwicklungsumgebung ist definitiv in die Jahre gekommen. Wer schon einmal mit einer modernen Entwicklungsumgebung wie Eclipse oder dem Visual Studio .NET gearbeitet hat, wird bei der Rückkehr zur VBA-IDE möglicherweise einiges vermissen. Es gibt aber Möglichkeiten, die Entwicklungsumgebung zu erweitern – sogar mit den Hausmitteln von Access und mit nur einer zusätzlichen Bibliothek. Im ersten Teil der Artikelreihe schauen wir uns an, wie Sie auf die Objekte der VBA-Entwicklungsumgebung zugreifen.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1904_EntwicklungsumgebungErweitern_Module.accdb.

Einstieg

Genau wie auf die Objekte einer Access-Datenbank wie Tabellen, Abfragen, Formulare und Berichte sowie die darin enthaltenen Steuerelemente können Sie auch auf die Elemente des VBA-Editors zugreifen und diese einlesen, bearbeiten, anlegen, speichern oder löschen. In diesem ersten Teil der Artikelreihe zum Thema Erweitern der VBA-Entwicklungsumgebung schauen wir uns an, wie Sie mit VBA auf die Objekte der Entwicklungsumgebung zugreifen können.

Vorbereitung

Als Erstes benötigen Sie einen Verweis auf die Bibliothek, welche die Objekte, Methoden, Eigenschaften und Ereignisse für die Programmierung des VBA-Editors bereitstellt. Diesen fügen Sie im VBA-Editor hinzu, indem Sie den Menübefehl Extras|Verweise betätigen und im nun erscheinenden Verweise-Dialog den Eintrag Microsoft Visual Basic for Applications Extensibility 5.3 hinzufügen (siehe Bild 1).

Der Verweis auf die Extensibility-Bibliothek für das Programmieren der VBA-Entwicklungsumgebung

Bild 1: Der Verweis auf die Extensibility-Bibliothek für das Programmieren der VBA-Entwicklungsumgebung

VBE: Das Hauptobjekt der Entwicklungsumgebung

In der soeben hinzugefügten Bibliothek finden Sie als Hauptelement die VBE-Klasse. Diese Klasse brauchen sie nicht zu instanzieren, Sie können direkt über den Ausdruck VBE darauf zugreifen. Das sehen Sie schon, wenn Sie im Direktbereich des VBA-Editors VBE und einen Punkt eingeben – IntelliSense zeigt dann direkt die Elemente dieser Klasse an (siehe Bild 2).

Zugriff auf die Eigenschaften und Methoden der VBE-Klasse

Bild 2: Zugriff auf die Eigenschaften und Methoden der VBE-Klasse

VBProject: Das VBA-Projekt

Damit können Sie dann auch direkt auf die Auflistung VBProjects zugreifen.

Warum aber gibt es eine Auflistung über die Projekte Hat eine Access-Anwendung nicht immer nur ein VBA-Projekt, so wie in Bild 3 dargestellt

Das VBA-Projekt im Projekt-Explorer

Bild 3: Das VBA-Projekt im Projekt-Explorer

Nein, das ist nicht der Fall: Sie können dort auch mehrere VBA-Projekte vorfinden. Das ist zum Beispiel der Fall, wenn Sie gerade ein Access-Add-In geladen haben. Dann sieht der Projekt-Explorer wie in Bild 4 aus.

Mehrere VBA-Projekte im Projekt-Explorer

Bild 4: Mehrere VBA-Projekte im Projekt-Explorer

Die einzelnen Projekte können Sie über die Auflistung VBProjects referenzieren, was etwa wie folgt aussieht:

Public Sub VBProjekteAusgeben()
    Dim objVBProject As VBProject
    Debug.Print "Anzahl VB-Projekte: "                                   & VBE.VBProjects.Count
    For Each objVBProject In VBE.VBProjects
        Debug.Print objVBProject.Name
        Debug.Print objVBProject.FileName
        Debug.Print objVBProject.Type 
    Next objVBProject
End Sub

Für das Beispiel mit dem zusätzlichen VBA-Projekt aus dem Add-In erhalten wir dann zum Beispiel die folgende Ausgabe:

Anzahl VB-Projekte: 2
prjVBEBeispiele
C:\...\1904_EntwicklungsumgebungErweitern_Module.accdb
 100 
RA2010
C:\...\ADDINS\RIBBONADMIN2016.ACCDA
 100

Die Eigenschaftswerte finden Sie übrigens auch im Eigenschaftenfenster des Projekts wieder, das Sie über den Kontextmenü-Eintrag des Projekts öffnen können (siehe Bild 5).

Eigenschaftsfenster des Projekts

Bild 5: Eigenschaftsfenster des Projekts

Auf das aktive VBA-Projekt zugreifen

Wenn Sie das aktive VBA-Projekt referenzieren wollen, können Sie die Eigenschaft ActiveVBProject der VBE-Klasse verwenden. Wenn Sie die folgende Anweisung im Direktfenster des VBA-Editors ausgeben, erhalten Sie den Namen des VBE-Projekts, das gerade im Projekt-Explorer den Fokus hat:

Debug.Print VBE.ActiveVBProject.Name

Was geschieht, wenn Sie diese Anweisung in einer Prozedur unterbringen und diese dann aufrufen Dann wird der Name des Projekts ausgegeben, in dem sich die Prozedur befindet:

Public Sub AktuellesProjektAusgeben()
    Debug.Print VBE.ActiveVBProject.Name
End Sub

Add-Ins ausgeben

Soeben haben wir schon angesprochen, dass das VBA-Projekt eines Add-Ins angezeigt wird, wenn dieses von der Benutzeroberfläche aus gestartet wurde beziehungsweise aktiv ist. Dabei handelt es sich um Access-Add-Ins. Es gibt aber auch noch Add-Ins für den Visual Basic Editor. Diese verwalten Sie über den Add-In-Manager des VBA-Editors, den Sie über den Eintrag Add-Ins|Add-In-Manager… öffnen.

Dieser zeigt eventuell vorhandene Add-Ins dann wie in Bild 6 in Listenform an. Sie können auch per VBA auf die vorhandenen Add-Ins zugreifen. Dazu verwenden Sie die Auflistung Addins, mit der Sie die Elemente des Typs Addin erhalten. Diese Auflistung können wir wie folgt per For Each-Schleife durchlaufen:

Der Add-In-Manager des VBA-Editors

Bild 6: Der Add-In-Manager des VBA-Editors

Public Sub AddInsAusgeben()
    Dim objAddIn As AddIn
    Debug.Print "Anzahl Addins: "                             & VBE.Addins.Count
    For Each objAddIn In VBE.Addins
        Debug.Print objAddIn.Description
    Next objAddIn
End Sub

Viele interessante Informationen liefert die Addin-Klasse jedoch nicht – wir erhalten noch nicht einmal den Namen, sondern nur die Beschreibung.?

VBA-Projekt per Name ermitteln

Um auf Nummer sicher zu gehen, ob Sie mit dem richtigen VBProject-Element arbeiten, können Sie einen kleinen Trick anwenden. Es gibt zwar keine Möglichkeit, die Elemente der VBProjects-Auflistung über den Namen des Projekts anzusprechen, aber wir können diese ja durchlaufen und dabei prüfen, welchen Namen das aktuelle VBProject-Element hat. Um das VB-Projekt mit einem bestimmten Namen zu ermitteln, können wir die folgende Funktion verwenden:

Public Function GetVBProjectByName(strName As String)                                             As VBProject
    Dim objVBProject As VBProject
    For Each objVBProject In VBE.VBProjects
        If objVBProject.Name = strName Then
            Set GetVBProjectByName = objVBProject
            Exit Function
        End If
    Next objVBProject
End Function

Wenn Sie etwa eine Eigenschaft wie FileName des VBA-Projekts prjVBEBeispiele ermitteln wollen, können Sie das mit der obigen Funktion wie folgt erledigen:

Debug.Print GetVBProjectByName(                   "prjVBEBeispiele").FileName

Verweise ausgeben

Auch die Verweise eines VBA-Projekts können Sie per VBA ausgeben lassen. Dazu nutzen Sie die References-Auflistung beziehungsweise die Reference-Klasse. Wichtig ist hierbei, in welchem Kontext Sie die References-Auflistung verwenden. Sie können diese beispielsweise im Direktfenster direkt aufrufen:

Debug.Print References.Count

Dann liefert das die Referenzen des aktuellen Projekts, wenn Sie nur ein Projekt geladen haben. Das aktuelle Projekt ist das Projekt, von dem das aktuelle Codefenster stammt. Wenn Sie mehr als ein Projekt geladen haben, sollten Sie dieses gezielt ansprechen. Wie das geht, haben Sie oben schon erfahren.

Wenn Sie wie in der Prozedur aus Listing 1 mit ActiveVBProject auf das aktuelle Projekt zugreifen, müssen Sie sicherstellen, dass eines der Elemente des gewünschten Projekts im Projekt-Explorer markiert ist – oder auch das Projekt selbst.

Public Sub VerweiseAusgeben()
     Dim objReference As vbide.Reference
     Dim objVBProject As VBProject
     Set objVBProject = VBE.ActiveVBProject
     For Each objReference In objVBProject.References
         Debug.Print "BuiltIn:     " & objReference.BuiltIn
         Debug.Print "Description: " & objReference.Description
         Debug.Print "FullPath:    " & objReference.FullPath
         Debug.Print "Guid:        " & objReference.Guid
         Debug.Print "IsBroken:    " & objReference.IsBroken
         Debug.Print "Major:       " & objReference.Major
         Debug.Print "Minor:       " & objReference.Minor
         Debug.Print "Name:        " & objReference.Name
         Debug.Print "Type:        " & objReference.Type
     Next objReference
End Sub

Listing 1: Ausgabe der Verweise und ihrer Eigenschaften

Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar