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 Files\TextPad 8\TextPad.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

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

Workplace

Jahresabonnement TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar