Bibliotheken und Verweise untersuchen

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Wenn Sie Access-Anwendungen programmieren, nutzen Sie verschiedene Bibliotheken wie etwa die VBA-Bibliothek, die Access-Bibliothek, die DAO-Bibliothek et cetera. In diesem Beitrag schauen wir uns an, wie Sie an wichtige Informationen über diese Bibliotheken gelangen und was dies beispielsweise im Hinblick auf das Ermitteln der neuen Features einer neuen Access-Version bedeutet.

Wo stecken die Bibliotheken

Als Access-Entwickler wissen Sie natürlich, wie Sie den Speicherort der im aktuellen VBA-Projekt eingebundenen Bibliotheken finden – nämlich im Verweise-Dialog, den Sie im VBA-Editor mit dem Menüpunkt Extras|Verweise öffnen.

Allerdings hilft dieser Dialog in vielen Fällen nicht wirklich weiter – er ist schlicht nicht breit genug, um den Pfad des Verweises anzuzeigen (s. Bild 1).

Verweise auf die aktuell eingebundenen Bibliotheken

Bild 1: Verweise auf die aktuell eingebundenen Bibliotheken

Pfade und weitere Informationen einlesen

Wer des VBA einigermaßen mächtig ist, hat wohl schon davon gehört, dass man auch programmatisch auf die Verweise zugreifen kann – und zwar über die References-Auflistung des Application-Objekts. Um dieses zu nutzen, erstellen wir schnell eine Tabelle namens tblBibliotheken, welche die Informationen über die referenzierten Bibliotheken aufnehmen soll. Diese Tabelle sieht im Entwurf wie in Bild 2 aus.

Die Tabelle tblBibliotheken nimmt Informationen zu den Verweisen der aktuellen Datenbank auf.

Bild 2: Die Tabelle tblBibliotheken nimmt Informationen zu den Verweisen der aktuellen Datenbank auf.

Zum Anzeigen der eingelesenen Daten erstellen wir zwei Formulare – ein Hauptformular namens frmBibliotheken und ein Unterformular namens sfmBibliotheken. Beide sollen an die Tabelle tblBibliotheken gebunden sein, wobei das Hauptformular allerdings die Details und das Unterformular die vollständige Liste der Verweise liefern soll.

Deshalb fügen Sie dem Detailbereich des Unterformulars sfmBibliotheken zunächst nur das Feld Bezeichnung der Datenherkunft hinzu. Das Hauptformular nimmt zwei Schaltflächen auf, deren Funktion wir im Anschluss erläutern. Außerdem fügen Sie diesem das Unterformular hinzu und ziehen alle Felder der Datenherkunft mit Ausnahme des Primärschlüsselfeldes BibliothekID in einen eingerahmten Bereich. Das Ergebnis sieht schließlich wie in Bild 3 aus.

Formular und Unterformular zur Anzeige der Bibliotheken in der Entwurfsansicht

Bild 3: Formular und Unterformular zur Anzeige der Bibliotheken in der Entwurfsansicht

Bibliotheken-Tabelle füllen

Bevor das Formular Daten anzeigen kann, müssen Sie die Tabelle tblBibliotheken mit den Informationen über die referenzierten Bibliotheken füllen. Dies erledigt die Prozedur, die durch das Ereignis Beim Klicken der linken Schaltfläche namens cmdEinlesen ausgelöst wird. Diese Prozedur sieht wie in Listing 1 aus.

Private Sub cmdEinlesen_Click()
     Dim db As DAO.Database
     Dim ref As Reference
     Dim strSQL As String
     Set db = CurrentDb
     db.Execute "DELETE FROM tblBibliotheken", dbFailOnError
     For Each ref In Application.References
         With ref
             strSQL = "INSERT INTO tblBibliotheken(Bezeichnung, Eingebaut, Pfad, BibliothekGUID, Art, " _
                 & "Major, Minor) VALUES(''" & .Name & "'', " & CLng(.BuiltIn) & ", ''" & .FullPath _
                 & "'', ''" & .Guid & "'', " & .Kind & ", ''" & .Major & "'', ''" & .Minor & "'')"
             db.Execute strSQL, dbFailOnError
         End With
     Next ref
     Me!sfmBibliotheken.Form.Requery
End Sub

Listing 1: Einlesen der referenzierten Bibliotheken

Die Prozedur deklariert einige Variablen, darunter die Variable ref des Typs Reference. Darüber greifen Sie auf die Verweise zu. Zu Beginn leert die Prozedur die Tabelle tblBibliotheken mit dem Aufruf einer entsprechenden DELETE-Anweisung.

