{"id":55001248,"date":"2020-08-01T00:00:00","date_gmt":"2020-08-05T10:25:33","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1248"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"VBAProjekte_vergleichen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/","title":{"rendered":"VBA-Projekte vergleichen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/2c7c159d9586488985c0c73aa7e1b5f1\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Bevor man umfangreichere &Auml;nderungen an bestehenden Anwendungen vornimmt, sollte man zumindest eine Sicherungskopie der Datenbankdatei machen. Au&szlig;en vor sind hier Entwickler, die den Code ihrer Anwendungen mit einer Quellcodeverwaltung tracken &#8211; hier kann man den Verlauf der &Auml;nderungen leicht nachvollziehen. Wer aber den Aufwand nicht betreiben will, kann auch mit einfacheren Mitteln pr&uuml;fen, welche &Auml;nderungen seit dem letzten Speichern durchgef&uuml;hrt wurden &#8211; und zwar mit der in diesem Beitrag vorgestellten L&ouml;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.<\/b><\/p>\n<p><b>VBE zugreifbar machen<\/b><\/p>\n<p>Wenn wir auf den Inhalt des VBA-Projekts einer Anwendung zugreifen wollen, ben&ouml;tigen wir die Bibliothek mit den Befehlen f&uuml;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&uuml;gbar, indem wir einen Verweis darauf zum aktuellen Projekt hinzuf&uuml;gen.<\/p>\n<p>Dazu &ouml;ffnen Sie den VBA-Editor (von Access beispielsweise mit <b>Alt + F11<\/b>) und starten dann den <b>Verweise<\/b>-Dialog mit dem Men&uuml;befehl <b>Extras|Verweise<\/b>. Hier aktivieren Sie den Eintrag <b>Microsoft Visual Basic for Applications Extensibility 5.3 Object Library <\/b>(siehe Bild 1).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1248_001.png\" alt=\"Verweis auf die Bibliothek Microsoft Visual Basic for Applications Extensibility 5.3 Object Library\" width=\"499,6607\" height=\"393,9009\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Verweis auf die Bibliothek Microsoft Visual Basic for Applications Extensibility 5.3 Object Library<\/span><\/b><\/p>\n<p>Damit k&ouml;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.<\/p>\n<p><b>VBA-Code komplett exportieren<\/b><\/p>\n<p>Die folgende Prozedur exportiert den kompletten Code eines VBA-Projekts in eine Textdatei. Sie deklariert Variablen zum Referenzieren des VBA-Editors (<b>objVBE<\/b>), des aktuellen VBA-Projekts (<b>objVBProject<\/b>), einer VBA-Komponente (<b>objVBComponent<\/b>) und des darin enthaltenen Code-Moduls (<b>objCodeModule<\/b>).<\/p>\n<p>Au&szlig;erdem ben&ouml;tigen wir noch Variablen zum Zusammenf&uuml;gen des Codes der Elemente und f&uuml;r den Dateinamen:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>CodeKomplettExportieren()\r\n     <span style=\"color:blue;\">Dim <\/span>objVBE<span style=\"color:blue;\"> As <\/span>VBIDE.VBE\r\n     <span style=\"color:blue;\">Dim <\/span>objVBProject<span style=\"color:blue;\"> As <\/span>VBIDE.VBProject\r\n     <span style=\"color:blue;\">Dim <\/span>objVBComponent<span style=\"color:blue;\"> As <\/span>VBIDE.VBComponent\r\n     <span style=\"color:blue;\">Dim <\/span>objCodemodule<span style=\"color:blue;\"> As <\/span>VBIDE.CodeModule\r\n     <span style=\"color:blue;\">Dim <\/span>strVBA<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strDateiname<span style=\"color:blue;\"> As String<\/span><\/pre>\n<p>Damit referenziert die Prozedur den VBA-Editor und ermittelt mit der Eigenschaft <b>ActiveVBProject <\/b>das aktuell ge&ouml;ffnete VBA-Projekt:<\/p>\n<pre>     <span style=\"color:blue;\">Set<\/span> objVBE = VBE\r\n     <span style=\"color:blue;\">Set<\/span> objVBProject = objVBE.ActiveVBProject<\/pre>\n<p>Dann durchl&auml;uft sie alle <b>VBComponent<\/b>-Elemente, also alle Standardmodule, Klassenmodule und Formular- und Berichtsmodule aus der Auflistung <b>VBComponents <\/b>in einer <b>For Each<\/b>-Schleife und referenziert diese mit der Variablen <b>objVBComponent<\/b>:<\/p>\n<pre>     For Each objVBComponent In objVBProject.VBComponents<\/pre>\n<p>In der Schleife referenziert die Prozedur das im <b>VBComponent<\/b>-Element enthaltene Code-Modul mit der Variablen <b>obj-CodeModule <\/b>und f&uuml;gt dieses mit einer f&uuml;hrenden und einer nachfolgenden Zeile zur optischen Hervorhebung zusammen:<\/p>\n<pre>         <span style=\"color:blue;\">Set<\/span> objCodemodule = objVBComponent.CodeModule\r\n         strVBA = strVBA & \"============================\" _\r\n             & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strVBA = strVBA & objVBComponent.Name & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strVBA = strVBA & \"============================\" _\r\n             & <span style=\"color:blue;\">vbCrLf<\/span><\/pre>\n<p>Danach folgt der eigentliche Inhalt des VBA-Moduls, der mit der <b>Lines<\/b>-Eigenschaft f&uuml;r alle Zeilen von der ersten bis zu der mit <b>CountOfLines <\/b>ermittelten letzten Zeile ermittelt wird:<\/p>\n<pre>         strVBA = strVBA & objCodemodule.Lines(1, _\r\n             objCodemodule.CountOfLines) & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">Next<\/span> objVBComponent<\/pre>\n<p>Nachdem auf diese Weise alle Module in der Variablen <b>strVBA <\/b>zusammengestellt wurden, schreibt die Prozedur deren Inhalt in eine Textdatei, die den Namen der Datenbank plus die Endung <b>.vba.txt <\/b>enth&auml;lt:<\/p>\n<pre>     strDateiname = CurrentDb.Name & \".vba.txt\"\r\n     Open strDateiname For Output<span style=\"color:blue;\"> As <\/span>#1\r\n     Print #1, strVBA\r\n     Close #1\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diesen Vorgang f&uuml;hren Sie nun mit der aktuellen und mit der zu vergleichenden Version des VBA-Projekts durch und speichern auch diese Datei.<\/p>\n<p><b>Vergleichen der beiden Dateien<\/b><\/p>\n<p>Zum Vergleichen gibt es zahlreiche Anwendungen. Wir arbeiten seit Ewigkeiten mit TextPad, welches eine Funktion zum Vergleichen des Inhalts zweier Dateien anbietet.<\/p>\n<p>Die umst&auml;ndliche Vorgehensweise hier lautet:<\/p>\n<ul>\n<li>TextPad starten<\/li>\n<li>Textdatei mit der aktuellen Version des VBA-Projekts &ouml;ffnen<\/li>\n<li>Textdatei mit der zu vergleichenden Version des VBA-Projekts &ouml;ffnen<\/li>\n<li>In Textpad den Men&uuml;befehl <b>Extras|Dateien vergleichen&#8230; <\/b>aufrufen<\/li>\n<\/ul>\n<p>TextPad zeigt dann den Dialog <b>Textdateien vergleichen<\/b> an, der die beiden aktuell ge&ouml;ffneten Dateien als erste und zweite zu vergleichende Datei anbietet (siehe Bild 2) &#8211; Sie brauchen also nur noch auf <b>OK<\/b> zu klicken.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1248_002.png\" alt=\"Optionen f&uuml;r das Vergleichen von Textdateien\" width=\"499,6607\" height=\"278,4806\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Optionen f&uuml;r das Vergleichen von Textdateien<\/span><\/b><\/p>\n<p>Danach zeigt Textpad die Unterschiede entsprechend hervorgehoben an (siehe Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1248_003.png\" alt=\"Vergleich des Inhalts zweier VBA-Projekte im Text-Editor TextPad\" width=\"700\" height=\"554,3395\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Vergleich des Inhalts zweier VBA-Projekte im Text-Editor TextPad<\/span><\/b><\/p>\n<p><b>TextPad direkt mit Dateien &ouml;ffnen<\/b><\/p>\n<p>TextPad bietet einige Startparameter an, mit denen wir unter anderem direkt eine oder mehrere Dateien angeben k&ouml;nnen, die beim Start ge&ouml;ffnet werden sollen. Dazu nutzen wir unter VBA die <b>Shell<\/b>-Funktion und geben hinter dem Pfad zur <b>TextPad.exe <\/b>die Namen der zu &ouml;ffnenden Dateien an &#8211; zur Sicherheit in Anf&uuml;hrungszeichen eingeschlossen, falls die Dateinamen Leerzeichen enthalten:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>TextPadMitDateienOeffnen()\r\n     Shell \"C:Program FilesTextPad 8TextPad.exe \"\"\" _\r\n         & c:...Datei1.vba.txt\"\" \"\"c:...Datei2.vba.txt\"\"\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Danach brauchen Sie nur noch den Men&uuml;eintrag <b>Extras|Dateien vergleichen&#8230; <\/b>aufzurufen.<\/p>\n<p><b>Add-In-Unterst&uuml;tzung<\/b><\/p>\n<p>Da die Vorgehensweise immer noch ein wenig kompliziert ist &#8211; immerhin m&uuml;ssen wir die Prozedur <b>CodeKomplettExportieren <\/b>in jede betroffene Datenbank kopieren, immer beide Datenbanken &ouml;ffnen, um den VBA-Code zu exportieren und diese dann wieder schlie&szlig;en -, behelfen wir uns mit einem kleinen, aber effizienten Access-Add-In.<\/p>\n<p>Dieses legen wir in Form einer neuen, leeren Access-Datenbank an, deren Name wir noch vor der ersten &Auml;nderung in <b>amvVBAVergleich.accda<\/b> umbenennen (<b>.accda <\/b>ist die Dateiendung, unter der Access-Add-Ins erkannt werden).<\/p>\n<p><b>USysRegInfo-Tabelle<\/b><\/p>\n<p>Damit die Datenbank als Add-In registriert werden kann, f&uuml;gen wir ihr eine Tabelle namens <b>USysRegInfo <\/b>hinzu, welche die Informatoinen enth&auml;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 &#8211; meist im Ribbon-Men&uuml; <b>Datenbanktools|Add-Ins|Add-Ins<\/b>.<\/p>\n<p>Diese Tabelle sieht wie in Bild 4 aus und muss genau die dort abgebildeten Informationen enthalten &#8211; zumindest jedoch muss der Wert in <b>Subkey <\/b>&uuml;bereinstimmen und der im vierten Datensatz angegebene Dateiname im Feld <b>Value <\/b>muss mit dem Dateinamen der Add-In-Datenbank &uuml;bereinstimmen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1248_005.png\" alt=\"Add-In-Einstellungen in der Tabelle USysRegInfo\" width=\"649,559\" height=\"297,7502\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Add-In-Einstellungen in der Tabelle USysRegInfo<\/span><\/b><\/p>\n<p><b>Datenbank-informationen<\/b><\/p>\n<p>Damit das Add-In sp&auml;ter im Add-In-Manager ordentlich angezeigt wird, stellen wir au&szlig;erdem noch Werte im Eigenschaften-Fenster von Access ein. Dieses &ouml;ffnen Sie in aktuellen Versionen von Access unter <b>Datei|Informationen <\/b>mit dem Link <b>Datenbankeigenschaften anzeigen und bearbeiten<\/b>. Hier legen Sie die Werte wie in Bild 5 fest.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1248_004.png\" alt=\"Datenbank-Eigenschaften\" width=\"424,7115\" height=\"458,8492\" \/><\/p>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Datenbank-Eigenschaften<\/span><\/b><\/p>\n<p><b>Autostart-Funktion<\/b><\/p>\n<p>Damit beim Aufrufen des Add-Ins etwas geschieht, f&uuml;gen Sie einem Standardmodul der Add-In-Datenbank eine &ouml;ffentliche Funktion namens <b>Autostart <\/b>hinzu (dass diese Funktion so hei&szlig;t, haben wir in der Tabelle <b>USysRegInfo <\/b>festgelegt). Diese Funktion soll ein Formular namens <b>frmVBAVergleich <\/b>&ouml;ffnen.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>Autostart()\r\n     DoCmd.OpenForm \"frmVBAVergleich\", WindowMode:=acDialog\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b>Das Formular frmVBAVergleich<\/b><\/p>\n<p>Dieses Formular legen wir als N&auml;chstes an. Da dieses Formular keine M&ouml;glichkeit zum Navigieren in Datens&auml;tzen anzeigen soll, stellen wir die Eigenschaften <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen <\/b>und <b>Bildlaufleisten <\/b>auf <b>Nein <\/b>ein und die Eigenschaft <b>Automatisch zentrieren <\/b>auf <b>Ja<\/b>.<\/p>\n<p>Es soll aber dennoch an eine Datenherkunft gebunden werden, n&auml;mlich an die Tabelle <b>tblOptionen<\/b>. Diese soll den Namen des aufzurufenden Tools f&uuml;r den Vergleich der VBA-Projekte speichern sowie die Konstellation der Platzhalter f&uuml;r die Namen der zu vergleichenden Dateien, falls diese per Startparameter &uuml;bergeben werden k&ouml;nnen. Diese Tabelle sieht in der Entwurfsansicht wie in Bild 6 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1248_007.png\" alt=\"Optionen-Tabelle der Anwendung\" width=\"499,6607\" height=\"344,1747\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Optionen-Tabelle der Anwendung<\/span><\/b><\/p>\n<p>Das Formular binden wir &uuml;ber die Eigenschaft <b>Datensatzquelle <\/b>an die Tabelle <b>tblOptionen<\/b>. Damit es nur den einzigen Datensatz der Tabelle <b>tblOptionen <\/b>anzeigen kann, stellen wir die Eigenschaft <b>Zyklus <\/b>des Formulars auf <b>Aktueller Datensatz <\/b>ein.<\/p>\n<p>Der Entwurf des Formulars soll wie in Bild 7 aussehen. Die oberen beiden Textfelder <b>txtDatenbank1 <\/b>und <b>txtDatenbank2 <\/b>sind ungebundene Felder, in welche der Benutzer die Pfade zu den Datenbanken mit den zu vergleichenden VBA-Projekten einlesen kann.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1248_006.png\" alt=\"Das Formular zum Starten des Vergleichs zweier VBA-Projekte\" width=\"499,6607\" height=\"293,8668\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Das Formular zum Starten des Vergleichs zweier VBA-Projekte<\/span><\/b><\/p>\n<p>Dies geschieht &uuml;ber die beiden Schaltfl&auml;chen <b>cmdDatenbank1Auswaehlen <\/b>und <b>cmdDatenbank2Auswaehlen<\/b>. Das Tool zur Anzeige der Unterschiede kann auf &auml;hnliche Weise ausgew&auml;hlt werden, und zwar &uuml;ber die Schaltfl&auml;che <b>cmdToolAuswaehlen<\/b>.<\/p>\n<p>Schlie&szlig;lich kann der Benutzer noch Platzhalter in das Textfeld <b>txtParameter <\/b>eintragen. Es stehen die beiden Parameter <b>[Datenbank1] <\/b>und <b>[Datenbank2] <\/b>zur Verf&uuml;gung. <b>[Datenbank1] <\/b>wird durch den Pfad aus dem Textfeld <b>txtDatenbank1 <\/b>ersetzt und <b>[Datenbank2] <\/b>durch den Pfad aus <b>txtDatenbank2<\/b>.<\/p>\n<p><b>Erste\/zweite Datenbank ausw&auml;hlen<\/b><\/p>\n<p>Die Prozedur zum Ausw&auml;hlen der ersten Datenbank, die durch einen Klick auf die Schaltfl&auml;che <b>cmdDatenbank1Auswaehlen <\/b>ausgel&ouml;st wird, kann zum Ausw&auml;hlen einer oder beider zu vergleichender Datenbankdateien genutzt werden (siehe Listing 1). Letzteres ist nur m&ouml;glich, wenn sich beide Dateien im gleichen Verzeichnis befinden.<\/p>\n<p>Die Prozedur &ouml;ffnet mit der Funktion <b>OpenFileNameMultiple <\/b>einen Dateiauswahl-Dialog und &uuml;bergibt diesem das aktuelle Datenbankverzeichnis als Startverzeichnis sowie die m&ouml;glichen Dateiendungen <b>*.mdb <\/b>und <b>*.accdb<\/b>. Diese k&ouml;nnen Sie nach Belieben erweitern.<\/p>\n<p>Die Funktion &ouml;ffnet den Dateiauswahl-Dialog so, dass mehr als eine Datei gleichzeitig ge&ouml;ffnet werden kann (siehe Bild 8).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1248_008.png\" alt=\"Auswahl zweier Datenbanken gleichzeitig\" width=\"649,559\" height=\"300,0977\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Auswahl zweier Datenbanken gleichzeitig<\/span><\/b><\/p>\n<p>Nach der Auswahl der Dateien &uuml;ber den Dateiauswahl-Dialog wertet die Prozedur <b>cmdDatenbank1Auswaehlen_Click <\/b>das Ergebnis aus. Wenn mehr als eine Datei ausgew&auml;hlt wurde, werden die einzelnen Pfade durch das Tabulator-Zeichen getrennt zur&uuml;ckgeliefert. Daher trennt die Prozedur das Ergebnis mit der <b>Split<\/b>-Funktion jeweils am Tabulator-Zeichen und schreibt die einzelnen Pfade in das <b>String<\/b>-Array <b>strFiles<\/b>.<\/p>\n<p>Die n&auml;chste <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft anhand der Differenz aus dem gr&ouml;&szlig;ten und dem kleinsten Index der Array-Elemente, ob mehr als ein Pfad ausgew&auml;hlt wurde. Ist das der Fall, weist die Prozedur mit einem Meldungsfenster darauf hin.<\/p>\n<p>Dann durchl&auml;uft die Prozedur alle Elemente des Arrays und weist den Pfad aus dem ersten Element dem ersten Textfeld zu und den aus dem zweiten Element dem zweiten Textfeld. Hat der Benutzer mehr als zwei Datenbanken ausgew&auml;hlt, werden die &uuml;brigen Elemente ignoriert, indem die Schleife verlassen wird.<\/p>\n<p>Schlie&szlig;lich ruft die Prozedur noch eine weitere Routine namens <b>SchaltflaecheAktivieren <\/b>auf. Diese Prozedur, die wir weiter unten erl&auml;utern, soll pr&uuml;fen, ob f&uuml;r die drei Textfelder mit Dateipfaden g&uuml;ltige Pfade ausgew&auml;hlt wurden und nur dann die Schaltfl&auml;che <b>cmdVergleichStarten <\/b>aktivieren.<\/p>\n<p>Damit diese beim Starten des Add-Ins nicht aktiviert ist, stellen wir ihre Eigenschaft <b>Aktiviert <\/b>auf <b>Nein <\/b>ein.<\/p>\n<p><b>Zweite Datei ausw&auml;hlen<\/b><\/p>\n<p>Die Schaltfl&auml;che <b>cmdDatenbank2Auswaehlen<\/b> l&ouml;st die Ereignisprozedur aus Listing 2 aus. Diese verwendet nicht die Funktion <b>OpenFileNameMultiple<\/b>, sondern die Funktion <b>OpenFileName<\/b>. Diese erlaubt lediglich die Auswahl einer einzigen Datei.<\/p>\n<p>Dementsprechend f&auml;llt auch die Auswertung des Ergebnisses etwas k&uuml;rzer aus. Hier lesen wir einfach nur den R&uuml;ckgabewert in die Variable <b>strFile <\/b>ein und schreiben diese in das Textfeld <b>txtDatenbank2<\/b>. Au&szlig;erdem rufen wir auch hier die Routine <b>SchaltflaechenAktivieren <\/b>auf.<\/p>\n<p><b>Tool zum Vergleichen ausw&auml;hlen<\/b><\/p>\n<p>Eine fast identisch aufgebaute Prozedur verwenden wir, wenn der Benutzer die Schaltfl&auml;che <b>cmdToolAuswaehlen <\/b>anklickt. Hier verwenden wir lediglich einen anderen Filter f&uuml;r die Dateiendung, n&auml;mlich <b>*.exe<\/b>. Das Ergebnis landet im Textfeld <b>txtTool<\/b>, das an das Feld <b>Tool <\/b>der Tabelle <b>tblOptionen <\/b>gebunden ist und dessen Wert folglich beim n&auml;chsten Start wiederhergestellt wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdToolAuswaehlen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strTool<span style=\"color:blue;\"> As String<\/span>\r\n     strTool = OpenFileName(CurrentProject.Path, _\r\n         \"Tool f&uuml;r Textvergleich ausw&auml;hlen\", _\r\n         \"Anwendung (*.exe)\")\r\n     Me!txtTool = strTool\r\n     SchaltflaecheAktivieren Nz(Me!txtDatenbank1), Nz(Me!txtDatenbank2), Nz(Me!txtTool)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Manuelle Eingabe von Dateien<\/b><\/p>\n<p>Es kann auch passieren, dass der Benutzer den Pfad zu den Datenbanken mit den zu vergleichenden VBA-Projekten manuell in die Textfelder eingibt. Das ist kein Problem, wir m&uuml;ssen allerdings auch in diesem Fall pr&uuml;fen, ob alle eingegebenen Pfade g&uuml;ltig und vorhanden sind. Also legen wir f&uuml;r die drei Textfelder <b>Ereignisprozeduren <\/b>an, die durch das Ereignis <b>Bei &Auml;nderungen <\/b>ausgel&ouml;st werden.<\/p>\n<p>Diese drei Prozeduren sehen wie folgt aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtDatenbank1_Change()\r\n     SchaltflaecheAktivieren Me!txtDatenbank1.Text, Nz(Me!txtDatenbank2), Nz(Me!txtTool)\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtDatenbank2_Change()\r\n     SchaltflaecheAktivieren Nz(Me!txtDatenbank1), Me!txtDatenbank2.Text, Nz(Me!txtTool)\r\n<span style=\"color:blue;\">End Sub<\/span>\r\n<span style=\"color:blue;\">Private Sub <\/span>txtTool_Change()\r\n     SchaltflaecheAktivieren Nz(Me!txtDatenbank1), Nz(Me!txtDatenbank2), Me!txtTool.Text\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wichtig ist hier, dass die Prozedur f&uuml;r das ausl&ouml;sende Textfeld nicht den Wert des Textfeldes, sondern den aktuellen Text als Parameter an die Prozedur <b>SchaltflaecheAktivieren <\/b>&uuml;bergibt.<\/p>\n<p>Wenn der Benutzer &Auml;nderungen vornimmt und damit das Ereignis <b>Bei &Auml;nderung <\/b>ausl&ouml;st, wird der Wert des Textfeldes n&auml;mlich noch nicht ge&auml;ndert, sondern nur der Wert der Eigenschaft <b>Text<\/b>. Und man kann nicht einfach den Wert der Eigenschaft <b>Text <\/b>f&uuml;r alle betroffenen Steuer-elemente &uuml;bergeben, sondern nur f&uuml;r das, welches aktuell den Fokus hat &#8211; sonst l&ouml;st man einen Fehler aus.<\/p>\n<p><b>Schaltfl&auml;che aktivieren oder deaktivieren<\/b><\/p>\n<p>Die bereits mehrfach erw&auml;hnte Schaltfl&auml;che <b>cmdVergleichStarten <\/b>soll erst aktiviert werden, wenn die drei Textfelder <b>txtDatenbank1<\/b>, <b>txtDatenbank2 <\/b>und <b>txtTool <\/b>Pfade zu g&uuml;ltigen und vorhandenen Dateien aufweisen.<\/p>\n<p>Dazu nimmt die folgende Prozedur die Inhalte der drei Textfelder entgegen und pr&uuml;ft nacheinander, ob die Dir-Funktion f&uuml;r den Pfad einen Dateinamen zur&uuml;ckliefert. Ist das bei allen drei &uuml;bergebenen Parametern der Fall, wird die Variable <b>bolAktiviert <\/b>auf <b>True <\/b>eingestellt. Dieser Wert wird dann der Eigenschaft <b>Enabled <\/b>der Schaltfl&auml;che <b>cmdVergleichStarten <\/b>zugewiesen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>SchaltflaecheAktivieren(strDatenbank1<span style=\"color:blue;\"> As <\/span>_\r\n         String, strDatenbank2<span style=\"color:blue;\"> As String<\/span>, strTool<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>bolAktiviert<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Dir(strDatenbank1)) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Dir(strDatenbank2)) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(Dir(strTool)) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 bolAktiviert = <span style=\"color:blue;\">True<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Me!cmdVergleichStarten.Enabled = bolAktiviert\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b>Vergleich starten<\/b><\/p>\n<p>Ein Klick auf die Schaltfl&auml;che aus Bild 9 startet den Vergleich der enthaltenen VBA-Projekte. Hier rufen wir f&uuml;r die beiden Dateien aus den Textfeldern <b>txtDatenbank1 <\/b>und <b>txtDatenbank2 <\/b>jeweils die Funktion <b>CodeKomplettExportieren <\/b>auf und &uuml;bergeben den Pfad zur Datenbank sowie den Wert <b>1 <\/b>oder <b>2<\/b> &#8211; je nach der Datenbank, f&uuml;r die wir die Funktion aufrufen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1248_009.png\" alt=\"Starten des Vergleichs\" width=\"424,7115\" height=\"206,8456\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Starten des Vergleichs<\/span><\/b><\/p>\n<p>Diese Funktion, die wir weiter unten beschreiben, speichert den Inhalt der VBA-Projekte im Verzeichnis der Add-In-Datenbank.<\/p>\n<p>Danach fasst die Prozedur <b>cmdVergleichStarten_Click <\/b>zun&auml;chst den Pfad zu dem Tool aus <b>txtTool <\/b>in Anf&uuml;hrungszeichen ein. Dann verarbeitet sie den Eintrag des Textfeldes <b>txtParameter<\/b>.<\/p>\n<p>Dort kann man beliebige Parameter f&uuml;r den Aufruf des Vergleichstools organisieren und dabei die beiden Platzhalter <b>[Datenbank1] <\/b>und <b>[Datenbank2] <\/b>verwenden, die durch die Pfade der zu vergleichenden Datenbankdateien ersetzt werden.<\/p>\n<p>Schlie&szlig;lich f&uuml;gt die Prozedur die Parameter an <b>strBefehl <\/b>an und ruft <b>strBefehl <\/b>mit der <b>Shell<\/b>-Funktion auf.<\/p>\n<p><b>VBA-Projekte exportieren<\/b><\/p>\n<p>Die eingangs vorgestellte Prozedur, mit der wie die VBA-Projekte exportiert haben, m&uuml;ssen wir anpassen. Die Funktion nimmt den Namen der Datenbank, deren VBA-Projekt exportiert werden soll, sowie die Nummer der zu exportierenden Datei entgegen. Letztere wird im Dateinamen der zu erzeugenden Datei verwendet.<\/p>\n<p>Warum aber m&uuml;ssen wir die Prozedur vom Beginn des Artikels &uuml;berhaupt &auml;ndern Weil wir hier nicht mehr nur einfach das VBA-Projekt der aktuellen Datenbank exportieren wollen, sondern in der Regel das VBA-Projekt der aktuell ge&ouml;ffneten Datenbank und das VBA-Projekt der zu vergleichenden Datenbank.<\/p>\n<p>Vielleicht m&ouml;chte der Benutzer sogar zwei Datenbanken vergleichen, die nicht gleich der aktuell ge&ouml;ffneten Datenbank sind.<\/p>\n<p>Deshalb referenziert die Funktion aus Listing 4 zun&auml;chst den VBA-Editor.<\/p>\n<p>Um das zu vergleichende VBA-Projekt zu referenzieren, wollen wir einen Verweis auf dieses Projekt hinzuf&uuml;gen. Dann k&ouml;nnen wir mit den Methoden des <b>VBE<\/b>-Objekts auf seine Inhalte zugreifen, ohne das wir die Datenbank per Code &ouml;ffnen m&uuml;ssen.<\/p>\n<p>Dazu ben&ouml;tigen wir als Erstes einen Verweis auf das VBA-Projekt des Add-Ins. Diesen holen wir uns in einer <b>For Each<\/b>-Schleife &uuml;ber alle <b>VBProject<\/b>-Elemente. In der Schleife pr&uuml;fen wir, ob die Eigenschaft <b>FileName <\/b>des aktuellen <b>VBProject<\/b>-Objekts mit dem Namen der mit <b>CodeDb <\/b>referenzierten Add-In-Datenbank &uuml;bereinstimmt.<\/p>\n<p>Ist das der Fall, wird die <b>For Each<\/b>-Schleife verlassen und <b>objVBProjectAddIn <\/b>referenziert das VBA-Projekt der Add-In-Datenbank.<\/p>\n<p>Dann pr&uuml;fen wir, ob dieses <b>VBProject<\/b>-Objekt vielleicht eine Referenz auf die zu untersuchende Datenbank enth&auml;lt &#8211; beispielsweise, weil die vorherige Untersuchung einen Fehler ausgel&ouml;st hat und der Verweis nicht gel&ouml;scht wurde.<\/p>\n<p>Deshalb durchlaufen wir im Anschluss alle Verweise des VBA-Projekts der Add-In-Datenbank. Hat einer der Verweise den gleichen Pfad wie die zu untersuchende Datenbank, landet dieser Verweis in der Variablen <b>ref <\/b>und die Schleife wird verlassen.<\/p>\n<p>In der Regel sollte <b>ref <\/b>hier nicht gef&uuml;llt sein, sodass wir die Referenz auf die zu untersuchende Datei neu setzen. Dazu greifen wir &uuml;ber die <b>AddFromFile<\/b>-Methode auf die mit <b>strDatei <\/b>&uuml;bergebene Datenbankdatei zu und setzen somit einen Verweis auf das enthaltene VBA-Projekt.<\/p>\n<p>Dann wollen wir noch mit der Variablen <b>objVBProject <\/b>auf das VBA-Projekt des so referenzierten Elements verweisen. Dazu durchlaufen wir nun alle VBA-Projekte des mit <b>objVBE <\/b>referenzierten VBA-Editors, bis wir ein VB-Projekt gefunden haben, dessen Wert aus der Eigenschaft <b>FileName <\/b>mit dem aus <b>strDatei <\/b>&uuml;bereinstimmt.<\/p>\n<p>Damit gehen wir dann in den Teil der Routine, den wir bereits eingangs kennengelernt haben &#8211; und in dem wir die Inhalte der einzelnen Module aneinanderf&uuml;gen und &uuml;ber die Variable <b>strVBA <\/b>in einer Textdatei speichern.<\/p>\n<p>Deren Name stellen wir indes anders als zuvor zusammen, und zwar aus dem Verzeichnis der Add-In-Datenbank, der mit <b>intDatei <\/b>&uuml;bergebenen Zahl (<b>1 <\/b>oder <b>2<\/b>) und der Dateiendung <b>.vba.txt<\/b>.<\/p>\n<p>Den Dateinamen der so gespeicherten Datei geben wir dann als Funktionswert an die aufrufende Routine zur&uuml;ck.<\/p>\n<p><b>Installieren der Add-In-Datei<\/b><\/p>\n<p>Damit fehlt lediglich noch das Installieren der Add-In-Datenbank. Dazu schlie&szlig;en Sie die <b>.accda<\/b>-Datei und rufen mit dem Ribbon-Eintrag <b>Datenbanktools|Add-Ins|Add-Ins|Add-In-Manager <\/b>den Add-In-Manager auf.<\/p>\n<p>Hier bet&auml;tigen Sie die Schaltfl&auml;che <b>Neues hinzuf&uuml;gen&#8230; <\/b>und w&auml;hlen aus dem folgenden Dialog die Add-In-Datenbank aus.<\/p>\n<p>Diese wird nach dem Hinzuf&uuml;gen wie in Bild 10 in der Liste der Add-Ins angezeigt. Die Add-In-Datenbank wird dadurch automatisch in den Add-In-Ordner kopiert und Access verwendet von nun an diese Kopie der Datenbank, wenn Sie das Add-In vom Add-In-Men&uuml; aus aufrufen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2020_04\/pic_1248_010.png\" alt=\"Anzeige des neuen Add-Ins im Add-In-Manager\" width=\"424,7115\" height=\"253,8506\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Anzeige des neuen Add-Ins im Add-In-Manager<\/span><\/b><\/p>\n<p>Wichtig an dieser Stelle f&uuml;r den Umgang mit Access-Add-Ins: Wenn Sie das Add-In einmal installiert haben, m&uuml;ssen Sie sich entscheiden, wo Sie &Auml;nderungen am Add-In durchf&uuml;hren.<\/p>\n<p>Am besten nehmen Sie die &Auml;nderungen direkt an der Version im Add-In-Verzeichnis vor, dann sind die &Auml;nderungen direkt nach dem n&auml;chsten Start von Access verf&uuml;gbar.<\/p>\n<p>Wichtig ist auch, dass Sie bei Fehlern, die zur Laufzeit bei Verwendung der Add-In-Datenbank als Add-IN auftreten, keine &Auml;nderungen am Code vornehmen, die zur Behebung des Fehlers dienen &#8211; diese werden n&auml;mlich nicht in der Add-In-Datenbank gespeichert.<\/p>\n<p>Sie m&uuml;ssen also immer Access beenden, das Add-In als Access-Datenbank von Access aus &ouml;ffnen und k&ouml;nnen erst dann die notwendigen &Auml;nderungen vornehmen. Danach k&ouml;nnen Sie dann Access neu starten und das Add-In &uuml;ber das Add-In-Men&uuml; aufrufen, um die Korrektur zu pr&uuml;fen.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>amvVBAVergleich.accda<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/F0A95500-81AE-4821-9C02-4F3BFF71C6DB\/aiu_1248.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bevor man umfangreichere &Auml;nderungen an bestehenden Anwendungen vornimmt, sollte man zumindest eine Sicherungskopie der Datenbankdatei machen. Au&szlig;en vor sind hier Entwickler, die den Code ihrer Anwendungen mit einer Quellcodeverwaltung tracken &#8211; hier kann man den Verlauf der &Auml;nderungen leicht nachvollziehen. Wer aber den Aufwand nicht betreiben will, kann auch mit einfacheren Mitteln pr&uuml;fen, welche &Auml;nderungen seit dem letzten Speichern durchgef&uuml;hrt wurden &#8211; und zwar mit der in diesem Beitrag vorgestellten L&ouml;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.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662020,66042020,44000027],"tags":[],"class_list":["post-55001248","post","type-post","status-publish","format-standard","hentry","category-662020","category-66042020","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>VBA-Projekte vergleichen - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"VBA-Projekte vergleichen\" \/>\n<meta property=\"og:description\" content=\"Bevor man umfangreichere &Auml;nderungen an bestehenden Anwendungen vornimmt, sollte man zumindest eine Sicherungskopie der Datenbankdatei machen. Au&szlig;en vor sind hier Entwickler, die den Code ihrer Anwendungen mit einer Quellcodeverwaltung tracken - hier kann man den Verlauf der &Auml;nderungen leicht nachvollziehen. Wer aber den Aufwand nicht betreiben will, kann auch mit einfacheren Mitteln pr&uuml;fen, welche &Auml;nderungen seit dem letzten Speichern durchgef&uuml;hrt wurden - und zwar mit der in diesem Beitrag vorgestellten L&ouml;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.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-08-05T10:25:33+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/2c7c159d9586488985c0c73aa7e1b5f1\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"16\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAProjekte_vergleichen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAProjekte_vergleichen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"VBA-Projekte vergleichen\",\"datePublished\":\"2020-08-05T10:25:33+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAProjekte_vergleichen\\\/\"},\"wordCount\":2961,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAProjekte_vergleichen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2c7c159d9586488985c0c73aa7e1b5f1\",\"articleSection\":[\"2020\",\"4\\\/2020\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAProjekte_vergleichen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAProjekte_vergleichen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAProjekte_vergleichen\\\/\",\"name\":\"VBA-Projekte vergleichen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAProjekte_vergleichen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAProjekte_vergleichen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2c7c159d9586488985c0c73aa7e1b5f1\",\"datePublished\":\"2020-08-05T10:25:33+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAProjekte_vergleichen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAProjekte_vergleichen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAProjekte_vergleichen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2c7c159d9586488985c0c73aa7e1b5f1\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2c7c159d9586488985c0c73aa7e1b5f1\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAProjekte_vergleichen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"VBA-Projekte vergleichen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"VBA-Projekte vergleichen - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/","og_locale":"de_DE","og_type":"article","og_title":"VBA-Projekte vergleichen","og_description":"Bevor man umfangreichere &Auml;nderungen an bestehenden Anwendungen vornimmt, sollte man zumindest eine Sicherungskopie der Datenbankdatei machen. Au&szlig;en vor sind hier Entwickler, die den Code ihrer Anwendungen mit einer Quellcodeverwaltung tracken - hier kann man den Verlauf der &Auml;nderungen leicht nachvollziehen. Wer aber den Aufwand nicht betreiben will, kann auch mit einfacheren Mitteln pr&uuml;fen, welche &Auml;nderungen seit dem letzten Speichern durchgef&uuml;hrt wurden - und zwar mit der in diesem Beitrag vorgestellten L&ouml;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.","og_url":"https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-08-05T10:25:33+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/2c7c159d9586488985c0c73aa7e1b5f1","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"16\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"VBA-Projekte vergleichen","datePublished":"2020-08-05T10:25:33+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/"},"wordCount":2961,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/2c7c159d9586488985c0c73aa7e1b5f1","articleSection":["2020","4\/2020","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/","url":"https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/","name":"VBA-Projekte vergleichen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/2c7c159d9586488985c0c73aa7e1b5f1","datePublished":"2020-08-05T10:25:33+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/2c7c159d9586488985c0c73aa7e1b5f1","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/2c7c159d9586488985c0c73aa7e1b5f1"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/VBAProjekte_vergleichen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"VBA-Projekte vergleichen"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001248","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001248"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001248\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001248"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001248"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001248"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}