Verweise aus anderer Datenbank importieren

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

Wenn eine Datenbank beschädigt ist, können Sie diese oft retten, indem Sie eine neue Datenbank aufsetzen und alle Objekte der alten Datenbank in die neue Datenbank importieren. Leider berücksichtigt die Import-Funktion nicht die Verweise des VBA-Projekts. Je nach der Anzahl der Verweise kann das Übertragen der Verweise recht mühsam werden. Zum Glück kann man fast alles automatisieren, was sich sonst über die Benutzeroberfläche von Access erledigen lässt. In diesem Fall bauen wir uns ein Add-In, mit dem wir der aktuell geöffneten Datenbank die Verweise einer ausgewählten Datenbank hinzufügen können.

Gründe dafür, Verweise aus anderen Datenbanken zu importieren, gibt es genug. Einen haben wir bereits genannt – wenn Sie eine Datenbank bestehend auf einer anderen, gegebenenfalls beschädigten Datenbank neu aufbauen wollen, dann sind die Verweise eines der wenigen Elemente, die Sie nicht mit der eingebauten Importieren-Funktion übertragen können.

Ein anderer Grund ist die Unzulänglichkeit des Verweise-Dialogs: Wenn dieser für das Quellprojekt beispielsweise Einträge enthält, die nicht in der Liste der Verweise enthalten sind, sondern die über den Durchsuchen-Dialog hinzugefügt wurden, dann müssen Sie diese auch in der Zieldatenbank wieder über den Durchsuchen-Dialog hinzufügen.

Wenn der Pfad der Datei hinter dem Verweis wie in Bild 1 etwas länger ist, dann können Sie den hinteren Teil nicht mehr lesen, weil nur ein geringer Teil des Pfades angezeigt wird.

Zu kleines Textfeld für den Pfad zur Verweisdatei

Bild 1: Zu kleines Textfeld für den Pfad zur Verweisdatei

Add-In zum Importieren von Verweisen

Deshalb haben wir ein Add-In entwickelt, das alle gängigen Verweise aus einem VBA-Projekt in ein anderes übertragen kann. Dieses sieht in Aktion wie in Bild 2 aus. Das Add-In zeigt zunächst nur die Verweise des VBA-Projekts der Datenbank an, für die das Add-In geöffnet wurde und in welche die Verweise aus einem anderen VBA-Projekt importiert werden sollen.

Das Add-In zum Importieren von Verweisen

Bild 2: Das Add-In zum Importieren von Verweisen

Diese Verweise finden Sie in der rechten Liste unter Verweise der aktuellen Datenbank. Wenn Sie mit dem Datei auswählen-Dialog die Datenbankdatei ausgewählt haben, aus der die Verweise eingelesen werden sollen, zeigt das linke Listenfeld unter Verweise der gewählten Datenbank alle Verweise der Quelldatenbank an.

Nun haben Sie verschiedene Möglichkeiten, die Verweise aus der linken Liste in die rechte Liste zu übertragen – und diese gleichzeitig zur aktuell geöffneten Datenbank hinzuzufügen:

  • Doppelklick auf den jeweiligen Listeneintrag
  • Markieren des zu übertragenden Verweises und Betätigen der Schaltfläche mit dem Pfeil
  • Klicken auf die Schaltfläche mit dem Doppelpfeil, um alle Verweise zu übertragen, die in der Quelldatenbank, aber nicht in der Zieldatenbank enthalten sind.

Und Sie können auch noch Verweise aus der Zieldatenbank entfernen, indem Sie doppelt auf diese klicken.

Entwerfen des Formulars

Das Formular frmVerweiseImportieren sieht in der Entwurfsansicht wie in Bild 3 aus. Das Textfeld zur Eingabe des Pfades der Quelldatenbank heißt txtImportVon, die Schaltfläche zum Öffnen des Datei auswählen-Dialogs heißt cmdDateiauswahl. Die beiden Listenfelder nennen wir kurz lstQuelle und lstZiel. Die beiden Schaltflächen zum Übertragen eines oder aller Verweise heißen cmdHinzufuegen und cmdAlleHinzufuegen.

Entwurf des Formulars