In einer For Each-Schleife über die References-Auflistung des Application-Objekts durchläuft die Prozedur dann alle enthaltenen Elemente. Innerhalb der Schleife setzt die Prozedur in der Variablen strSQL eine SQL-Anweisung zusammen, welche die folgenden Eigenschaften des Reference-Objekts in die Tabelle tblBibliotheken schreibt:

  • Name: Name der Bibliothek
  • BuiltIn: Boolean-Wert, der angibt, ob der Verweis auf die Bibliothek eingebaut ist – und dementsprechend nicht entfernt werden kann
  • FullPath: Pfad zur Bibliotheksdatei
  • Guid: Eindeutiger Kennzeichner der Bibliothek
  • Kind: Art der Bibliothek. Es gibt zwei mögliche Werte: vbext_rk_TypeLib (0) entspricht einer Typbibliothek, vbext_rk_Project (1) einem eingebundenen VBA-Projekt.
  • Major: Hauptversion der Bibliothek
  • Minor: Nebenversion der Bibliothek

Nach dem Durchlaufen aller Verweise aktualisiert die Prozedur noch das Unterformular. Das Ergebnis sieht beispielsweise wie in Bild 4 aus.

Liste der Verweise und Details des aktuell angezeigten Verweises nach dem Einlesen

Bild 4: Liste der Verweise und Details des aktuell angezeigten Verweises nach dem Einlesen

Haupt- und Unterformular synchronisieren

Fehlt noch eine Kleinigkeit: Wenn Sie auf einen der Einträge des Unterformulars klicken, soll das Hauptformular die Details zu diesem Datensatz anzeigen. Dazu fügen Sie zur Prozedur Form_Load, die beim Laden des Formulars ausgelöst wird, die folgende Zeile hinzu:

Private Sub Form_Load()
     Set Me.Recordset = _
         Me!sfmBibliotheken.Form.Recordset
End Sub

Dies synchronisiert den jeweils aktuellen Datensatz in beide Richtungen. Wenn Sie einen Datensatz im Unterformular auswählen, wird dieser im Hauptformular angezeigt und umgekehrt.

Wo ist die korrekte Bezeichnung

Wenn Sie sich den Verweise-Dialog ins Gedächtnis rufen, stellen Sie fest, dass dieser wesentlich aussagekräftigere Bezeichnungen liefert als die Eigenschaft Name – mit VBA und Access lässt sich ja noch etwas anfangen, aber stdole hört sich kryptisch an.

Irgendwo müssen aber doch auch die entsprechenden Bezeichnungen aus dem Verweise-Dialog wie Visual Basic for Applications, Microsoft Access 14.0 Object Library oder OLE Automatisch abrufbar sein

Und das ist auch der Fall: Es gibt nämlich noch eine weitere References-Auflistung mit entsprechenden Reference-Objekten. Diese stellt die Bibliothek Microsoft Visual Basic for Applications Extensibility 5.3 bereit, auf die wir nun einen Verweis hinzufügen.

Wir wollen die lange Version der Bezeichnung unter einem neuen Feld namens Beschreibung in der Tabelle tblBibliotheken speichern. Damit das Formular entweder die Beschreibung oder, falls diese nicht verfügbar ist, die Bezeichnung anzeigt, erstellen wir eine neue Abfrage als Datenherkunft. Diese sieht wie in Bild 5 aus und enthält ein Feld mit folgendem Ausdruck:

Abfrage, die nach Bedarf die Bezeichnung oder die Beschreibung liefert

Bild 5: Abfrage, die nach Bedarf die Bezeichnung oder die Beschreibung liefert

Bezeichnung: Nz([Beschreibung];[tblBibliotheken].[Bezeichnung])

Dieses neue Feld Bezeichnung prüft den Inhalt des Feldes Beschreibung. Ist dieses nicht leer, wird der Inhalt dieses Feldes zurückgegeben, sonst der Inhalt des Feldes Bezeichnung. Damit kein Zirkelbezug ausgelöst wird, verweist die Funktion auf [tblBibliotheken].[Bezeichnung] statt nur auf [Bezeichnung].

Ersetzen Sie nun im Haupt- und im Unterformular die Datenherkunft tblBibliotheken durch qryBibliotheken, damit jederzeit die korrekten Daten angezeigt werden.

Lange Bezeichnung einlesen

