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.