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).
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.
Bild 2: Optionen für das Vergleichen von Textdateien
Danach zeigt Textpad die Unterschiede entsprechend hervorgehoben an (siehe Bild 3).
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.
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.
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.
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.
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