Nun fehlt allerdings noch eine Prozedur, mit der Sie die lange Bezeichnung der Bibliothek einlesen können. Dazu rollen wir die zuvor erstellte Prozedur neu auf und legen diese für das Ereignis Beim Klicken der zweiten Schaltfläche cmdEinlesenII an (s. Listing 2).

Private Sub cmdEinlesenII_Click()
     Dim db As DAO.Database
     Dim ref As VBIDE.Reference
     Dim strSQL As String
     Dim objProject As VBIDE.VBProject
     Set db = CurrentDb
     db.Execute "DELETE FROM tblBibliotheken", dbFailOnError
     For Each objProject In VBE.VBProjects
         If objProject.FileName = CurrentDb.Name Then
             Exit For
         End If
     Next objProject
     For Each ref In objProject.References
         With ref
             strSQL = "INSERT INTO tblBibliotheken(Bezeichnung, Eingebaut, Pfad, BibliothekGUID, " _
                 & "Art, Major, Minor, Beschreibung) VALUES(''" & .Name & "'', " & CLng(.BuiltIn) _
                 & ", ''" & .FullPath & "'', ''" & .Guid & "'', " & .Type & ", ''" & .Major & "'', ''" _
                 & .Minor & "'', ''" & .Description & "'')"
             db.Execute strSQL, dbFailOnError
         End With
     Next ref
     Me!sfmBibliotheken.Form.Requery
End Sub

Listing 2: Einlesen der referenzierten Bibliotheken über die Elemente der VBE-Bibliothek

Die Prozedur deklariert eine zusätzliche Variable namens objProject mit dem Typ VBIDE.VBProject. Dieses soll zunächst mit einem Verweis auf das VBA-Projekt der aktuellen Datenbank gefüllt werden. Normalerweise sollte man meinen, dass es ausreicht, das Projekt etwa mit folgender Anweisung zu referenzieren:

Set objProject = VBE.ActiveVBProject

Wenn Sie allerdings zufällig zuvor ein Access-Add-In genutzt haben, zeigt der VBA-Editor auch dessen VBA-Projekt an – und dann liefert ActiveVBProject nicht mehr zuverlässig das Projekt der aktuell geöffneten Access-Datenbank.

Diesen ermittelt die Prozedur in einer For Each-Schleife über alle aktuell geladenen VBA-Projekte. Wenn die Eigenschaft FileName des VBA-Projekts mit der Eigenschaft Name der mit CurrentDb referenzierten (und gerade geöffneten) Datenbank übereinstimmt, haben Sie das richtige VBA-Projekt erwischt und die Schleife kann mit der Referenz auf dieses Projekt verlassen werden.

Die Variable ref ist diesmal als VBIDE.Reference deklariert und wir durchlaufen damit die References-Auflistung des soeben ermittelten und mit objProject referenzierten VBA-Projekts.

In den Eigenschaften des Reference-Objekts der VBIDE-Klasse findet sich dann auch noch eine weitere Eigenschaft namens Description, welche die volle Bezeichnung enthält, wie sie auch im Verweise-Dialog erscheint.

Außerdem gibt es einen weiteren kleinen Unterschied: Die Art des Verweises liefert hier die Eigenschaft Type, nicht Kind. All dies berücksichtigen wir in der Schleife über alle Verweise, in der diese Informationen wie bereits zuvor beschrieben in der Tabelle tblBibliotheken landen.

Anschließend zeigt das Formular auch die vollen Bezeichnungen an (s. Bild 6).

Formular mit ausführlichen Bezeichnungen der Bibliotheken

Bild 6: Formular mit ausführlichen Bezeichnungen der Bibliotheken

Verweise-Dialog anpassen

Vermutlich gab es bereits tausende Anfragen bei Microsoft mit der Bitte, den Verweise-Dialog so anzupassen, dass dieser die Pfade zu den Verweisen vollständig anzeigt. Leider hat sich in dieser Beziehung nichts getan.

Dabei wäre es wirklich sehr einfach, das Steuerelement, das derzeit den Pfad im Verweise-Dialog anzeigt, zumindest in ein Textfeld umzuwandeln, damit der Benutzer mit der Maus nach rechts scrollen und den vollständigen Pfad anzeigen und gegebenenfalls kopieren kann.

Sie können eine solche änderung selbstständig durchführen – wir weisen jedoch ausdrücklich darauf hin, dass Microsoft dies in den Lizenzbedingungen untersagt. Die experimentelle Anwendung der nachfolgenden Schritte erfolgt außerdem auf eigene Gefahr.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar