VBA-Projekte vergleichen

Bevor man umfangreichere Änderungen an bestehenden Anwendungen vornimmt, sollte man zumindest eine Sicherungskopie der Datenbankdatei machen. Außen vor sind hier Entwickler, die den Code ihrer Anwendungen mit einer Quellcodeverwaltung tracken – hier kann man den Verlauf der Änderungen leicht nachvollziehen. Wer aber den Aufwand nicht betreiben will, kann auch mit einfacheren Mitteln prüfen, welche Änderungen seit dem letzten Speichern durchgeführt wurden – und zwar mit der in diesem Beitrag vorgestellten Lösung. Hier bauen wir auf einer einfachen Funktion auf, die den kompletten Inhalt aller VBA-Module exportiert und schauen uns dann die Unterschiede mit einem Texteditor an.

VBE zugreifbar machen

Wenn wir auf den Inhalt des VBA-Projekts einer Anwendung zugreifen wollen, benötigen wir die Bibliothek mit den Befehlen für den Zugriff auf das VBE-Objekt. Dieses bietet alle notwendigen Objekte, Eigenschaften und Methoden, um auf die Module und ihre Inhalte zuzugreifen. Die Bibliothek machen wir verfügbar, indem wir einen Verweis darauf zum aktuellen Projekt hinzufügen.

Dazu öffnen Sie den VBA-Editor (von Access beispielsweise mit Alt + F11) und starten dann den Verweise-Dialog mit dem Menübefehl Extras|Verweise. Hier aktivieren Sie den Eintrag Microsoft Visual Basic for Applications Extensibility 5.3 Object Library (siehe Bild 1).

Verweis auf die Bibliothek Microsoft Visual Basic for Applications Extensibility 5.3 Object Library

Bild 1: Verweis auf die Bibliothek Microsoft Visual Basic for Applications Extensibility 5.3 Object Library

Damit können wir mit einer recht einfachen Prozedur alle VBA-Module durchlaufen, diese in einer String-Variablen zusammenfassen und sie dann in einer Textdatei speichern, um sie mit einem Export aus einer anderen Datenbank zu vergleichen.

VBA-Code komplett exportieren

Die folgende Prozedur exportiert den kompletten Code eines VBA-Projekts in eine Textdatei. Sie deklariert Variablen zum Referenzieren des VBA-Editors (objVBE), des aktuellen VBA-Projekts (objVBProject), einer VBA-Komponente (objVBComponent) und des darin enthaltenen Code-Moduls (objCodeModule).

Außerdem benötigen wir noch Variablen zum Zusammenfügen des Codes der Elemente und für den Dateinamen:

Public Sub CodeKomplettExportieren()
     Dim objVBE As VBIDE.VBE
     Dim objVBProject As VBIDE.VBProject
     Dim objVBComponent As VBIDE.VBComponent
     Dim objCodemodule As VBIDE.CodeModule
     Dim strVBA As String
     Dim strDateiname As String

Damit referenziert die Prozedur den VBA-Editor und ermittelt mit der Eigenschaft ActiveVBProject das aktuell geöffnete VBA-Projekt:

     Set objVBE = VBE
     Set objVBProject = objVBE.ActiveVBProject

Dann durchläuft sie alle VBComponent-Elemente, also alle Standardmodule, Klassenmodule und Formular- und Berichtsmodule aus der Auflistung VBComponents in einer For Each-Schleife und referenziert diese mit der Variablen objVBComponent:

     For Each objVBComponent In objVBProject.VBComponents

In der Schleife referenziert die Prozedur das im VBComponent-Element enthaltene Code-Modul mit der Variablen obj-CodeModule und fügt dieses mit einer führenden und einer nachfolgenden Zeile zur optischen Hervorhebung zusammen:

         Set objCodemodule = objVBComponent.CodeModule
         strVBA = strVBA & "============================" _
             & vbCrLf
         strVBA = strVBA & objVBComponent.Name & vbCrLf
         strVBA = strVBA & "============================" _
             & vbCrLf

Danach folgt der eigentliche Inhalt des VBA-Moduls, der mit der Lines-Eigenschaft für alle Zeilen von der ersten bis zu der mit CountOfLines ermittelten letzten Zeile ermittelt wird:

         strVBA = strVBA & objCodemodule.Lines(1, _
             objCodemodule.CountOfLines) & vbCrLf
     Next objVBComponent

Nachdem auf diese Weise alle Module in der Variablen strVBA zusammengestellt wurden, schreibt die Prozedur deren Inhalt in eine Textdatei, die den Namen der Datenbank plus die Endung .vba.txt enthält:

     strDateiname = CurrentDb.Name & ".vba.txt"
     Open strDateiname For Output As #1
     Print #1, strVBA
     Close #1
End Sub

Diesen Vorgang führen Sie nun mit der aktuellen und mit der zu vergleichenden Version des VBA-Projekts durch und speichern auch diese Datei.

Vergleichen der beiden Dateien

Zum Vergleichen gibt es zahlreiche Anwendungen. Wir arbeiten seit Ewigkeiten mit TextPad, welches eine Funktion zum Vergleichen des Inhalts zweier Dateien anbietet.

Die umständliche Vorgehensweise hier lautet:

  • TextPad starten
  • Textdatei mit der aktuellen Version des VBA-Projekts öffnen
  • Textdatei mit der zu vergleichenden Version des VBA-Projekts öffnen
  • In Textpad den Menübefehl Extras|Dateien vergleichen… aufrufen

TextPad zeigt dann den Dialog Textdateien vergleichen an, der die beiden aktuell geöffneten Dateien als erste und zweite zu vergleichende Datei anbietet (siehe Bild 2) – Sie brauchen also nur noch auf OK zu klicken.

Optionen für das Vergleichen von Textdateien

Bild 2: Optionen für das Vergleichen von Textdateien

Danach zeigt Textpad die Unterschiede entsprechend hervorgehoben an (siehe Bild 3).

Vergleich des Inhalts zweier VBA-Projekte im Text-Editor TextPad

Bild 3: Vergleich des Inhalts zweier VBA-Projekte im Text-Editor TextPad

TextPad direkt mit Dateien öffnen

TextPad bietet einige Startparameter an, mit denen wir unter anderem direkt eine oder mehrere Dateien angeben können, die beim Start geöffnet werden sollen. Dazu nutzen wir unter VBA die Shell-Funktion und geben hinter dem Pfad zur TextPad.exe die Namen der zu öffnenden Dateien an – zur Sicherheit in Anführungszeichen eingeschlossen, falls die Dateinamen Leerzeichen enthalten:

