{"id":55000922,"date":"2014-02-01T00:00:00","date_gmt":"2020-05-22T21:19:05","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=922"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Textdateien_vergleichen","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Textdateien_vergleichen\/","title":{"rendered":"Textdateien vergleichen"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/21caf9c6c73641b7a86bf5b489cd517d\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Als ich bei verschiedenen Projekten die gleichen Module und Formulare einsetzte und diese unabh&auml;ngig voneinander anpasste, hatte ich pl&ouml;tzlich verschiedene Versionen der Objekte. Das war nicht beabsichtigt, die Objekte sollten m&ouml;glichst &uuml;berall gleich aussehen. Um keinen der Entwicklungsschritte zu verlieren, musste ich den Code der Objekte vergleichen. Dummerweise bietet Access keine eingebaute Funktion f&uuml;r so etwas, also musste ich mich selbst an die Arbeit machen und eine entsprechend L&ouml;sung programmieren. Diese sollte schlicht und einfach zwei Textdateien Zeile f&uuml;r Zeile miteinander vergleichen und mir die unterschiedlichen Zeilen anzeigen.<\/b><\/p>\n<p>Zun&auml;chst einmal muss man sich &uuml;berlegen, wie die Benutzeroberfl&auml;che eines solchen Tools aussehen k&ouml;nnte. Da hier zwei Dateien miteinander verglichen werden sollen, wird es auf jeden Fall zwei Textfelder zur Eingabe der Dateinamen geben beziehungsweise zwei Schaltfl&auml;chen, mit denen Sie einen Dateidialog zum Ausw&auml;hlen der beiden Dateien aufrufen k&ouml;nnen. Darunter befinden sich der &uuml;bersicht halber nebeneinander die Texte der beiden Dateien &#8211; gegebenenfalls mit den markierten unterschiedlichen Zeilen.<\/p>\n<p>Wenn man nun zwei Dateien zeilenweise vergleicht, sind weitere Fragen zu beantworten:<\/p>\n<ul>\n<li>Wie soll man &uuml;berhaupt zwei Textdateien zeilenweise miteinander vergleichen<\/li>\n<li>Und wie stelle ich das Ergebnis so dar, dass der Benutzer auch etwas damit anfangen kann<\/li>\n<\/ul>\n<p>Kommen wir zun&auml;chst zur zweiten Frage. Im Endergebnis soll unser Formular mit den beiden nebeneinander dargestellten Dateien etwa wie in Bild 1 aussehen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_922_001.png\" alt=\"So soll das Formular sp&auml;ter aussehen.\" width=\"700\" height=\"382,192\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: So soll das Formular sp&auml;ter aussehen.<\/span><\/b><\/p>\n<p>Gleiche Zeilen werden direkt nebeneinander dargestellt, unterschiedliche Zeilen werden nur auf der jeweiligen Seite angezeigt und au&szlig;erdem rot markiert, damit man diese sofort erkennen kann.<\/p>\n<p>Die erste Frage ist schon aufwendiger zu beantworten. In unserer L&ouml;sung verwenden wir etwa einen Ablauf wie den folgenden:<\/p>\n<p>Wir beginnen bei der ersten Zeile der ersten Datei und vergleichen diese mit der ersten Zeile der zweiten Datei. Sind beide Zeilen gleich, ist alles okay &#8211; wir bilden einfach beide Zeilen ab. Dann schauen wir uns die zweite Zeile an, bei der beispielsweise die erste Datei noch einen zus&auml;tzlichen Kommentar am Ende der Zeile enth&auml;lt. Wir stellen fest, dass die zweite Zeile nicht in beiden Dateien gleich ist. Das kann nun Verschiedenes bedeuten: Zum Beispiel kann es sein, dass sich wirklich nur die zweiten Zeilen der beiden Dateien unterscheiden. Vielleicht finden wir aber die zweite Zeile der ersten Datei auch in der dritten oder in einer sp&auml;teren Zeile der zweiten Datei &#8211; oder umgekehrt! In diesem Fall schauen wir, ob die zweite Zeile der ersten Datei fr&uuml;her in der zweiten Datei auftaucht als die zweite Zeile der zweiten Datei in der ersten. Wenn die zweite Zeile der ersten Datei fr&uuml;her in der zweiten Datei auftaucht als andersherum, zeigen wir f&uuml;r die erste Datei einige leere Zeilen an, w&auml;hrend f&uuml;r die zweite Datei die bis zur gesuchten Zeile enthaltenen Zeilen erscheinen. Erst dann sollen die beiden gleichen Zeilen nebeneinandergestellt werden.<\/p>\n<p>Am besten l&auml;sst sich dies anhand eines einfachen Beispiels erkl&auml;ren. Schauen wir uns dazu die beiden Textdateien aus Bild 2 an. Diese enthalten jeweils einen Satz, dessen W&ouml;rter auf jeweils einer eigenen Zeile abgebildet wurden. Wenn Sie diese beiden Dateien vergleichen, sollte sich das Ergebnis aus Bild 3 ergeben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_922_002.png\" alt=\"Beispieldateien f&uuml;r den Vergleich\" width=\"500\" height=\"249,1639\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Beispieldateien f&uuml;r den Vergleich<\/span><\/b><\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_922_003.png\" alt=\"Ergebnis des Vergleichs\" width=\"500\" height=\"375,8967\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Ergebnis des Vergleichs<\/span><\/b><\/p>\n<p>Die Zeilen 0, 1 und 2 stimmen in beiden Dateien &uuml;berein. Zeile 3 jedoch unterscheidet sich in den beiden Dateien. Also schauen wir zun&auml;chst, ob und wann sich der Inhalt von Zeile 3 der ersten Datei in der zweiten Datei wiederholt. Dies ist in Zeile 6 der Fall. Dann pr&uuml;ft der Algorithmus, wann sich Zeile 2 aus der zweiten Datei sich in der ersten Datei wiederholt. Dies ist gar nicht der Fall, also gehen wir davon aus, dass Zeile 2 der ersten Datei und Zeile 6 der zweiten Datei &uuml;bereinstimmen und Zeile 3, 4 und 5 der zweiten Datei eingeschoben wurden. Dann geht der Vergleich weiter, und zwar mit der jeweils folgenden Zeile nach den zueinander passenden Zeilen (also 2 und 6). Zeile 4 der ersten Datei stimmt nicht mit Zeile 7 der zweiten Datei &uuml;berein. Beide k&ouml;nnen auch im weiteren Verlauf nicht gefunden werden, also werden beide im Ergebnis in jeweils einer eigenen Zeile abgebildet.<\/p>\n<p>Zeile 5 der ersten Datei und Zeile 8 der zweiten Datei stimmen wiede-rum wieder &uuml;berein und werden folgerichtig nebeneinander abgebildet.  Zeile 6, 7, 8 und 9 der ersten Datei finden sich hingegen nicht in der zweiten Datei wieder und erscheinen solo in je einer Zeile. Dann passen wieder Zeile 11 der ersten und Zeile 9 der zweiten Datei zueinander, die &uuml;brigen Zeilen hingegen nicht.<\/p>\n<p><b>Formular anlegen<\/b><\/p>\n<p>Das Formular der L&ouml;sung soll <b>frmTextdateienVergleichen <\/b>hei&szlig;en und soll keine Daten aus einer Tabelle oder Abfrage anzeigen &#8211; also stellen wir die Eigenschaften <b>Bildlaufleisten<\/b>, <b>Datensatzmarkierer<\/b>, <b>Navigationsschaltfl&auml;chen <\/b>und <b>Trennlinien <\/b>auf <b>Nein <\/b>ein.<\/p>\n<p><b>Dateien ausw&auml;hlen<\/b><\/p>\n<p>Beginnen wir mit der Auswahl der Dateien. Dazu f&uuml;gen Sie dem Formular zwei Textfelder namens <b>txtDatei1 <\/b>und <b>txtDatei2 <\/b>hinzu. Rechts neben den Textfeldern platzieren Sie jeweils eine Schaltfl&auml;che namens <b>cmdDatei1 <\/b>und <b>cmdDatei2<\/b>.<\/p>\n<p>F&uuml;r die beiden Schaltfl&auml;chen hinterlegen Sie eine <b>Beim Klicken<\/b>-Ereignisprozedur wie in Listing 1. Die hier verwendete Prozedur <b>OpenFileName <\/b>finden Sie im Modul <b>mdlTools<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDatei1_Click()\r\n    <span style=\"color:blue;\">Dim <\/span>strDateiendung<span style=\"color:blue;\"> As String<\/span>\r\n    Me!txtDatei1 = OpenFileName(CurrentProject.Path, \"Textdatei ausw&auml;hlen\", _\r\n        \"Textdatei (*.txt)|Alle Dateien (*.*)\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Anzeigen eines Datei &ouml;ffnen-Dialogs und Eintragen des Ergebnisses im Textfeld<\/span><\/b><\/p>\n<p>Die Textfelder und Schaltfl&auml;chen legen Sie etwa wie in Bild 4 im Formular an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_922_004.png\" alt=\"Textfelder zum Erfassen der Dateinamen\" width=\"600\" height=\"208,5809\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Textfelder zum Erfassen der Dateinamen<\/span><\/b><\/p>\n<p>Damit ich beim Testen der L&ouml;sung nicht bei jedem Schlie&szlig;en und &ouml;ffnen des Formulars die Dateien neu ausw&auml;hlen musste, habe ich die zuletzt verwendete Datei in den beiden Feldern <b>Datei1 <\/b>und <b>Datei2 <\/b>einer Tabelle namens <b>tblOptionen<\/b> gespeichert (s. Bild 5).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_922_005.png\" alt=\"Optionentabelle zum Speichern der zuletzt verwendeten Dateien\" width=\"600\" height=\"125,76\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Optionentabelle zum Speichern der zuletzt verwendeten Dateien<\/span><\/b><\/p>\n<p>Das Formular ist an die Tabelle <b>tblOptionen <\/b>gebunden, die beiden Textfelder <b>txtDatei1 <\/b>und <b>txtDatei2 <\/b>an die entsprechenden Felder der Tabelle.<\/p>\n<p><b>Tabelle zum Speichern des Vergleichs<\/b><\/p>\n<p>Um das Ergebnis des Vergleichs in einer Ansicht darzustellen, gibt es mehrere M&ouml;glichkeiten &#8211; zwei Unterformulare in der Datenblattansicht, zwei Listenfelder oder auch ein einzelnes Unterformular in der Datenblattansicht.<\/p>\n<p>Nach einigen Experimenten wurde klar: Man muss durch die Ergebnisse scrollen k&ouml;nnen, und dies f&uuml;r die Zeilen aus beiden Dateien synchron. Au&szlig;erdem sollten bei Bedarf die Spaltenbreiten mit den Zeileninhalten angepasst werden k&ouml;nnen. Das Ergebnis: Es sollte ein einziges Unterformular in der Datenblattansicht mit den Zeilen der beiden Dateien und weiteren Feldern werden. Um diese Informationen nach dem Vergleich per VBA schnell in einem Formular anzeigen zu k&ouml;nnen, sollte man diese am besten in einer Tabelle speichern. Diese sieht im Entwurf wie in Bild 6 aus und hat folgende Felder:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_922_006.png\" alt=\"Tabelle zum Speichern des Ergebnisses des Vergleichs\" width=\"600\" height=\"183,5294\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Tabelle zum Speichern des Ergebnisses des Vergleichs<\/span><\/b><\/p>\n<ul>\n<li><b>ZeileID<\/b>: Prim&auml;rschl&uuml;ssel der Tabelle<\/li>\n<li><b>Unterschied<\/b>: <b>Ja\/Nein<\/b>-Feld, das angibt, ob sich die beiden abgebildeten Felder unterscheiden (es sollen standardm&auml;&szlig;ig alle Zeilen angezeigt werden, auch diejenigen, die in beiden Dateien identisch sind &#8211; dies k&ouml;nnte man gegebenenfalls variieren).<\/li>\n<li><b>ZeileDatei1<\/b>: Gibt die Nummer der Zeile innerhalb der jeweiligen Datei an, beginnt bei 0<\/li>\n<li><b>Uebernehmen1<\/b>: <b>Ja\/Nein<\/b>-Feld, mit dem der Benutzer festlegen k&ouml;nnen soll, ob diese Zeile in eine neu zu erstellende dritte Datei &uuml;bernommen werden soll<\/li>\n<li><b>TextDatei1<\/b>: Text der Zeile mit der angegebenen Zeilennummer in der ersten Datei<\/li>\n<li><b>ZeileDatei2<\/b>, <b>Uebernehmen2<\/b>, <b>Textdatei2<\/b>: siehe oben, nur f&uuml;r die zweite Textdatei<\/li>\n<\/ul>\n<p>Das Ergebnis f&uuml;r den Vergleich der beiden Beispieldateien von oben w&uuml;rde etwa wie in Bild 7 in der Tabelle gespeichert werden. Diese kann genau so als Datenherkunft f&uuml;r das Unterformular <b>sfmTextdateienVergleichen <\/b>verwendet werden, f&uuml;gen Sie dort alle Felder aus der Feldliste zum Formular hinzu. Stellen Sie au&szlig;erdem die Eigenschaft <b>Standardansicht <\/b>auf <b>Datenblatt <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_922_007.png\" alt=\"In der Tabelle tblZeilen gespeichertes Vergleichsergebnis\" width=\"575\" height=\"322,6572\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: In der Tabelle tblZeilen gespeichertes Vergleichsergebnis<\/span><\/b><\/p>\n<p><b>Dateien vergleichen<\/b><\/p>\n<p>Die Hauptarbeit beim Erstellen dieser L&ouml;sung steckte in der Programmierung der Routine, welche die Textdateien vergleicht und die Ergebnisse in die Tabelle <b>tblZeilen <\/b>eintr&auml;gt. Sie finden den ersten Teil dieser Prozedur, die durch das Anklicken der Schaltfl&auml;che <b>cmdVergleichen <\/b>ausgel&ouml;st wird, in Listing 3.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdVergleichen_Click()\r\n    <span style=\"color:blue;\">Dim <\/span>strZeilen1()<span style=\"color:blue;\"> As String<\/span>, strZeilen2()<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngAktuelleZeile1<span style=\"color:blue;\"> As Long<\/span>, lngAktuelleZeile2<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lng1<span style=\"color:blue;\"> As Long<\/span>, lng2<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n    <span style=\"color:blue;\">Dim <\/span>lngAbstand1<span style=\"color:blue;\"> As Long<\/span>, lngAbstand2<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>bolTreffer1<span style=\"color:blue;\"> As Boolean<\/span>, bolTreffer2<span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>bolEnde1<span style=\"color:blue;\"> As Boolean<\/span>, bolEnde2<span style=\"color:blue;\"> As Boolean<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>lngZeilenGesamt<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n    db.Execute \"DELETE FROM tblZeilen\", dbFailOnError\r\n    strZeilen1 = DateiInArray(Me!txtDatei1)\r\n    strZeilen2 = DateiInArray(Me!txtDatei2)\r\n    lngAktuelleZeile1 = 0\r\n    lngAktuelleZeile2 = 0\r\n    lngZeilenGesamt = <span style=\"color:blue;\">UBound<\/span>(strZeilen1)\r\n    <span style=\"color:blue;\">If <\/span>lngZeilenGesamt &lt; <span style=\"color:blue;\">UBound<\/span>(strZeilen2)<span style=\"color:blue;\"> Then<\/span>\r\n        lngZeilenGesamt = <span style=\"color:blue;\">UBound<\/span>(strZeilen2)\r\n    <span style=\"color:blue;\">End If<\/span>\r\n    SysCmd acSysCmdClearStatus\r\n    <span style=\"color:blue;\">Do While<\/span> (lngAktuelleZeile1 &lt; <span style=\"color:blue;\">UBound<\/span>(strZeilen1) And lngAktuelleZeile2 &lt; <span style=\"color:blue;\">UBound<\/span>(strZeilen2))\r\n        SysCmd acSysCmdSetStatus, \"Zeile \" & lngAktuelleZeile1 & \"\/\" & lngZeilenGesamt\r\n        lngAbstand1 = 0\r\n        lngAbstand2 = 0\r\n        <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> bolTreffer2 And <span style=\"color:blue;\">Not<\/span> bolEnde2\r\n            <span style=\"color:blue;\">If <\/span>(strZeilen1(lngAktuelleZeile1) = strZeilen2(lngAktuelleZeile2 + lngAbstand2))<span style=\"color:blue;\"> Then<\/span>\r\n                bolTreffer2 = <span style=\"color:blue;\">True<\/span>\r\n            <span style=\"color:blue;\">End If<\/span>\r\n            <span style=\"color:blue;\">If <\/span>lngAktuelleZeile2 + lngAbstand2 = <span style=\"color:blue;\">UBound<\/span>(strZeilen2) - 1<span style=\"color:blue;\"> Then<\/span>\r\n                bolEnde2 = <span style=\"color:blue;\">True<\/span>\r\n            <span style=\"color:blue;\">End If<\/span>\r\n            <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> bolTreffer2 And <span style=\"color:blue;\">Not<\/span> bolEnde2<span style=\"color:blue;\"> Then<\/span>\r\n                lngAbstand2 = lngAbstand2 + 1\r\n            <span style=\"color:blue;\">End If<\/span>\r\n        <span style=\"color:blue;\">Loop<\/span>\r\n        <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> bolTreffer1 And <span style=\"color:blue;\">Not<\/span> bolEnde1\r\n            <span style=\"color:blue;\">If <\/span>strZeilen2(lngAktuelleZeile2) = strZeilen1(lngAktuelleZeile1 + lngAbstand1)<span style=\"color:blue;\"> Then<\/span>\r\n                bolTreffer1 = <span style=\"color:blue;\">True<\/span>\r\n            <span style=\"color:blue;\">End If<\/span>\r\n            <span style=\"color:blue;\">If <\/span>lngAktuelleZeile1 + lngAbstand1 = <span style=\"color:blue;\">UBound<\/span>(strZeilen1) - 1<span style=\"color:blue;\"> Then<\/span>\r\n                bolEnde1 = <span style=\"color:blue;\">True<\/span>\r\n            <span style=\"color:blue;\">End If<\/span>\r\n            <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> bolTreffer1 And <span style=\"color:blue;\">Not<\/span> bolEnde1<span style=\"color:blue;\"> Then<\/span>\r\n                lngAbstand1 = lngAbstand1 + 1\r\n            <span style=\"color:blue;\">End If<\/span>\r\n        <span style=\"color:blue;\">Loop<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Textdateien vergleichen, Teil I<\/span><\/b><\/p>\n<p>Die Prozedur l&ouml;scht zun&auml;chst alle gegebenenfalls noch in der Tabelle <b>tblZeilen <\/b>enthaltenen Datens&auml;tze. Dann f&uuml;llt sie die beiden Array-Variablen <b>strZeilen1 <\/b>und <b>strZeilen2 <\/b>mit Arrays, die aus den einzelnen Zeilen der Dateien bestehen. Das hei&szlig;t, dass jedes Feld des Arrays je eine Zeile aufnimmt. Das Einlesen und Umwandeln der Dateien &uuml;bernimmt dabei die Funktion <b>DateiInArray <\/b>aus Listing 2. Diese erwartet den Dateinamen als Parameter. Sie &ouml;ffnet die Datei und durchl&auml;uft in einer <b>Do While<\/b>-Schleife alle Zeilen der Datei. Dabei f&uuml;gt sie jede Zeile durch einen Zeilenumbruch (<b>vbCrLf<\/b>) getrennt zur Variablen <b>strZeilen <\/b>hinzu.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DateiInArray(strDateiname<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>()\r\n    <span style=\"color:blue;\">Dim <\/span>lngFile<span style=\"color:blue;\"> As Long<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strZeile<span style=\"color:blue;\"> As String<\/span>\r\n    <span style=\"color:blue;\">Dim <\/span>strZeilen<span style=\"color:blue;\"> As String<\/span>\r\n    lngFile = FreeFile\r\n    Open strDateiname For Input<span style=\"color:blue;\"> As <\/span>#lngFile\r\n    <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> EOF(lngFile)\r\n        Line Input #lngFile, strZeile\r\n        strZeilen = strZeilen & strZeile & <span style=\"color:blue;\">vbCrLf<\/span>\r\n    <span style=\"color:blue;\">Loop<\/span>\r\n    Close #lngFile\r\n    DateiInArray = <span style=\"color:blue;\">Split<\/span>(strZeilen, <span style=\"color:blue;\">vbCrLf<\/span>)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Einlesen einer Textdatei in ein Array<\/span><\/b><\/p>\n<p>Aus dem Ergebnis erzeugt die Routine mit der <b>Split<\/b>-Funktion ein Array und gibt dieses an die aufrufende Prozedur zur&uuml;ck.<\/p>\n<p>Dies geschieht f&uuml;r beide Textdateien, die entsprechenden Arrays befinden sich nun in den Variablen <b>strZeilen1 <\/b>und <b>strZeilen2<\/b>. Der Z&auml;hler f&uuml;r die aktuelle Zeile eines jeden Arrays wird mit den Variablen <b>lngAktuelleZeile1 <\/b>und <b>lngAktuelleZeile2 <\/b>jeweils auf <b>0 <\/b>eingestellt. Dann ermittelt die Prozedur die Gesamtzahl der Zeilen der l&auml;ngeren Datei.<\/p>\n<p>Dazu liest sie erst die Anzahl der Zeilen im ersten Array ein und pr&uuml;ft dann, ob die Anzahl der Zeilen im zweiten Array gr&ouml;&szlig;er als die des ersten Arrays ist. Der gr&ouml;&szlig;ere Wert landet in der Variablen <b>lngZeilenGesamt<\/b>. Danach leert die Prozedur die Statuszeile von Access, die in der Folge den Fortschrift beim Vergleich der beiden Dateien anzeigen soll.<\/p>\n<p>Dann geht es richtig los! Eine <b>Do While<\/b>-Schleife wird solange durchlaufen, bis die in <b>lngAktuelleZeile1<\/b> und <b>lngAktuelleZeile2 <\/b>gespeicherten aktuell bearbeiteten Zeilen nicht mehr kleiner als die Gesamtzahl der Zeilen der jeweiligen Datei sind. Dabei stellt die Prozedur zun&auml;chst den Statustext von Access auf einen Ausdruck wie <b>Zeile 1\/100 <\/b>ein.<\/p>\n<p>Es folgen nun zwei <b>Do While<\/b>-Schleifen. Die erste ermittelt, in welcher Zeile der zweiten Datei die erste Zeile der ersten Datei erstmalig auftaucht und speichert die Anzahl der Zeilen, die dazwischen liegen, in der Variablen <b>lngAbstand1<\/b>. Die zweite <b>Do While<\/b>-Schleife erledigt diesen Job genau andersherum. Dabei stellen die Anweisungen in den beiden <b>Do While<\/b>-Schleifen auch die Variablen <b>bolTreffer1 <\/b>und <b>bolTreffer2 <\/b>ein. <b>bolTreffer1 <\/b>erh&auml;lt beispielsweise den Wert <b>True<\/b>, wenn in der zweiten Datei eine Zeile gefunden werden konnte, die der aktuellen Zeile der ersten Datei entspricht, sonst erh&auml;lt sie den Wert <b>False<\/b>. F&uuml;r <b>bolTreffer2 <\/b>wird der Wert genau andersherum ermittelt.<\/p>\n<p>Im Detail vergleicht die erste <b>Do While<\/b>-Schleife die aktuelle Zeile der ersten Datei mit der aktuellen Zeile der zweiten Datei. Sind die Zeilen gleich, stellt die Prozedur den Wert <b>bolTreffer2 <\/b>auf den Wert <b>True <\/b>ein. Ist mit dieser Zeile der zweiten Datei die letzte Zeile erreicht, stellt die Prozedur den Wert von <b>bolEnde2 <\/b>auf <b>True <\/b>ein. Enthalten die beiden Variablen <b>bolTreffer2 <\/b>und <b>bolEnde2 <\/b>nach diesen Pr&uuml;fungen den Wert <b>False<\/b>, erh&ouml;ht die Prozedur den Z&auml;hler <b>lngAbstand2 <\/b>um den Wert <b>1<\/b>, sodass im n&auml;chsten Durchlauf der Schleife die aktuelle Zeile der ersten Datei mit der n&auml;chsten Zeile der zweiten Datei verglichen werden kann. Dies wiederholt sich, bis die Abbruchbedingung der <b>Do While<\/b>-Schleife erf&uuml;llt ist.<\/p>\n<p>Die zweite <b>Do While<\/b>-Schleife erledigt dies umgekehrt, indem sie die aktuelle Zeile der zweiten Datei zuerst mit der aktuellen Zeile der ersten Datei vergleicht und, falls kein Treffer gefunden wurde, auch mit den folgenden Zeilen.<\/p>\n<p>Am Ende der beiden Schleifen erhalten wir also die folgenden Informationen:<\/p>\n<ul>\n<li><b>bolTreffer1<\/b>: Falls <b>True<\/b>, wurde eine Zeile in der ersten Datei gefunden, die der aktuellen Zeile der zweiten Datei entspricht.<\/li>\n<li><b>bolTreffer2<\/b>: Falls <b>True<\/b>, wurde eine Zeile in der zweiten Datei gefunden, die der aktuellen Zeile der ersten Datei entspricht.<\/li>\n<li><b>lngAbstand1<\/b>: Abstand der Zeile der ersten Datei, die mit der aktuellen Zeile der zweiten Datei &uuml;bereinstimmt.<\/li>\n<li><b>lngAbstand2<\/b>: Abstand der Zeile der zweiten Datei, die mit der aktuellen Zeile der ersten Datei &uuml;bereinstimmt.<\/li>\n<\/ul>\n<p>Mit diesem Resultat gehen wir in den zweiten Teil der Schleife f&uuml;r die aktuell untersuchten Zeilen der beiden Dateien (s. Listing 4).<\/p>\n<pre>        <span style=\"color:blue;\">If <\/span>bolTreffer1 = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n            <span style=\"color:blue;\">If <\/span>bolTreffer2 = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n                <span style=\"color:blue;\">If <\/span>lngAbstand1 = 0 And lngAbstand2 = 0<span style=\"color:blue;\"> Then<\/span>\r\n                Einfuegen12 db, lngAktuelleZeile1, strZeilen1(lngAktuelleZeile1), _\r\n                    lngAktuelleZeile2, strZeilen2(lngAktuelleZeile2)\r\n                <span style=\"color:blue;\">Else<\/span>\r\n                    <span style=\"color:blue;\">If <\/span>lngAbstand1 &lt;= lngAbstand2<span style=\"color:blue;\"> Then<\/span>\r\n                    For lng1 = lngAktuelleZeile1 To lngAktuelleZeile1 + lngAbstand1 - 1\r\n                            Einfuegen1 db, lngAktuelleZeile1, strZeilen1(lng1)\r\n                            lngAktuelleZeile1 = lngAktuelleZeile1 + 1\r\n                        <span style=\"color:blue;\">Next<\/span> lng1\r\n                        Einfuegen12 db, lngAktuelleZeile1, strZeilen1(lngAktuelleZeile1), _\r\n                            lngAktuelleZeile2, strZeilen2(lngAktuelleZeile2)\r\n                    <span style=\"color:blue;\">Else<\/span>\r\n                    For lng2 = lngAktuelleZeile2 To lngAktuelleZeile2 + lngAbstand2 - 1\r\n                            Einfuegen2 db, lngAktuelleZeile2, strZeilen2(lng2)\r\n                            lngAktuelleZeile2 = lngAktuelleZeile2 + 1\r\n                        <span style=\"color:blue;\">Next<\/span> lng2\r\n                        Einfuegen12 db, lngAktuelleZeile1, strZeilen1(lngAktuelleZeile1), _\r\n                            lngAktuelleZeile2, strZeilen2(lngAktuelleZeile2)\r\n                    <span style=\"color:blue;\">End If<\/span>\r\n                <span style=\"color:blue;\">End If<\/span>\r\n            <span style=\"color:blue;\">Else<\/span>\r\n            For lng1 = lngAktuelleZeile1 To lngAktuelleZeile1 + lngAbstand1 - 1\r\n                    Einfuegen1 db, lngAktuelleZeile1, strZeilen1(lng1)\r\n                    lngAktuelleZeile1 = lngAktuelleZeile1 + 1\r\n                <span style=\"color:blue;\">Next<\/span> lng1\r\n                Einfuegen12 db, lngAktuelleZeile1, strZeilen1(lngAktuelleZeile1), _\r\n                    lngAktuelleZeile2, strZeilen2(lngAktuelleZeile2)\r\n            <span style=\"color:blue;\">End If<\/span>\r\n        <span style=\"color:blue;\">Else<\/span>\r\n            <span style=\"color:blue;\">If <\/span>bolTreffer2 = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n            For lng2 = lngAktuelleZeile2 To lngAktuelleZeile2 + lngAbstand2 - 1\r\n                    Einfuegen2 db, lngAktuelleZeile2, strZeilen2(lng2)\r\n                    lngAktuelleZeile2 = lngAktuelleZeile2 + 1\r\n                <span style=\"color:blue;\">Next<\/span> lng2\r\n                Einfuegen12 db, lngAktuelleZeile1, strZeilen1(lngAktuelleZeile1), lngAktuelleZeile2, _\r\n                    strZeilen2(lngAktuelleZeile2)\r\n            <span style=\"color:blue;\">Else<\/span>\r\n            Einfuegen1 db, lngAktuelleZeile1, strZeilen1(lngAktuelleZeile1)\r\n                Einfuegen2 db, lngAktuelleZeile2, strZeilen2(lngAktuelleZeile2)\r\n            <span style=\"color:blue;\">End If<\/span>\r\n        <span style=\"color:blue;\">End If<\/span>\r\n        lngAktuelleZeile1 = lngAktuelleZeile1 + 1\r\n        lngAktuelleZeile2 = lngAktuelleZeile2 + 1\r\n        bolTreffer1 = <span style=\"color:blue;\">False<\/span>\r\n        bolTreffer2 = <span style=\"color:blue;\">False<\/span>\r\n        bolEnde1 = <span style=\"color:blue;\">False<\/span>\r\n        bolEnde2 = <span style=\"color:blue;\">False<\/span>\r\n    <span style=\"color:blue;\">Loop<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Textdateien vergleichen, Teil II<\/span><\/b><\/p>\n<p>Hier folgt eine ganze Reihe verschachtelter <b>If&#8230;Then<\/b>-Bedingungen. Die erste Bedingung pr&uuml;ft, ob <b>bolTreffer1 <\/b>den Wert <b>True <\/b>hat. Ist dies wahr, folgt direkt eine untergeordnete <b>If&#8230;Then<\/b>-Abfrage, die pr&uuml;ft, ob auch <b>bolTreffer2 <\/b>wahr ist.<\/p>\n<p>Das bedeutet zun&auml;chst, dass beide aktuell untersuchten Zeilen der beiden Dateien irgendwo in der jeweils anderen Datei auftauchen.<\/p>\n<p>Im besten Fall entsprechen die beiden untersuchten Zeilen der beiden Dateien einander (dies ist etwa bei den in Bild 8 markierten Eintr&auml;gen der Fall).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_922_008.png\" alt=\"&uuml;bereinstimmende Zeilen in beiden Textdateien\" width=\"700\" height=\"167,5757\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: &uuml;bereinstimmende Zeilen in beiden Textdateien<\/span><\/b><\/p>\n<p>Sprich: Die beiden Schleifen von oben mussten nur je einmal durchlaufen werden, dann waren die Bedingung <b>bolTreffer1 <\/b>und <b>bolTreffer2 <\/b>wahr und die beiden Variablen <b>lngAbstand1 <\/b>und <b>lngAbstand2 <\/b>behielten den Wert <b>0<\/b> (siehe  in Listing 4). In diesem Fall ruft die Prozedur eine weitere Routine namens <b>Einlesen12<\/b> auf (s. Listing 5), die mit <b>db <\/b>einen Verweis auf das aktuelle <b>Database<\/b>-Objekt, die Nummer der aktuellen Zeile der ersten Datei (<b>lngAktuelleZeile1<\/b>), die entsprechende Zeile aus dem Array (<b>strZeilen1(lngAktuelleZeile1)<\/b>), die Nummer der aktuellen Zeile der zweiten Datei (<b>lngAktuelleZeile2 <\/b>sowie die Zeile der zweiten Datei aus dem Array (<b>strZeilen2(lngAktuelleZeile2)<\/b>) als Parameter erwartet.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Einfuegen12(db<span style=\"color:blue;\"> As <\/span>DAO.Database, lngZeile1<span style=\"color:blue;\"> As Long<\/span>, _\r\n        strZeile1<span style=\"color:blue;\"> As String<\/span>, lngZeile2<span style=\"color:blue;\"> As Long<\/span>, strZeile2<span style=\"color:blue;\"> As String<\/span>)\r\n    db.Execute \"INSERT INTO tblZeilen(ZeileDatei1, TextDatei1, ZeileDatei2, TextDatei2) &quot; _\r\n        &quot;VALUES(\" & lngZeile1 & \", ''\" _\r\n        & <span style=\"color:blue;\">Replace<\/span>(strZeile1, \"''\", \"''''\") & \"'', \" & lngZeile2 & \", ''\" _\r\n        & <span style=\"color:blue;\">Replace<\/span>(strZeile2, \"''\", \"''''\") & \"'')\", dbFailOnError\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Einf&uuml;gen eines Datensatzes mit &uuml;bereinstimmenden Zeilen in die Tabelle tblZeilen<\/span><\/b><\/p>\n<p>Sind <b>lngAbstand1 <\/b>und <b>lngAbstand2 <\/b>nicht beide gleich <b>0<\/b>, steuert die Prozedur den <b>Else<\/b>-Teil der <b>If&#8230;Then<\/b>-Bedingung an . In diesem Fall pr&uuml;ft die Prozedur in einer weiteren untergeordneten <b>If&#8230;Then<\/b>-Bedingung, ob <b>lngAbstand1 <\/b>kleiner oder gleich <b>lngAbstand2 <\/b>ist. Das bedeutet, dass die zur aktuellen Zeile der zweiten Datei passende Zeile der ersten Datei n&auml;her als die zur aktuellen Zeile der ersten Datei passende Zeile der zweiten Datei ist. Ist dies der Fall, durchl&auml;uft die Prozedur eine <b>For&#8230;Next<\/b>-Schleife f&uuml;r alle Zeilen von der mit dem Index <b>lngAktuelleZeile1 <\/b>bis zu der mit dem Index <b>lngAktuelleZeile + lngAbstand1 &#8211; 1<\/b>. Dabei f&uuml;gt sie mit der in der Prozedur <b>Einfuegen1 <\/b>alle Zeilen der ersten Datei in die Tabelle <b>tblZeilen <\/b>ein, die zwischen der aktuellen Zeile und der Zeile liegen, die mit der aktuellen Zeile der zweiten Datei &uuml;bereinstimmt. Ein Beispiel dazu finden Sie in Bild 9.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_922_010.png\" alt=\"Beide erste Zeilen sind sp&auml;ter zu finden, die aus der zweiten Datei jedoch fr&uuml;her\" width=\"575\" height=\"208,4959\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Beide erste Zeilen sind sp&auml;ter zu finden, die aus der zweiten Datei jedoch fr&uuml;her<\/span><\/b><\/p>\n<p>Die Prozedur <b>Einfuegen1 <\/b>f&uuml;gt einen neuen Datensatz zur Tabelle <b>tblZeilen <\/b>hinzu, der nur die Zeile aus der ersten Datei enth&auml;lt und die Zeile f&uuml;r die zweite Datei freil&auml;sst (s. Listing 6).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Einfuegen1(db<span style=\"color:blue;\"> As <\/span>DAO.Database, lngZeile<span style=\"color:blue;\"> As Long<\/span>, strZeile<span style=\"color:blue;\"> As String<\/span>)\r\n    db.Execute \"INSERT INTO tblZeilen(Unterschied, ZeileDatei1, TextDatei1) VALUES(-1, \" _\r\n        & lngZeile & \", ''\" _\r\n        & <span style=\"color:blue;\">Replace<\/span>(strZeile, \"''\", \"''''\") & \"'')\", dbFailOnError\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Einf&uuml;gen eines Datensatzes mit der aktuellen Zeile aus der ersten Datei in die Tabelle tblZeilen<\/span><\/b><\/p>\n<p>Erst wenn alle zwischen der aktuellen Zeile aus der ersten Datei und der mit der aktuellen Zeile der zweiten Datei &uuml;bereinstimmenden Zeile der ersten Datei liegenden Zeilen der ersten Datei allein in Datens&auml;tze der Tabelle <b>tblZeilen <\/b>eingetragen wurden, f&uuml;gt die Prozedur mithilfe der Routine <b>Einfuegen12<\/b>, die Sie bereits weiter oben kennen gelernt haben, die &uuml;bereinstimmenden Datens&auml;tze in die Tabelle <b>tblZeilen<\/b> ein (im Beispiel sind dies die beiden Zeilen mit dem Wert <b>Zeile2<\/b>).<\/p>\n<p>Andersherum sieht es im <b>Else<\/b>-Teil dieser <b>If&#8230;Then<\/b>-Bedingung aus : Hier wurde die aktuelle Zeile der ersten Datei schneller in der zweiten Datei wiedergefunden als die aktuelle Zeile der zweiten Datei in der ersten Datei. Deshalb tr&auml;gt die Prozedur zuerst alle Zeilen der zweiten Datei allein in Datens&auml;tze der Tabelle <b>tblZeilen <\/b>ein, die zwischen der aktuellen Zeile der zweiten Datei und der mit der aktuellen Zeile der ersten Datei &uuml;bereinstimmenden Zeile der zweiten Datei liegen. Dies erledigt die Prozedur durch einen Aufruf der Routine <b>Einlesen2 <\/b>aus Listing 7. Erst dann folgen wieder die beiden gleichen Zeilen in einem Datensatz der Tabelle <b>tblZeilen<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Einfuegen2(db<span style=\"color:blue;\"> As <\/span>DAO.Database, lngZeile<span style=\"color:blue;\"> As Long<\/span>, strZeile<span style=\"color:blue;\"> As String<\/span>)\r\n    db.Execute \"INSERT INTO tblZeilen(Unterschied, ZeileDatei2, TextDatei2) VALUES(-1, \" _\r\n        & lngZeile & \", ''\" _\r\n        & <span style=\"color:blue;\">Replace<\/span>(strZeile, \"''\", \"''''\") & \"'')\", dbFailOnError\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Einf&uuml;gen eines Datensatzes mit der aktuellen Zeile aus der zweiten Datei in die Tabelle tblZeilen<\/span><\/b><\/p>\n<p>Ab der Markierung  folgt die n&auml;chste Konstellation: Hier ist <b>bolTreffer1 <\/b>wahr, <b>bolTreffer2 <\/b>aber falsch. Das bedeutet, dass die aktuelle Zeile der zweiten Datei zwar in der ersten gefunden wurde, die aktuelle Zeile der ersten Datei aber nicht in der zweiten.<\/p>\n<p>Das bedeutet, dass die Prozedur alle Zeilen der ersten Datei von der aktuellen Zeile bis zu der Zeile durchl&auml;uft, die mit der aktuellen Zeile der zweiten Datei &uuml;bereinstimmt und die Zeilen der ersten Datei jeweils allein in Datens&auml;tze der Tabelle <b>tblZeilen <\/b>eintr&auml;gt. Erst dann folgt ein Datensatz, der die aktuelle Zeile der zweiten Datei enth&auml;lt und die dazu passende Zeile der ersten Datei.<\/p>\n<p>Der Abschnitt  behandelt den genau umgekehrten Fall: Hier ist <b>bolTreffer1 <\/b>falsch und <b>bolTreffer2 <\/b>war.<\/p>\n<p>Ein Beispiel dazu finden Sie in Bild 10: Hier kommt zwar das Wort <b>zur <\/b>der ersten Datei in der zweiten Datei vor, aber nicht das Wort egal der zweiten Datei in der ersten Datei. Also durchl&auml;uft die Prozedur in einer Schleife alle Zeilen der zweiten Datei bis zu der Zeile, die mit der aktuellen Zeile der ersten Datei &uuml;bereinstimmt.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_922_009.png\" alt=\"Der Abstand bis zum n&auml;chsten gleichen Element legt fest, wieviele Zeilen allein in der Tabelle tblZeilen landen.\" width=\"700\" height=\"281,4017\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Der Abstand bis zum n&auml;chsten gleichen Element legt fest, wieviele Zeilen allein in der Tabelle tblZeilen landen.<\/span><\/b><\/p>\n<p>Schlie&szlig;lich folgt Abschnitt . Hier findet die Prozedur weder die aktuelle Zeile der ersten Datei in oder hinter der aktuellen Zeile der zweiten Datei wieder, noch umgekehrt &#8211; also ist <b>bolTreffer1 <\/b>falsch und <b>bolTreffer2 <\/b>auch. Das bedeutet, dass die Prozedur hier schlicht nacheinander die Routinen <b>Einfuegen1 <\/b>und <b>Einfuegen2 <\/b>aufruft, um erst die aktuelle Zeile der ersten Datei in einen eigenen Datensatz zu schreiben und dann die aktuelle Zeile der zweiten Datei.<\/p>\n<p>Nach dem Eintragen der jeweiligen Zeilen in die Tabelle <b>tblZeilen <\/b>f&uuml;gt die Prozedur jeweils den Wert <b>1 <\/b>zu den beiden Variablen <b>lngAktuelleZeile1 <\/b>und <b>lngAktuelle2 <\/b>hinzu. Au&szlig;erdem stellt sie die Variablen <b>bolTreffer1<\/b>, <b>bolTreffer2<\/b>, <b>bolEnde1 <\/b>und <b>bolEnde2 <\/b>wieder auf den Wert <b>False <\/b>ein.<\/p>\n<p>Fehlt noch der letzte Teil der Prozedur <b>cmdVergleichen_Click<\/b>, den Sie in Listing 8 finden. Dieser pr&uuml;ft, ob jeweils die letzte Zeile der ersten und der zweiten Datei erreicht wurde, und durchl&auml;uft gegebenenfalls in einer <b>Do While<\/b>-Schleife die verbleibenden Datens&auml;tze.<\/p>\n<pre>    <span style=\"color:blue;\">Do While<\/span> lngAktuelleZeile1 &lt; <span style=\"color:blue;\">UBound<\/span>(strZeilen1)\r\n        Einfuegen1 db, lngAktuelleZeile1, strZeilen1(lngAktuelleZeile1)\r\n        lngAktuelleZeile1 = lngAktuelleZeile1 + 1\r\n    <span style=\"color:blue;\">Loop<\/span>\r\n    <span style=\"color:blue;\">Do While<\/span> lngAktuelleZeile2 &lt; <span style=\"color:blue;\">UBound<\/span>(strZeilen2)\r\n        Einfuegen2 db, lngAktuelleZeile2, strZeilen2(lngAktuelleZeile2)\r\n        lngAktuelleZeile2 = lngAktuelleZeile2 + 1\r\n    <span style=\"color:blue;\">Loop<\/span>    \r\n    SysCmd acSysCmdClearStatus\r\n    Me!sfmTextdateienVergleichen.Form.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Textdateien vergleichen, Teil III<\/span><\/b><\/p>\n<p>Dabei verwendet sie wiederum die Prozeduren <b>Einfuegen1 <\/b>und <b>Einfuegen2<\/b>, um die Zeilen in die Tabelle <b>tblZeilen <\/b>zu schreiben.<\/p>\n<p><b>Unterschiede farbig hervorheben<\/b><\/p>\n<p>Die Zeilen, die nicht in der jeweils anderen Datei vorkommen, sollten entsprechend hervorgehoben werden &#8211; am besten in der Farbe <b>Rot<\/b>. Hier hilft die bedingte Formatierung weiter: Wir markieren also die beiden Felder <b>TextDatei1 <\/b>und <b>TextDatei2 <\/b>und zeigen f&uuml;r diese den Dialog zum Anlegen bedingter Formatierungen an. Dort &ouml;ffnen Sie mit einem Klick auf <b>Neue Regel <\/b>den Dialog <b>Formatierungsregel bearbeiten<\/b>. Stellen Sie dort das linke Kombinationsfeld auf <b>Ausdruck ist: <\/b>ein und geben Sie f&uuml;r das rechte Feld den folgenden Ausdruck an:<\/p>\n<pre>[Unterschied]=-1<\/pre>\n<p>Au&szlig;erdem legen Sie als Formatierung die rote Schriftfarbe fest (s. Bild 11).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_922_012.png\" alt=\"Definieren einer bedingten Formatierung f&uuml;r unterschiedliche Felder\" width=\"575\" height=\"336,3896\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 11: Definieren einer bedingten Formatierung f&uuml;r unterschiedliche Felder<\/span><\/b><\/p>\n<p>Dies bewirkt, dass der Text der beiden Felder immer rot markiert wird, wenn das Feld <b>Unterschied <\/b>des aktuellen Datensatzes den Wert <b>False <\/b>aufweist. Diesen Wert legen die Prozeduren <b>Einfuegen1 <\/b>und <b>Einfuegen2 <\/b>fest, die Sie bereits weiter oben kennengelernt haben.<\/p>\n<p><b>Unterschiedliche Zeilen vergleichen<\/b><\/p>\n<p>Wenn zwei Zeilen, die eigentlich gleich sein sollten, sich unterscheiden, m&ouml;chten Sie vielleicht genauer herausfinden, wo der Unterschied liegt.<\/p>\n<p>Ein Beispiel f&uuml;r eine solche Situation sehen Sie in Bild 12. Die erste Zeile der beiden Dateiinhalte unterscheidet sich und ist entsprechend dargestellt. Wenn man den Unterschied erkennen wollte, m&uuml;sste man zun&auml;chst das Formular und dann die Spaltenbreiten vergr&ouml;&szlig;ern und dann auch noch sehr genau auf die beiden Zeilen schauen. Das k&ouml;nnte man einfacher haben, wenn man die beiden Zeilen einfach untereinander anzeigt. Dies erledigen wir mit einem weiteren Formular namens <b>frmVergleiche<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_922_011.png\" alt=\"Der Unterschied zwischen den beiden Zeilen ist nicht auf den ersten Blick zu erkennen.\" width=\"700\" height=\"250,2729\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 12: Der Unterschied zwischen den beiden Zeilen ist nicht auf den ersten Blick zu erkennen.<\/span><\/b><\/p>\n<p>Um das Formular zu &ouml;ffnen, markieren Sie zun&auml;chst die zu vergleichenden Zeileninhalte, indem Sie die Kontrollk&auml;stchen links daneben anhaken und dann auf die Schaltfl&auml;che <b>Markierte vergleichen <\/b>klicken. Sie m&uuml;ssen sich dabei nicht auf zwei zu vergleichende Zeilen beschr&auml;nken, sondern k&ouml;nnen beliebig viele Zeilen markieren.<\/p>\n<p>Die durch die Schaltfl&auml;che ausgel&ouml;ste Prozedur <b>cmdMarkierteZeilenVergleichen_Click<\/b> finden Sie in Listing 9. Sie leert zun&auml;chst eine Tabelle namens <b>tblVergleiche<\/b>. Dann &ouml;ffnet sie ein Recordset auf Basis der Tabelle <b>tblZeilen<\/b>, wobei nur solche Datens&auml;tze ber&uuml;cksichtigt werden sollen, deren Feld <b>Uebernehmen1 <\/b>oder <b>Uebernehmen2 <\/b>den Wert <b>True <\/b>aufweist &#8211; dies sind die zuvor markierten Datens&auml;tze.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdMarkierteZeilenVergleichen_Click()\r\n    <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n    <span style=\"color:blue;\">Dim <\/span>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n    <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n    db.Execute \"DELETE FROM tblVergleiche\", dbFailOnError\r\n    <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM tblZeilen WHERE Uebernehmen1 = <span style=\"color:blue;\">True<\/span> &quot; _\r\n        &quot;OR Uebernehmen2 = True\", dbOpenDynaset)\r\n    <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> rst.EOF\r\n        <span style=\"color:blue;\">If <\/span>rst!Uebernehmen1 = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n            db.Execute \"INSERT INTO tblVergleiche(Dateinummer, Zeilennummer, Textzeile) &quot; _\r\n                &quot;VALUES(1, \" & rst!ZeileDatei1 & \", ''\" & rst!TextDatei1 & \"'')\", dbFailOnError\r\n        <span style=\"color:blue;\">End If<\/span>\r\n        <span style=\"color:blue;\">If <\/span>rst!Uebernehmen2 = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n            db.Execute \"INSERT INTO tblVergleiche(Dateinummer, Zeilennummer, Textzeile) &quot; _\r\n                &quot;VALUES(2, \" & rst!ZeileDatei2 & \", ''\" & rst!TextDatei2 & \"'')\", dbFailOnError\r\n        <span style=\"color:blue;\">End If<\/span>\r\n        rst.Move<span style=\"color:blue;\">Next<\/span>\r\n    <span style=\"color:blue;\">Loop<\/span>\r\n    DoCmd.OpenForm \"frmVergleiche\"\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: Aufrufen des Formulars frmVergleiche<\/span><\/b><\/p>\n<p>Anschlie&szlig;end durchl&auml;uft die Prozedur eine <b>Do While<\/b>-Schleife auf Basis des Recordsets. Innerhalb der Schleife pr&uuml;ft sie zuerst, ob das Feld <b>Uebernehmen1 <\/b>den Wert <b>True <\/b>hat, und f&uuml;gt in diesem Fall einen Datensatz zur Tabelle <b>tblVergleiche <\/b>hinzu.<\/p>\n<p>Den gleichen Vorgang erledigt die Prozedur in einer weiteren <b>If&#8230;Then<\/b>-Bedingung f&uuml;r das Feld <b>Uebernehmen2<\/b>. Auch hier landen die passenden Datens&auml;tze in der Tabelle <b>tblVergleiche<\/b>. Diese sieht anschlie&szlig;end etwa wie in Bild 13 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_01\/pic_922_013.png\" alt=\"Die Tabelle tblVergleiche mit Beispieldaten\" width=\"650\" height=\"126,9048\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 13: Die Tabelle tblVergleiche mit Beispieldaten<\/span><\/b><\/p>\n<p>Das Formular <b>frmVergleiche <\/b>zeigt schlicht und einfach die Datens&auml;tze der Tabelle <b>tblVergleiche <\/b>in einem Unterformular namens <b>sfmVergleiche <\/b>an.<\/p>\n<p>Durch die Verwendung der Schriftart Courier New werden die Zeichen genau untereinander angezeigt, was den Vergleich erleichtert.<\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Gerade f&uuml;r Access-Entwickler, die Module in verschiedenen Entwicklungsstadien &uuml;ber ihre Anwendungen verteilt haben, kann die hier vorgestellte L&ouml;sung hilfreich sein. Die Texte der einzelnen Module m&uuml;ssen dann aus den jeweiligen Anwendungen heraus in Textdateien gespeichert werden und k&ouml;nnen dann verglichen werden.<\/p>\n<p>Noch praktischer w&auml;re es, wenn diese L&ouml;sung als Add-In arbeiten w&uuml;rde und Sie damit direkt die zu vergleichenden Anwendungen und die enthaltenen Codemodule ausw&auml;hlen k&ouml;nnten.<\/p>\n<p>Einen Schritt weiter ginge noch eine M&ouml;glichkeit, aus den unterschiedlichen Versionen eines Moduls eine Version zu erstellen und diese dann in alle betroffenen Datenbanken zu schreiben. Dies k&ouml;nnte das Thema eines weiteren Beitrags sein.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>TextdateienVergleichen.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{8C53DC3D-DED6-49D4-9B77-23F1BEBDCE67}\/aiu_922.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Als ich bei verschiedenen Projekten die gleichen Module und Formulare einsetzte und diese unabh&auml;ngig voneinander anpasste, hatte ich pl&ouml;tzlich verschiedene Versionen der Objekte. Das war nicht beabsichtigt, die Objekte sollten m&ouml;glichst &uuml;berall gleich aussehen. Um keinen der Entwicklungsschritte zu verlieren, musste ich den Code der Objekte vergleichen. Dummerweise bietet Access keine eingebaute Funktion f&uuml;r so etwas, also musste ich mich selbst an die Arbeit machen und eine entsprechend L&ouml;sung programmieren. Diese sollte schlicht und einfach zwei Textdateien Zeile f&uuml;r Zeile miteinander vergleichen und mir die unterschiedlichen Zeilen anzeigen.<\/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":[66012014,662014,44000027],"tags":[],"class_list":["post-55000922","post","type-post","status-publish","format-standard","hentry","category-66012014","category-662014","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>Textdateien 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\/Textdateien_vergleichen\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Textdateien vergleichen\" \/>\n<meta property=\"og:description\" content=\"Als ich bei verschiedenen Projekten die gleichen Module und Formulare einsetzte und diese unabh&auml;ngig voneinander anpasste, hatte ich pl&ouml;tzlich verschiedene Versionen der Objekte. Das war nicht beabsichtigt, die Objekte sollten m&ouml;glichst &uuml;berall gleich aussehen. Um keinen der Entwicklungsschritte zu verlieren, musste ich den Code der Objekte vergleichen. Dummerweise bietet Access keine eingebaute Funktion f&uuml;r so etwas, also musste ich mich selbst an die Arbeit machen und eine entsprechend L&ouml;sung programmieren. Diese sollte schlicht und einfach zwei Textdateien Zeile f&uuml;r Zeile miteinander vergleichen und mir die unterschiedlichen Zeilen anzeigen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Textdateien_vergleichen\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:19:05+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/21caf9c6c73641b7a86bf5b489cd517d\" \/>\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=\"22\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textdateien_vergleichen\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textdateien_vergleichen\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Textdateien vergleichen\",\"datePublished\":\"2020-05-22T21:19:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textdateien_vergleichen\\\/\"},\"wordCount\":3730,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textdateien_vergleichen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/21caf9c6c73641b7a86bf5b489cd517d\",\"articleSection\":[\"1\\\/2014\",\"2014\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Textdateien_vergleichen\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textdateien_vergleichen\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textdateien_vergleichen\\\/\",\"name\":\"Textdateien vergleichen - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textdateien_vergleichen\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textdateien_vergleichen\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/21caf9c6c73641b7a86bf5b489cd517d\",\"datePublished\":\"2020-05-22T21:19:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textdateien_vergleichen\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Textdateien_vergleichen\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textdateien_vergleichen\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/21caf9c6c73641b7a86bf5b489cd517d\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/21caf9c6c73641b7a86bf5b489cd517d\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Textdateien_vergleichen\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Textdateien 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":"Textdateien 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\/Textdateien_vergleichen\/","og_locale":"de_DE","og_type":"article","og_title":"Textdateien vergleichen","og_description":"Als ich bei verschiedenen Projekten die gleichen Module und Formulare einsetzte und diese unabh&auml;ngig voneinander anpasste, hatte ich pl&ouml;tzlich verschiedene Versionen der Objekte. Das war nicht beabsichtigt, die Objekte sollten m&ouml;glichst &uuml;berall gleich aussehen. Um keinen der Entwicklungsschritte zu verlieren, musste ich den Code der Objekte vergleichen. Dummerweise bietet Access keine eingebaute Funktion f&uuml;r so etwas, also musste ich mich selbst an die Arbeit machen und eine entsprechend L&ouml;sung programmieren. Diese sollte schlicht und einfach zwei Textdateien Zeile f&uuml;r Zeile miteinander vergleichen und mir die unterschiedlichen Zeilen anzeigen.","og_url":"https:\/\/access-im-unternehmen.de\/Textdateien_vergleichen\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:19:05+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/21caf9c6c73641b7a86bf5b489cd517d","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"22\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Textdateien_vergleichen\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Textdateien_vergleichen\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Textdateien vergleichen","datePublished":"2020-05-22T21:19:05+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Textdateien_vergleichen\/"},"wordCount":3730,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Textdateien_vergleichen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/21caf9c6c73641b7a86bf5b489cd517d","articleSection":["1\/2014","2014","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Textdateien_vergleichen\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Textdateien_vergleichen\/","url":"https:\/\/access-im-unternehmen.de\/Textdateien_vergleichen\/","name":"Textdateien vergleichen - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Textdateien_vergleichen\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Textdateien_vergleichen\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/21caf9c6c73641b7a86bf5b489cd517d","datePublished":"2020-05-22T21:19:05+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Textdateien_vergleichen\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Textdateien_vergleichen\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Textdateien_vergleichen\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/21caf9c6c73641b7a86bf5b489cd517d","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/21caf9c6c73641b7a86bf5b489cd517d"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Textdateien_vergleichen\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Textdateien 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\/55000922","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=55000922"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000922\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000922"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000922"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000922"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}