Bild 3: Entwurf des Formulars

Variablen vorbereiten

Im oberen Teil des Klassenmoduls des Formulars frmVerweiseImportieren deklarieren wir einige modulweit verfügbare Variablen. Einige davon werden mit dem Typ VBIDE.VBProject versehen. Um diese nutzen zu können, benötigen wir einen Verweis auf die Bibliothek Microsoft Visual Basic for Applications Extensibility 5.3 (siehe Bild 4).

Verweis auf die Bibliothek zur Programmierung der VBIDE hinzufügen

Bild 4: Verweis auf die Bibliothek zur Programmierung der VBIDE hinzufügen

Die Variablendeklarationen sehen wie folgt aus:

Dim strAddInName As String
Private m_VBProjectAddIn As VBIDE.VBProject
Private m_VBProjectZiel As VBIDE.VBProject
Dim objVBProjectQuelle As VBIDE.VBProject

Die beiden Variablen zum Speichern der Verweise auf die VBA-Projekte von Add-In und Zieldatenbank deklarieren wir als Member-Variablen, weil wir diese später über Property Get-Prozeduren füllen und bereitstellen.

Füllen des Listenfeldes mit den vorhandenen Verweisen

Beim Laden des Formulars wird die folgende Prozedur ausgelöst, die wiederum einige weitere Routinen ansteuert:

<b>Private Sub Form_Load()
<b>    VerweiseEinlesen objVBProjectZiel, Me!lstZiel
<b>End Sub</b>

Referenzieren von AddIn- und Zieldatenbank

Wir greifen in den nachfolgend vorgestellten Prozeduren auf die VBA-Projekte der Add-In-Datenbank, der Datenbank, von der aus wir das Add-In starten und der Datenbank, aus der wir die Verweise importieren wollen, zu. Zwei davon referenzieren wir durch die folgenden Property Get-Prozeduren, die sicherstellen, dass auch im Falle eines Fehlers immer eine Instanz geholt werden kann.

Die Prozeduren sehen wir folgt aus:

Public Property Get VBProjectZiel() As VBIDE.VBProject
     If m_VBProjectZiel Is Nothing Then
         Set m_VBProjectZiel = GetVBProject(CurrentDb.Name)
     End If
     Set VBProjectZiel = m_VBProjectZiel
End Property
Public Property Get VBProjectAddIn() As VBIDE.VBProject
     If m_VBProjectAddIn Is Nothing Then
         Set m_VBProjectAddIn = GetVBProject(CodeDb.Name)
     End If
     Set VBProjectAddIn = m_VBProjectAddIn
End Property

Die Variablen m_VBProjectZiel und m_VBProjectAddIn füllen wir mit der Funktion GetVBProject, der wir den Pfad zu der Datenbankdatei übergeben, zu der das VBA-Projekt gehört (siehe Listing 1).

Private Function GetVBProject(strPath As String) As VBIDE.VBProject
     Dim objVBProject As VBIDE.VBProject
     For Each objVBProject In VBE.VBProjects
         If objVBProject.FileName = strPath Then
             Exit For
         End If
     Next objVBProject
     Set GetVBProject = objVBProject
End Function

Listing 1: Referenzieren eines VBA-Projekts

Wenn Sie von einer Datenbankdatei aus einer Add-In-Datenbank öffnen, befinden sich im VBA-Editor bereits zwei VBA-Projekte (siehe Bild 5).

VBA-Projekte der geöffneten Datenbank und der Add-In-Datenbank

Bild 5: VBA-Projekte der geöffneten Datenbank und der Add-In-Datenbank

Um herauszufinden, welches VBA-Projekt zum Add-In gehört, durchläuft die Funktion in einer For Each-Schleife alle VBProject-Elemente, die aktuell im VBA-Editor verfügbar sind.

Dabei vergleicht sie jeweils den Dateinamen des VBA-Projekts, der mit dem Pfad der Datenbankdatei, den wir mit dem Parameter strPath übergeben haben, übereinstimmen muss. Ist das in der For Each-Schleife der Fall, verlassen wir diese. Das aktuell in objVBProject befindliche VBA-Projekt wird dann als das zu der Datenbank aus strPath gehörende VBA-Projekt zurückgegeben.

Auf diese Weise holen wir zwei Verweise auf das VBA-Projekt der Add-In-Datenbank und zu der Datenbank, von der aus das Add-In gestartet wurde und in welche die Verweise einer anderen Datenbank importiert werden sollen.

Für das Ermitteln des Verweises auf die Add-In-Datenbank übernehmen wir den Pfad der Datenbank, den wir mit dem Ausdruck CodeDb.Name ermitteln.

Das VBA-Projekt der Datenbank, die das Add-In geöffnet hat, ermitteln wir durch die Übergabe des Pfades aus CurrentDb.Name an die Funktion GetVBProject.

Einlesen der aktuellen Verweise

Die Prozedur VerweiseEinlesen liest Verweise des VBA-Projekts der mit dem ersten Parameter angegebenen VBA-Projekt ein und fügt diese zu dem mit dem zweiten Parameter angegebenen Listenfeld hinzu.

Hierzu müssen wir zunächst die Listenfelder vorbereiten. Diese werden nicht an Tabellen oder Abfragen gebunden, sondern sollen ihre Daten aus Wertlisten beziehen.

Daher stellen wir die Eigenschaft Herkunftstyp für beide Listenfelder auf Wertliste ein. Diese Wertlisten sollen in der ersten Spalte den Namen des Verweises anzeigen und in der zweiten und dritten Spalte die GUID und den Pfad zur referenzierten Bibliothek.

Deshalb stellen wir die Eigenschaft Spaltenanzahl auf 3 und Spaltenbreiten auf ;0cm;0cm ein – so wird die erste Spalte über die komplette Breite angezeigt und die zweite und die dritte Spalte werden ausgeblendet.

Die Prozedur VerweiseEinlesen aus Listing 2 leert das mit dem Parameter lst übergebene Listenfeld zunächst. Dann durchläuft es alle Verweise der Auflistung Reference des VBA-Projekts aus objVBProject, das wieder mit GetVBProject ermittelt wird.

Private Sub VerweiseEinlesen(objVBProject As VBIDE.VBProject, lst As ListBox)
     Dim objReference As VBIDE.Reference
     Dim strEintrag As String
     lst.RowSource = ""
     For Each objReference In objVBProject.References
         strEintrag = objReference.Description
         On Error Resume Next
         strEintrag = strEintrag & ";" & objReference.Guid
         If Not Err.Number = 0 Then
             strEintrag = strEintrag & ";"
         End If
         Err.Clear
         strEintrag = strEintrag & ";" & objReference.FullPath
         If Not Err.Number = 0 Then
             strEintrag = strEintrag & ";"
         End If
         On Error GoTo 0
         lst.AddItem strEintrag
     Next objReference
End Sub

Listing 2: Einlesen der Verweise des VBA-Projekts einer Datenbank

Dann fügt sie der Variablen strEintrag den Beschreibungstext aus der Eigenschaft Description des Verweises hinzu – dies ist der Inhalt der ersten Spalte. Danach schalten wir die eingebaute Fehlerbehandlung aus, um strEintrag um ein Semikolon und den Wert der Eigenschaft Guid zu erweitern. Ist dieser leer, wird ein Fehler ausgelöst. In diesem Fall fügen wir einfach nur ein Semikolon zu strEintrag hinzu – die zweite Spalte dieses Listenfeldeintrags bliebe also leer. Danach gehen wir auf die gleiche Weise vor, um den Inhalt der Eigenschaft FullPath des Verweises zu strEintrag hinzuzufügen.

Danach fügt die Prozedur den Inhalt von strEintrag mit der Methode AddItem des Listenfeldes als neue Zeile zum Listenfeld hinzu.

Damit haben wir nun das rechte Listenfeld gefüllt und der Zeitpunkt ist gekommen, wo der Benutzer die Datenbank auswählen soll, aus der Verweise importiert werden sollen.

Datenbank mit zu importierenden Verweisen auswählen

Die Schaltfläche cmdDateiauswahl löst beim Anklicken die Prozedur aus Listing 3 aus. Diese merkt sich zunächst den Namen des VBA-Projekts der Add-In-Datenbank in der Variablen strAddInName. Dann öffnet sie einen Datei auswählen-Dialog, der nur Access-Datenbanken anzeigt. Die dazu notwendige Funktion OpenFileName finden Sie im Modul mdlTools. Das Ergebnis des OpenFileName-Aufrufs nach der Auswahl durch den Benutzer landet im Textfeld txtImportVon.

Private Sub cmdDateiauswahl_Click()
    strAddInName = VBProjectAddIn.Name
    Me!txtImportVon = OpenFileName(CurrentProject.Path, "Datenbank mit zu importierenden Verweisen wählen", _
"Access-DB (*.mdb,*.accdb,*.mda,*.accda)|Alle DAteien (*.*)")
    On Error Resume Next
    VBProjectAddIn.References.AddFromFile Me!txtImportVon
    If Not Err.Number = 0 Then
        VBProjectAddIn.Name = strAddInName & "_"
        VBProjectAddIn.References.AddFromFile Me!txtImportVon
    End If
On Error GoTo 0
Set objVBProjectQuelle = GetVBProject(Me!txtImportVon)
    VerweiseEinlesen objVBProjectQuelle, Me!lstQuelle
End Sub

Listing 3: Auswählen der Datenbank zum Importieren der Verweise

Nun wollen wir die Verweise des VBA-Projekts dieser Datenbank auslesen. Dazu binden wir das VBA-Projekt dieser Datenbank als Verweis in das VBA-Projekt der Add-In-Datenbank ein.

Das erledigen wir in der folgenden Anweisung, wo wir der References-Auflistung des aktuellen VBA-Projekts aus objVBProjectAddIn, also des Add-In-Projekts, einen Verweis auf die Datenbank zu, deren Verweise wir importieren wollen.

Tritt dabei ein Fehler auf, liegt es vermutlich daran, dass der Name des zu referenzierenden Projekts mit dem Namen des Add-In-VBA-Projekts übereinstimmt – was normalerweise nicht passieren sollte, außer die Datenbank heißt ebenfalls prjVerweiseImportieren wie das VBA-Projekt unseres Add-Ins. Der resultierende Fehler lautet Name steht in Konflikt mit vorhandenem Modul, Projekt oder vorhandener Objektbibliothek.

In diesem Fall passen wir den Namen des VBA-Projekts aus objVBProjectAddIn an, indem wir einen Unterstrich an den Projektnamen anhängen. Und nun wird auch klar, warum wir weiter oben den Projektnamen in der Variablen strAddInName gespeichert haben – damit wir den Namen des VBA-Projekts nach Abschluss der Arbeit mit dem Add-In wieder in den vorherigen Zustand zurückversetzen können.

Im Projekt-Explorer im VBA-Editor finden Sie nun sogar gleich drei VBA-Projekte vor – das der aktuell geöffneten Datenbank, das für das Add-In und das der Datenbank, deren Verweise importiert werden sollen (siehe Bild 6).

Verweise auf drei VBA-Projekte gleichzeitig im VBA-Editor

Bild 6: Verweise auf drei VBA-Projekte gleichzeitig im VBA-Editor

Dann weisen wir der Variablen objVBProjectQuelle das VBA-Projekt zu aus der Liste der aktuell verfügbaren VBA-Projekte zu, das den gleichen Dateinamen hat wie die Datei, die der Benutzer über den Datei auswählen-Dialog selektiert hat.

Schließlich rufen wir noch die Prozedur VerweiseEinlesen auf. Dabei geben wir mit dem ersten Parameter einen Verweis auf das VBA-Projekt mit den Verweisen und als zweiten Parameter den Verweis auf das linke Listenfeld an (lstQuelle).

Danach zeigen nun beide Listenfelder die Verweise der jeweiligen Datenbanken an und wir können uns um die Programmierung für den Import oder für das Entfernen von Verweisen aus der aktuell geöffneten Datenbank kümmern.

Einzelnen Verweis importieren

Den Import eines einzelnen Verweises aus der Quelldatenbank erledigen Sie beispielsweise durch einen Klick auf die Schaltfläche cmdHinzufuegen.

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