Public Sub TextPadMitDateienOeffnen()
     Shell "C:Program FilesTextPad 8TextPad.exe """ _
         & c:...Datei1.vba.txt"" ""c:...Datei2.vba.txt"""
End Sub

Danach brauchen Sie nur noch den Menüeintrag Extras|Dateien vergleichen… aufzurufen.

Add-In-Unterstützung

Da die Vorgehensweise immer noch ein wenig kompliziert ist – immerhin müssen wir die Prozedur CodeKomplettExportieren in jede betroffene Datenbank kopieren, immer beide Datenbanken öffnen, um den VBA-Code zu exportieren und diese dann wieder schließen -, behelfen wir uns mit einem kleinen, aber effizienten Access-Add-In.

Dieses legen wir in Form einer neuen, leeren Access-Datenbank an, deren Name wir noch vor der ersten Änderung in amvVBAVergleich.accda umbenennen (.accda ist die Dateiendung, unter der Access-Add-Ins erkannt werden).

USysRegInfo-Tabelle

Damit die Datenbank als Add-In registriert werden kann, fügen wir ihr eine Tabelle namens USysRegInfo hinzu, welche die Informatoinen enthält, die beim Installieren des Add-Ins in der Registry gespeichert werden. Von dort liest Access diese Informationen beim Start aus und zeigt das Add-In an der entsprechenden Stelle an – meist im Ribbon-Menü Datenbanktools|Add-Ins|Add-Ins.

Diese Tabelle sieht wie in Bild 4 aus und muss genau die dort abgebildeten Informationen enthalten – zumindest jedoch muss der Wert in Subkey übereinstimmen und der im vierten Datensatz angegebene Dateiname im Feld Value muss mit dem Dateinamen der Add-In-Datenbank übereinstimmen.

Add-In-Einstellungen in der Tabelle USysRegInfo

Bild 4: Add-In-Einstellungen in der Tabelle USysRegInfo

Datenbank-informationen

Damit das Add-In später im Add-In-Manager ordentlich angezeigt wird, stellen wir außerdem noch Werte im Eigenschaften-Fenster von Access ein. Dieses öffnen Sie in aktuellen Versionen von Access unter Datei|Informationen mit dem Link Datenbankeigenschaften anzeigen und bearbeiten. Hier legen Sie die Werte wie in Bild 5 fest.

Datenbank-Eigenschaften

Bild 5: Datenbank-Eigenschaften

Autostart-Funktion

Damit beim Aufrufen des Add-Ins etwas geschieht, fügen Sie einem Standardmodul der Add-In-Datenbank eine öffentliche Funktion namens Autostart hinzu (dass diese Funktion so heißt, haben wir in der Tabelle USysRegInfo festgelegt). Diese Funktion soll ein Formular namens frmVBAVergleich öffnen.

Public Function Autostart()
     DoCmd.OpenForm "frmVBAVergleich", WindowMode:=acDialog
End Function

Das Formular frmVBAVergleich

Dieses Formular legen wir als Nächstes an. Da dieses Formular keine Möglichkeit zum Navigieren in Datensätzen anzeigen soll, stellen wir die Eigenschaften Datensatzmarkierer, Navigationsschaltflächen und Bildlaufleisten auf Nein ein und die Eigenschaft Automatisch zentrieren auf Ja.

Es soll aber dennoch an eine Datenherkunft gebunden werden, nämlich an die Tabelle tblOptionen. Diese soll den Namen des aufzurufenden Tools für den Vergleich der VBA-Projekte speichern sowie die Konstellation der Platzhalter für die Namen der zu vergleichenden Dateien, falls diese per Startparameter übergeben werden können. Diese Tabelle sieht in der Entwurfsansicht wie in Bild 6 aus.

Optionen-Tabelle der Anwendung

Bild 6: Optionen-Tabelle der Anwendung

Das Formular binden wir über die Eigenschaft Datensatzquelle an die Tabelle tblOptionen. Damit es nur den einzigen Datensatz der Tabelle tblOptionen anzeigen kann, stellen wir die Eigenschaft Zyklus des Formulars auf Aktueller Datensatz ein.

Der Entwurf des Formulars soll wie in Bild 7 aussehen. Die oberen beiden Textfelder txtDatenbank1 und txtDatenbank2 sind ungebundene Felder, in welche der Benutzer die Pfade zu den Datenbanken mit den zu vergleichenden VBA-Projekten einlesen kann.

Das Formular zum Starten des Vergleichs zweier VBA-Projekte

Bild 7: Das Formular zum Starten des Vergleichs zweier VBA-Projekte

Dies geschieht über die beiden Schaltflächen cmdDatenbank1Auswaehlen und cmdDatenbank2Auswaehlen. Das Tool zur Anzeige der Unterschiede kann auf ähnliche Weise ausgewählt werden, und zwar über die Schaltfläche cmdToolAuswaehlen.

Schließlich kann der Benutzer noch Platzhalter in das Textfeld txtParameter eintragen. Es stehen die beiden Parameter [Datenbank1] und [Datenbank2] zur Verfügung. [Datenbank1] wird durch den Pfad aus dem Textfeld txtDatenbank1 ersetzt und [Datenbank2] durch den Pfad aus txtDatenbank2.

Erste/zweite Datenbank auswählen

Die Prozedur zum Auswählen der ersten Datenbank, die durch einen Klick auf die Schaltfläche cmdDatenbank1Auswaehlen ausgelöst wird, kann zum Auswählen einer oder beider zu vergleichender Datenbankdateien genutzt werden (siehe Listing 1). Letzteres ist nur möglich, wenn sich beide Dateien im gleichen Verzeichnis befinden.

Die Prozedur öffnet mit der Funktion OpenFileNameMultiple einen Dateiauswahl-Dialog und übergibt diesem das aktuelle Datenbankverzeichnis als Startverzeichnis sowie die möglichen Dateiendungen *.mdb und *.accdb. Diese können Sie nach Belieben erweitern.

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

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar