{"id":55000944,"date":"2014-08-01T00:00:00","date_gmt":"2020-05-22T21:11:50","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=944"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Von_Word_zu_AccessRichtextHTML","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Von_Word_zu_AccessRichtextHTML\/","title":{"rendered":"Von Word zu Access-Richtext\/HTML"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg07.met.vgwort.de\/na\/2881ccac4208447c84eb436c836b7960\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Das mit Access 2007 eingef&uuml;hrte Richtext-Format ist f&uuml;r viele Anwendungen interessant. Die Eingabe und Formatierung ist aber nicht wirklich ergonomisch &#8211; da sind Sie von Word mehr Komfort gewohnt. Warum aber nicht die Texte in Word eingeben und dann nach Access &uuml;bernehmen Alles, was Sie brauchen, sind einige Grundlagenkenntnisse &uuml;ber den Aufbau von Dokumenten in Word und die Absatz- und Zeichenvorlagen sowie zwei oder drei Tricks &#8211; schon haben Sie den Inhalt eines Word-Dokuments samt Formatierungen in ein Memofeld mit Richtext-Formatierung &uuml;berf&uuml;hrt.<\/b><\/p>\n<p>Damit erschlagen Sie dann gleich zwei Fliegen mit einer Klappe: Sowohl bereits existierende als auch neu erstellte Dokumente k&ouml;nnen Sie so recht einfach nach Access &uuml;berf&uuml;hren.<\/p>\n<p>Einzige Voraussetzung f&uuml;r die Verwendung der in diesem Beitrag vorgestellten Techniken ist, dass Sie die Abs&auml;tze mit entsprechenden Absatzformatvorlagen versehen haben und hervorgehobene Texte mit entsprechenden Zeichenformatvorlagen. Wenn Sie das nicht tun, w&auml;re nun ein guter Zeitpunkt, um damit zu beginnen!<\/p>\n<p>Schauen wir uns zun&auml;chst einmal an, welche Formatierungen uns das Richtext-Format von Access bietet.<\/p>\n<p>Eins vorweg: Wir k&ouml;nnen keine eigenen Formate definieren und auch nicht die g&auml;ngigen Absatzformate wie <b>h1<\/b>, <b>h2<\/b>, <b>h3 <\/b>oder <b>p <\/b>verwenden. Deshalb ist das &uuml;bertragen von Inhalten mit benannten Absatz- und Zeichenformatvorlagen eine Einbahnstra&szlig;e.<\/p>\n<p>Um die einzelnen Formatierungen zu erkennen, erstellen wir ein Experimentierformular mit zwei Textfeldern. Das erste zeigt den Inhalt im Richtext-Format an, das zweite soll den Inhalt mit HTML-Auszeichnungen anzeigen. In der Formularansicht sieht dies wie in Bild 1 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_944_001.png\" alt=\"Anzeige der HTML-Version der formatierten Texte\" width=\"450\" height=\"388,3561\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Anzeige der HTML-Version der formatierten Texte<\/span><\/b><\/p>\n<p>Der jeweils eingegebene oder formatierte Text wird gleich nach jeder &auml;nderung im rechten Textfeld mit HTML-Auszeichnungen angezeigt. Daf&uuml;r sorgt die folgende Ereignisprozedur, die durch das Ereignis <b>Bei &auml;nderung <\/b>ausgel&ouml;st wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>txtRichtext_Change()\r\n     Me!txtHTML = Me!txtRichtext.Text\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Damit das Bet&auml;tigen der Eingabetaste im linken Textfeld zum Einf&uuml;gen eines Zei-len-umbruchs f&uuml;hrt und nicht zum Wechsel zum rechten Textfeld, stellen Sie die Eigenschaft <b>Eingabetastenverhalten <\/b>auf den Wert <b>Neue Zeile im Feld <\/b>ein.<\/p>\n<p>Nun brauchen Sie nur noch die zur Verf&uuml;gung stehenden Formatierungen anzuwenden und k&ouml;nnen dann rechts die jeweiligen HTML-Auszeichnungen abgreifen.<\/p>\n<p>Das Ergebnis sieht wie folgt aus &#8211; hier zun&auml;chst f&uuml;r die Absatzformatierungen:<\/p>\n<ul>\n<li><b>&lt;div&gt;Einfacher Absatz&lt;\/div&gt;<\/b><\/li>\n<li>Leerer Absatz: <b>&lt;div&gt; &lt;\/div&gt;<\/b><\/li>\n<li><b>&lt;div&gt;Links zentrierter Absatz.&lt;\/div&gt;<\/b><\/li>\n<li><b>&lt;div align=center&gt;Mittig zentrierter Absatz.&lt;\/div&gt;<\/b><\/li>\n<li><b>&lt;div align=right&gt;Rechts zentrierter Absatz.&lt;\/div&gt;<\/b><\/li>\n<li><b>&lt;ul> &lt;li&gt;Auflistung, erster Punkt&lt;\/li&gt; &lt;li&gt;Auflistung, zweiter Punkt&lt;\/li&gt;&lt;\/ul&gt;<\/b><\/li>\n<li><b>&lt;ol&gt; &lt;li&gt;Aufz&auml;hlung, erster Punkt&lt;\/li&gt; &lt;li&gt;Aufz&auml;hlung, zweiter Punkt&lt;\/li&gt;&lt;\/ol&gt;<\/b><\/li>\n<li><b>&lt;strong&gt;fette &lt;\/strong&gt;Schrift<\/b><\/li>\n<li><b>&lt;em&gt;kursiver &lt;\/em&gt;Schrift<\/b><\/li>\n<li><b>&lt;u&gt;unterstrichener &lt;\/u&gt;Schrift<\/b><\/li>\n<li><b>&lt;strong&gt;&lt;em&gt;fette, kursive &lt;\/em&gt;&lt;\/strong&gt;Schrift<\/b><\/li>\n<li><b>&lt;font face=&#8220;Arial Narrow&#8220;&gt;andere &lt;\/font&gt;Schriftart<\/b><\/li>\n<li><b>&lt;font size=4&gt;andere &lt;\/font&gt;Schriftgr&ouml;&szlig;e<\/b><\/li>\n<li><b>&lt;font color=red&gt;farbige &lt;\/font&gt;Schrift<\/b><\/li>\n<li><b>&lt;font style=&#8220;BACKGROUND-COLOR:#FFFF00&#8243;&gt;farbiger &lt;\/font&gt;Hintergrund<\/b><\/li>\n<li><b>&lt;div&gt;Absatz mit weichemZeilenumbruch&lt;\/div&gt; <\/b>(Achtung: Bei einer weiteren &auml;nderung des Inhalts wird dieser durch <b>&lt;\/div&gt;&lt;div&gt; <\/b>ersetzt!)<\/li>\n<li><b>&lt;blockquote&gt;&lt;div&gt;Zitatabsatz&lt;\/div&gt;&lt;\/blockquote&gt;<\/b><\/li>\n<\/ul>\n<p><b>Dokumentinhalt speichern<\/b><\/p>\n<p>Nun schauen wir uns an, wie wir das Dokument beziehungsweise die einzelnen Abs&auml;tze in der Datenbank speichern k&ouml;nnen. Die einfachste M&ouml;glichkeit ist, einfach f&uuml;r jeden Absatz einen neuen Datensatz zu einer Tabelle hinzuzuf&uuml;gen. Auf diese Weise k&ouml;nnen wir sp&auml;ter ganz einfach auf die einzelnen Abs&auml;tze zugreifen und diese nach Wunsch beispielsweise mit verschiedenen Formatierungen ausstatten.<\/p>\n<p>Die Tabelle f&uuml;r diesen Zweck soll nicht nur ein Dokument gleichzeitig aufnehmen, sondern gegebenenfalls auch einmal mehrere &#8211; deshalb m&uuml;ssen wir der Tabelle noch ein Feld hinzuf&uuml;gen, welches einen Hinweis auf das Ursprungsdokument liefert. Da dies typischerweise der Dateiname sein wird und wir dieses nicht in jedem Datensatz f&uuml;r dieses Dokument wiederholen m&ouml;chten, gliedern wir den Dateinamen in eine eigene Tabelle aus, die wir dann mit der Tabelle mit den Inhalten verkn&uuml;pfen.<\/p>\n<p>Diese Tabelle hei&szlig;t <b>tblDokumente<\/b> und enth&auml;lt neben dem Prim&auml;rschl&uuml;sselfeld <b>DokumentID <\/b>lediglich ein weiteres Feld namens Dokument, welches den Pfad zu der betroffenen Datei enth&auml;lt. Dieses Feld versehen wir mit einem eindeutigen Index, damit jedes Dokument nur einmal angegeben werden kann (s. Bild 2).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_944_015.png\" alt=\"Tabelle zum Speichern der Dokumentnamen\" width=\"575\" height=\"349,3671\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Tabelle zum Speichern der Dokumentnamen<\/span><\/b><\/p>\n<p>Die Tabelle <b>tblAbsaetze<\/b>, welche die Inhalte der einzelnen Abs&auml;tze aufnehmen soll, finden Sie im Entwurf in Bild 3. Diese Tabelle enth&auml;lt nat&uuml;rlich ein Fremdschl&uuml;sselfeld, mit dem das Dokument aus der Tabelle <b>tblDokumente <\/b>ausgew&auml;hlt werden kann, zu dem der Absatz geh&ouml;rt. Au&szlig;erdem besitzt die Tabelle das Feld Inhalt zum Speichern des Inhalts des jeweiligen Absatzes. Schlie&szlig;lich fehlt noch das Feld <b>AbsatzformatID<\/b>. Genau wie bei den Dokumenten k&ouml;nnten wir die Bezeichnung des Absatzformats direkt in ein Textfeld der Tabelle <b>tblAbsaetze <\/b>eintragen. Allerdings verwenden wir auch hier eine Lookup-Tabelle, die in diesem Fall noch weitere Felder enth&auml;lt &#8211; zum Beispiel HTML-Tags, die wir sp&auml;ter zum Erzeugen eines Dokuments im Richtext-Format von Access nutzen k&ouml;nnen (dazu sp&auml;ter mehr). Diese Tabelle hei&szlig;t <b>tblAb-satz-formate <\/b>und sieht in der Entwurfsansicht wie in Bild 4 aus. Auch f&uuml;r das Feld Absatzformat dieser Tabelle legen wir einen eindeutigen Index fest, damit jede Bezeichnung eines Absatzformats nur einmal in der Tabelle gespeichert werden kann.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_944_017.png\" alt=\"Tabelle zum Speichern der Absatzformate eines Dokuments\" width=\"575\" height=\"349,2424\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Tabelle zum Speichern der Absatzformate eines Dokuments<\/span><\/b><\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_944_016.png\" alt=\"Tabelle zum Speichern der Abs&auml;tze eines Dokuments\" width=\"575\" height=\"334,7015\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Tabelle zum Speichern der Abs&auml;tze eines Dokuments<\/span><\/b><\/p>\n<p><b>Formular zum Einlesen der Dokumente<\/b><\/p>\n<p>Um die Abs&auml;tze, Formate und den Richtext f&uuml;r die eingelesenen Dokumente anzuzeigen, verwenden wir das Formular <b>frmDokumente <\/b>aus Bild 5.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_944_018.png\" alt=\"Formular zum Einlesen und Anzeigen der Dokumente\" width=\"700\" height=\"450,696\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Formular zum Einlesen und Anzeigen der Dokumente<\/span><\/b><\/p>\n<p>Dieses verwendet die Tabelle <b>tblDokumente <\/b>als Datenherkunft. Das Unterformular in diesem Formular wiederum hei&szlig;t <b>sfmDokumente <\/b>und soll die in der Tabelle <b>tblAbsaetze <\/b>gespeicherten Abs&auml;tze zu dem im Hauptformular angezeigten Formular darstellen. Es verwendet die Tabelle <b>tblAbsaetze <\/b>als Datenherkunft. Damit das Unterformular jeweils die passenden Datens&auml;tze anzeigt, stellen Sie die beiden Eigenschaften <b>Verkn&uuml;pfen von <\/b>und <b>Verkn&uuml;pfen nach <\/b>des Unterformular-Steuerelements auf den Wert <b>DokumentID <\/b>ein.<\/p>\n<p>Neben dem Textfeld <b>txtDokument<\/b>, das an das Feld Dokument der Datenherkunft gebunden ist, finden Sie eine Schaltfl&auml;che namens <b>cmdDateiAuswaehlen<\/b>. Diese ruft die Prozedur aus Listing 1 auf.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDateiAuswaehlen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strDokument<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngDokumentID<span style=\"color:blue;\"> As Long<\/span>\r\n     strDokument = OpenFileName(CurrentProject.Path, \"Dokument ausw&auml;hlen\", _\r\n         \"Word-Dokumente (*.doc;*.docx)\")\r\n     lngDokumentID = WordDokumentEinlesen(strDokument)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(lngDokumentID) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         Me.Requery\r\n         Me.Recordset.FindFirst \"DokumentID = \" & lngDokumentID\r\n         Me!sfmDokumente.Form.Requery\r\n         Me!txtRichtext = RichTextErstellen(Me!DokumentID)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Ausw&auml;hlen und Einlesen des Inhalts eines Word-Dokuments<\/span><\/b><\/p>\n<p>Die Prozedur &ouml;ffnet zun&auml;chst einen <b>Datei &ouml;ffnen<\/b>-Dialog und weist das Ergebnis der Variablen <b>strDokument <\/b>zu. Dann ruft es eine Funktion namens <b>WordDokumentEinlesen <\/b>auf und &uuml;bergibt dieser den Namen des einzulesenden Word-Dokuments. Diese Funktion steuert das Einlesen des Word-Dokuments und tr&auml;gt die Inhalte der einzelnen Abs&auml;tze in die Tabellen <b>tblDokumente <\/b>und <b>tblAbsaetze <\/b>ein. War dieser Vorgang erfolgreich, liefert sie den Prim&auml;rschl&uuml;sselwert des neuen Datenatzes der Tabelle <b>tblDokumente <\/b>zur&uuml;ck. Die Prozedur <b>cmdDateiAus-waehlen_Click <\/b>aktualisiert dann seine Datenherkunft, stellt den Datensatzzeiger auf den neuen Datensatz ein und aktualisiert auch den Inhalt des Unterformulars. Dann erstellt sie mithilfe der Funktion <b>RichtextErstellen <\/b>aus den gewonnenen Daten einen Text im Richtext-Format von Access.<\/p>\n<p>In der Praxis sollte dies dann wie in Bild 6 aussehen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_944_002.png\" alt=\"Darstellung eines Dokuments mit den einzelnen Abs&auml;tzen und mit dem resultierenden Richtext-Dokument\" width=\"700\" height=\"472,6276\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Darstellung eines Dokuments mit den einzelnen Abs&auml;tzen und mit dem resultierenden Richtext-Dokument<\/span><\/b><\/p>\n<p><b>Dokument einlesen<\/b><\/p>\n<p>Die grundlegenden Techniken zum &ouml;ffnen und Einlesen des Word-Dokuments sowie zum Ausstatten des Word-Dokuments mit entsprechenden Format- und Zeichenformatvorlagen finden Sie im Beitrag <b>Word-Dokumente einlesen <\/b>(<b>www.access-im-unternehmen.de\/943<\/b>). Die dort vorgestellte Prozedur <b>WordDokumentEinlesen <\/b>haben wir noch etwas verfeinert, sodass diese nun wie in Listing 2 aussieht. Auch hier ben&ouml;tigen wir eine Variable, die den Verweis auf die Word-Instanz speichert &#8211; diese deklarieren wir wie folgt:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>WordDokumentEinlesen(strDokument<span style=\"color:blue;\"> As String<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>objDokument<span style=\"color:blue;\"> As <\/span>Word.Document\r\n     <span style=\"color:blue;\">Dim <\/span>objAbsatz<span style=\"color:blue;\"> As <\/span>Word.Paragraph\r\n     <span style=\"color:blue;\">Dim <\/span>lngDokumentID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objDokument = DokumentOeffnen(strDokument)\r\n     <span style=\"color:blue;\">If <\/span>objDokument Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Das Dokument wurde nicht gefunden.\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     objWord.Visible = <span style=\"color:blue;\">True<\/span>\r\n     FettErsetzen objDokument\r\n     KursivErsetzen objDokument\r\n     lngDokumentID = DokumentSpeichern(strDokument)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> lngDokumentID = 0<span style=\"color:blue;\"> Then<\/span>\r\n         For Each objAbsatz In objDokument.Paragraphs\r\n                 AbsatzSpeichern objAbsatz.Range.ParagraphStyle, objAbsatz.Range.Text, lngDokumentID\r\n         <span style=\"color:blue;\">Next<\/span> objAbsatz\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     DokumentSchliessen objDokument\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: Steuerungsprozedur zum Einlesen des Word-Dokuments<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>objWord<span style=\"color:blue;\"> As <\/span>Word.Application<\/pre>\n<p>Die Prozedur erwartet den Namen der einzulesenden Datei als Parameter. Die Prozedur <b>DokumentOeffnen <\/b>(siehe im oben genannten Beitrag) &ouml;ffnet das Dokument und &uuml;bergibt einen Verweis auf dieses Dokument an die Objektvariable <b>objDokument<\/b>.<\/p>\n<p>Sollte diese Variable anschlie&szlig;end leer sein, konnte das Dokument offensichtlich nicht ge&ouml;ffnet werden, was in einer entsprechenden Meldung resultiert. Das Word-Fenster wird eingeblendet (dies k&ouml;nnen Sie auch weglassen) und die beiden Prozeduren <b>FettErsetzen<\/b> und <b>KursivErsetzen <\/b>sorgen daf&uuml;r, dass die entsprechenden formatierten Passagen im Dokument mit &ouml;ffnenden und schlie&szlig;enden HTML-Tags wie <b><b>&#8230;<\/b> <\/b>oder <b><i>&#8230;<\/i> <\/b>eingeschlossen werden.<\/p>\n<p><!--30percent--><\/p>\n<p>Dann legt die Prozedur &uuml;ber die Funktion <b>DokumentSpeichern <\/b>einen neuen Datensatz f&uuml;r das Dokument in der Tabelle <b>tblDokumente <\/b>an.<\/p>\n<p>Die Funktion liefert den Prim&auml;rschl&uuml;sselwert des neuen Datensatzes zur&uuml;ck, damit diese beim Anlegen der Datens&auml;tze in der Tabelle <b>tblAbsaetze <\/b>als Fremdschl&uuml;sselwert verwendet werden kann. Mehr zu dieser Funktion lesen Sie weiter unten.<\/p>\n<p>Sollte die Funktion einen Prim&auml;rschl&uuml;sselwert ungleich <b>0 <\/b>zur&uuml;ckliefern, durchl&auml;uft die Prozedur in einer <b>For Each<\/b>-Schleife alle Abs&auml;tze des Word-Dokuments, welche &uuml;ber die <b>Paragraphs<\/b>-Auflistung bereitgestellt werden.<\/p>\n<p>Innerhalb der Schleife ruft die Prozedur dann die Routine <b>AbsatzSpeichern <\/b>auf, die sich um das Anlegen des Datensatzes f&uuml;r den aktuellen Absatz in der Tabelle <b>tblAbsaetze <\/b>k&uuml;mmert &#8211; siehe weiter unten. Anschlie&szlig;end ruft sie die Prozedur <b>DokumentSchliessen <\/b>auf, um das soeben eingelesene Dokument zu schlie&szlig;en.<\/p>\n<p><b>Dokument-Datensatz speichern<\/b><\/p>\n<p>Die Funktion <b>DokumentSpeichern <\/b>erwartet als Parameter die Angabe des Dokumentpfades, f&uuml;r das ein neuer Datensatz in der Tabelle <b>tblDokumente <\/b>angelegt werden soll (s. Listing 3).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>DokumentSpeichern(strDokument<span style=\"color:blue;\"> As String<\/span>)<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>intError<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngDokumentID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     db.Execute \"INSERT INTO tblDokumente(Dokument) VALUES(''\" & strDokument & \"'')\", dbFailOnError\r\n     intError = Err.Number\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     Select Case intError\r\n         <span style=\"color:blue;\">Case <\/span>3022\r\n             If <span style=\"color:blue;\">MsgBox<\/span>(\"Ein gleichnamiges Dokument ist bereits vorhanden. &quot; _\r\n                     &amp; &quot;&uuml;berschreiben (Ja) oder unter neuem \" _\r\n                     & \"Namen speichern (Nein)\", vbYesNo, \"Dokument vorhanden\") = vbYes Then\r\n                 lngDokumentID = DLookup(\"DokumentID\", \"tblDokumente\", _\r\n                     &amp; \"Dokument = ''\" & strDokument & \"''\")\r\n                 db.Execute \"DELETE FROM tblAbsaetze WHERE DokumentID = \" & lngDokumentID\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 <span style=\"color:blue;\">If <\/span>BezeichnungErmitteln(strDokument, \"tblDokumente\", \"DokumentID\", \"Dokument\") _\r\n                     = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n                         db.Execute \"INSERT INTO tblDokumente(Dokument) VALUES(''\" & strDokument & \"'')\"\r\n                         lngDokumentID = db.OpenRecordset(\"SELECT @@IDENTITY\").Fields(0)\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Case <\/span>0\r\n             lngDokumentID = db.OpenRecordset(\"SELECT @@IDENTITY\").Fields(0)\r\n         <span style=\"color:blue;\">Case Else<\/span>\r\n             <span style=\"color:blue;\">MsgBox<\/span> \"Fehler \" & Err.Number & \", ''\" & Err.Description & \"''\"\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n     DokumentSpeichern = lngDokumentID\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Speichern des Datensatzes f&uuml;r das Word-Dokument<\/span><\/b><\/p>\n<p>Sie versucht dann zun&auml;chst, einen Datensatz mit dem angegebenen Dokumentpfad in der Tabelle <b>tblDokument<\/b> zu speichern &#8211; und zwar etwa mit der folgenden <b>INSERT INTO<\/b>-Anweisung:<\/p>\n<pre>INSERT INTO tblDokumente(Dokument) VALUES(''c:\\Beispiel.docx'')<\/pre>\n<p>Wenn bereits ein Datensatz mit diesem Dokumentpfad vorhanden ist, l&ouml;st dies einen Fehler aus, da das Feld <b>Dokument <\/b>mit einem eindeutigen Index ausgestattet wurde. Damit dies nicht die &uuml;bliche Fehlermeldung hervorruft, haben wir mit der Anweisung <b>On Error Resume Next <\/b>die Fehlerbehandlung deaktiviert. Stattdessen speichern wir nach dem Ausf&uuml;hren der <b>INSERT INTO<\/b>-Anweisung die Fehlernummer in der Variablen <b>intError <\/b>und aktivieren die Fehlerbehandlung mit <b>On Error Goto 0 <\/b>wieder.<\/p>\n<p>Danach analyisiert die Prozedur den Inhalt von <b>intError <\/b>in einer <b>Select Case<\/b>-Bedingung. Hat <b>intError <\/b>den Wert <b>3022<\/b>, war offensichtlich bereits ein Datensatz mit diesem Dokument vorhanden. In diesem Fall fragt die Anwendung, ob dieser Datensatz &uuml;berschrieben werden soll (<b>Ja<\/b>) oder ob der Benutzer einen neuen Pfad angeben m&ouml;chte (<b>Nein<\/b>).<\/p>\n<p>Im ersten Fall haben wir es leicht: Wir m&uuml;ssen einfach nur den Prim&auml;rschl&uuml;sselwert f&uuml;r den bereits vorhandenen Datensatz per <b>DLookup <\/b>ermitteln und die bereits in der Tabelle <b>tblAbsaetze<\/b> gespeicherten Datens&auml;tze l&ouml;schen, da diese ja gleich neu eingelesen werden sollen. Dies erledigt beispielsweise die folgende SQL-Anweisung:<\/p>\n<pre>DELETE FROM tblAbsaetze \r\nWHERE DokumentID = 5<\/pre>\n<p>M&ouml;chte der Benutzer hingegen einen neuen Dokumentpfad angeben, m&uuml;ssen wir diesen zun&auml;chst abfragen. Dazu nutzen wir die Funktion <b>Bezeichnung-Ermitteln<\/b>, die den Benutzer solange nach einem neuen Dokumentpfad fragt, bis diese einen noch nicht in der Tabelle enthaltenen Text angegeben oder den Vorgang abgebrochen hat. Die Funktion schreibt die neue Bezeichnung in die Variable <b>strDokument<\/b>, die anschlie&szlig;end weiter verwendet wird &#8211; aber nur, wenn <b>BezeichnungErmitteln <\/b>den Wert <b>True <\/b>zur&uuml;ckliefert. Diese Funktion schauen wir uns im Beitrag <b>Neue Werte in eindeutigen Feldern <\/b>(<b>www.access-im-unternehmen.de\/941<\/b>) an.<\/p>\n<p>Wenn der Benutzer einen g&uuml;ltigen Dokumentpfad angegeben hat, f&uuml;gt die Prozedur den entsprechenden Datensatz per <b>INSERT INTO<\/b>-Abfrage zur Tabelle <b>tblDokumente <\/b>hinzu. Den Wert des Prim&auml;rschl&uuml;ssels f&uuml;r den neuen Datensatz ermittelt sie dann mit der Abfrage <b>SELECT @@IDENTITY<\/b> und speichert diesen in der Variablen <b>lngDokumentID<\/b>.<\/p>\n<p>Tritt beim ersten Versuch, den Datensatz zur Tabelle hinzuzuf&uuml;gen, kein Fehler auf (<b>intError <\/b>hat dann den Wert <b>0<\/b>), ermittelt die Prozedur den neuen Prim&auml;rschl&uuml;sselwert auf die gleiche Weise. F&uuml;r alle anderen Werte von <b>intError <\/b>gibt die Funktion eine entsprechende Fehlermeldung aus. In jedem Fall gibt die Funktion aber den Wert der Variablen <b>lngDokumentID <\/b>zur&uuml;ck.<\/p>\n<p><b>Abs&auml;tze speichern<\/b><\/p>\n<p>Die Prozedur <b>AbsatzSpeichern <\/b>speichert jeweils einen Absatz in der Tabelle <b>tblAbsaetze<\/b> (s. Listing 4). Dabei erwartet sie folgende Parameter:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>AbsatzSpeichern(strAbsatzformat<span style=\"color:blue;\"> As String<\/span>, strAbsatzinhalt<span style=\"color:blue;\"> As String<\/span>, lngDokumentID<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>lngAbsatzformatID<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     lngAbsatzformatID = LookupIDErmitteln(\"tblAbsatzformate\", \"AbsatzformatID\", _\r\n         \"Absatzformat\", strAbsatzformat)\r\n     db.Execute \"INSERT INTO tblAbsaetze(DokumentID, AbsatzformatID, Inhalt) VALUES(\" _\r\n         & lngDokumentID & \", \" & lngAbsatzformatID & \", ''\" _\r\n         & <span style=\"color:blue;\">Replace<\/span>(<span style=\"color:blue;\">Replace<\/span>(<span style=\"color:blue;\">Replace<\/span>(strAbsatzinhalt, \"''\", \"''''\"), <span style=\"color:blue;\">vbCr<\/span>, \"\"), <span style=\"color:blue;\">vbLf<\/span>, \"\") _\r\n         & \"'')\", dbFailOnError\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Speichern eines einzelnen Absatzes in der Tabelle tblAbsaetze<\/span><\/b><\/p>\n<ul>\n<li><b>strAbsatzformat<\/b>: Bezeichnung des Absatzformats aus dem Word-Dokument<\/li>\n<li><b>strAbsatzinhalt<\/b>: Text des Absatzes<\/li>\n<li><b>lngDokumentID<\/b>: Prim&auml;rschl&uuml;sselwert des Datensatzes der Tabelle <b>tblDokumente<\/b>, in dem der Dokument-Datensatz gespeichert ist<\/li>\n<\/ul>\n<p>Die Prozedur ermittelt zun&auml;chst den Prim&auml;rschl&uuml;sselwert des Datensatzes der Tabelle <b>tblAbsatzformate<\/b>, welcher der Bezeichnung des Absatzes aus <b>strAbsatzformat <\/b>entspricht.<\/p>\n<p>Dies erledigt eine weitere Hilfsfunktion namens <b>LookupID-Ermitteln<\/b>, die wir ebenfalls im Beitrag <b>Neue Werte f&uuml;r eindeutig indizierte Felder <\/b>beschreiben. Diese ermittelt den Prim&auml;rschl&uuml;sselwert eines gegebenenfalls vorhandenen Datensatzes oder erstellt diesen gleich neu und liefert dessen Prim&auml;rschl&uuml;sselwert zur&uuml;ck.<\/p>\n<p>In jedem Fall ist nach dieser Anweisung die Variable <b>lngAbsatzformatID <\/b>mit einem Wert ungleich <b>0 <\/b>gef&uuml;llt, sodass wir alle Informationen zum Anlegen eines neuen Datensatzes in der Tabelle <b>tblAbsaetze <\/b>ermittelt haben. Diesen legt die Prozedur dann auch gleich mit einer entsprechenden <b>INSERT INTO<\/b>-Anweisung an, die etwa wie folgt lautet:<\/p>\n<pre>INSERT INTO tblAbsaetze(DokumentID, AbsatzformatID, Inhalt) \r\nVALUES(37, 2, ''Einleitung des Textes'')<\/pre>\n<p>Bei der Zusammenstellung der <b>INSERT INTO<\/b>-Anweisung ist zu beachten, dass dort drei verschachtelte <b>Replace<\/b>-Anweisungen einige Ersetzungen vornehmen:<\/p>\n<ul>\n<li>Einfache Hochkommata (<b>&#8220;<\/b>) durch doppelte Hochkommata (<b>&#8220;&#8220;<\/b>), da einfache Hochkommata in SQL-Ausdr&uuml;cken, die ohnehin schon in Paare einfacher Hochkommate eingefasst sind, das Ende der Zeichenkette signalisieren &#8211; was durch die danach fortgesetzte Zeichenkette zu einem Fehler f&uuml;hrt.<\/li>\n<li><b>vbCr <\/b>durch eine leere Zeichenkette (<b>&#8222;&#8220;<\/b>) &#8211; dies entfernt eventuell enthaltene Zeilenumbr&uuml;che.<\/li>\n<li><b>vbLf <\/b>durch eine leere Zeichenkette (<b>&#8222;&#8220;<\/b>) &#8211; siehe <b>vbLf<\/b>.<\/li>\n<\/ul>\n<p>Auf diese Weise legt die Prozedur einen Absatz nach dem anderen in Form eines Datensatzes der Tabelle <b>tblAbsaetze <\/b>in der Datenbank an.<\/p>\n<p>Damit haben wir bereits alle ben&ouml;tigten Daten in die Tabellen der Datenbank geschrieben. F&uuml;r unsere kleine Beispieldatei sieht dies wie in Bild 7 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_944_003.png\" alt=\"Daten des Word-Dokuments in den drei Tabellen der Beispieldatenbank\" width=\"700\" height=\"378,7934\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Daten des Word-Dokuments in den drei Tabellen der Beispieldatenbank<\/span><\/b><\/p>\n<p><b>Die Richtext-Auszeichnungen<\/b><\/p>\n<p>Bevor wir uns an die Aufgabe heranwagen, aus den in der Tabelle <b>tblAbsaetze <\/b>gespeicherten Daten Richtext zu erstellen, m&uuml;ssen wir uns noch um die dazu ben&ouml;tigten HTML-Tags k&uuml;mmern.<\/p>\n<p>Immerhin muss der nun zu erstellende Code ja wissen, in welche HTML-Tags er etwa einen Absatz einfassen soll, die mit der Formatvorlage <b>h1 <\/b>formatiert wurde. Das Problem ist, dass das Richtext-Format von Access nicht alle HTML-Tags unterst&uuml;tzt. Das zweite ist, dass wir diese dementsprechend selbst definieren und an geeigneter Stelle in der Datenbank hinterlegen m&uuml;ssen.<\/p>\n<p>Welcher Ort aber bietet sich daf&uuml;r mehr an als die Tabelle <b>tblAbsatzformate<\/b> Hier legen wir also zun&auml;chst zwei neue Felder an, die <b>HTMLAuszeichnungStart <\/b>und <b>HTMLAuszeichnungEnde <\/b>hei&szlig;en. Diese f&uuml;llen wir dann beispielsweise f&uuml;r das Absatzformat <b>h1 <\/b>mit den Werten <b>&lt;div&gt;&lt;font size=4&gt; <\/b>und <b>&lt;\/font&gt;&lt;\/div&gt;<\/b>. Aber reicht dies aus Nein: Es gibt ein paar verschachtelte Formate, zum Beispiel die Auflistungen mit und ohne Nummerierungen. Wenn Sie eine solche mit HTML-Tags im Richtext abbilden m&ouml;chten, fassen Sie nicht nur die einzelnen Abs&auml;tze in <b>&lt;li&gt; <\/b>und <b>&lt;\/li&gt;<\/b>-Tags ein. Sie m&uuml;ssen auch noch die zusammengeh&ouml;renden Auflistungspunkte entweder mit <b>&lt;ol&gt;<\/b> und <b>&lt;\/ol&gt;<\/b> (Auflistung ohne Nummerierung) beziehungsweise <b>&lt;ul&gt;<\/b> und <b>&lt;\/ul&gt;<\/b> einfassen (Auflistung mit Nummerierung). F&uuml;r eine Auflistung mit Nummerierung sieht das beispielsweise wie folgt aus:<\/p>\n<pre>&lt;ul&gt;\r\n&lt;li&gt;Erster Auflistungspunkt&lt;\/li&gt;\r\n&lt;li&gt;Zweiter Auflistungspunkt&lt;\/li&gt;\r\n&lt;\/ul&gt;<\/pre>\n<p>F&uuml;r diese absatz&uuml;bergreifenden Markierungen f&uuml;gen wir der Tabelle <b>tblAb-satzformate <\/b>also zwei weitere Felder namens <b>HTMLAuszeichnungStartExtra <\/b>und <b>HTMLAuszeichnungEndeExtra <\/b>hinzu.<\/p>\n<p>Die Tabelle sieht dann, mit den f&uuml;r unser Beispieldokument notwendigen Abs&auml;tzen, wie in Bild 8 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_944_004.png\" alt=\"HTML-Auszeichnungen in der Tabelle tblAbsatzformate\" width=\"700\" height=\"163,662\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: HTML-Auszeichnungen in der Tabelle tblAbsatzformate<\/span><\/b><\/p>\n<p><b>Richtext erstellen<\/b><\/p>\n<p>Nun wollen wir noch den Inhalt der drei Tabellen in ein Dokument im Richtext-Format von Access umwandeln. Dies erledigt die Prozedur <b>RichtextErstellen<\/b>, die als einzigen Parameter den Prim&auml;rschl&uuml;ssel des Datensatzes der Tabelle <b>tblDokumente <\/b>erwartet (s. Listing 5).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RichTextErstellen(lngDokumentID<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As String<\/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>rst<span style=\"color:blue;\"> As <\/span>DAO.Recordset\r\n     <span style=\"color:blue;\">Dim <\/span>strText<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFormatVorher<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strExtraAuszeichnungVorherigerAbsatz<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     <span style=\"color:blue;\">Set<\/span> rst = db.OpenRecordset(\"SELECT * FROM qryAbsaetzeHTML WHERE DokumentID = \" _\r\n         & lngDokumentID, 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><span style=\"color:blue;\">Len<\/span>(rst!HTMLAuszeichnungStartExtra) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> rst!Absatzformat = strFormatVorher<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strExtraAuszeichnungVorherigerAbsatz) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                     strText = strText & strExtraAuszeichnungVorherigerAbsatz & <span style=\"color:blue;\">vbCrLf<\/span>\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n                 strText = strText & rst!HTMLAuszeichnungStartExtra & <span style=\"color:blue;\">vbCrLf<\/span>\r\n             <span style=\"color:blue;\">End If<\/span>\r\n             strExtraAuszeichnungVorherigerAbsatz = rst!HTMLAuszeichnungEndeExtra & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strExtraAuszeichnungVorherigerAbsatz) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 strText = strText & strExtraAuszeichnungVorherigerAbsatz\r\n                 strExtraAuszeichnungVorherigerAbsatz = \"\"\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         strText = strText & rst!HTMLAuszeichnungStart\r\n         strText = strText & <span style=\"color:blue;\">Replace<\/span>(<span style=\"color:blue;\">Replace<\/span>(rst!Inhalt, <span style=\"color:blue;\">vbCr<\/span>, \"\"), <span style=\"color:blue;\">vbLf<\/span>, \"\")\r\n         strText = strText & rst!HTMLAuszeichnungEnde & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strFormatVorher = rst!Absatzformat\r\n         rst.Move<span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Len<\/span>(strExtraAuszeichnungVorherigerAbsatz) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strText = strText & strExtraAuszeichnungVorherigerAbsatz & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> db = Nothing\r\n     RichTextErstellen = strText\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Erstellen eines Dokuments im Richtext-Format von Access<\/span><\/b><\/p>\n<p>Die Prozedur &ouml;ffnet dann zun&auml;chst ein Recordset auf Basis der Abfrage <b>qryAbsaetzeHTML<\/b>, welche die ben&ouml;tigten Informationen zusammenfasst. Den Entwurf dieser Abfrage finden Sie in Bild 9.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_944_005.png\" alt=\"Diese Abfrage liefert alle zur Erstellung eines Richtext-Dokuments n&ouml;tigen Informationen\" width=\"700\" height=\"273,2068\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Diese Abfrage liefert alle zur Erstellung eines Richtext-Dokuments n&ouml;tigen Informationen<\/span><\/b><\/p>\n<p>Dann durchl&auml;uft die Prozedur alle Datens&auml;tze dieser Abfrage in einer <b>Do While<\/b>-Schleife. Der Inhalt dieser <b>Do While<\/b>-Schleife w&auml;re einfach gestrickt, wenn die Struktur eines Richtext-Dokuments lediglich aus aufeinanderfolgenden Abs&auml;tzen bestehen w&uuml;rde. Leider m&uuml;ssen Aufz&auml;hlungen aber in die bereits weiter oben erw&auml;hnten <b>&lt;ol&gt; <\/b>und <b><\/ol>\n<p> <\/b>beziehungsweise <b>&lt;ul&gt;<\/b>und <b>&lt;\/ul&gt;<\/b>-Tags eingeschlossen werden. Deshalb enth&auml;lt die <b>Do While<\/b>-Schleife einige Bedingungen, die pr&uuml;fen, ob gerade das erste Element einer solchen Auflistung behandelt wird und dementsprechend das umfassende HTML-Element vorangestellt werden muss oder ob es sich um das letzte Elemente einer Auflistung handelt &#8211; dies w&uuml;rde das Anh&auml;ngen des schlie&szlig;enden Auflistungs-Tags nach sich ziehen. Au&szlig;erdem verwenden wir ein paar Hilfsvariablen, die &uuml;ber den jeweiligen Status Auskunft erteilen.<\/p>\n<p>Beginnen wir mit der ersten <b>If&#8230;Then<\/b>-Bedingung: Diese pr&uuml;ft, ob das Feld <b>HTMLAuszeichnungStartExtra <\/b>des aktuellen Datensatzes einen Text enth&auml;lt, was darauf hindeutet, dass es sich um ein Auflistungselement handelt, dem gegebenenfalls ein &ouml;ffnendes oder schlie&szlig;endes Auflistungstag vorangestellt oder angef&uuml;gt werden muss.<\/p>\n<p>Im einfachsten Fall liefert diese <b>If&#8230;Then<\/b>-Bedingung den Wert <b>False<\/b>. Dann folgt der <b>Else<\/b>-Teil der Bedingung. Dort pr&uuml;ft die Prozedur, ob die Variable <b>strExtraAuszeichnungVorherigerAbsatz <\/b>einen Wert enth&auml;lt &#8211; was nur der Fall ist, wenn der vorherige Absatz ein Auflistungsabsatz war. In diesem Fall gehen wir nicht davon aus, weil es sich beispielsweise um den ersten Absatz &uuml;berhaupt handelt.<\/p>\n<p>Dann beginnt die Prozedur mit der Zusammenstellung des Richtext-Textes in der Variablen <b>strText<\/b>, indem sie den HTML-Tag aus dem Feld <b>HTMLAuszeichnungStart <\/b>des aktuellen Datensatzes hinzuf&uuml;gt. Dann folgt der Inhalt des Absatzes aus dem Feld <b>Inhalt <\/b>und schlie&szlig;lich noch das schlie&szlig;ende HTML-Tag aus dem Feld <b>HTMLAuszeichnung-Ende<\/b>. Nach dem ersten Durchlauf der <b>Do While<\/b>-Schleife k&ouml;nnte <b>strText <\/b>also beispielsweise den folgenden Text enthalten:<\/p>\n<pre>&lt;div&gt;&lt;font size=4&gt;Haupt&uuml;berschrift\r\n&lt;\/font&gt;&lt;\/div&gt;<\/pre>\n<p>Das Format dieses Absatzes aus dem Feld <b>Absatzformat <\/b>wird nun in der Variablen <b>strFormatVorher <\/b>gespeichert.<\/p>\n<p><b>Erstes Auflistungselement<\/b><\/p>\n<p>Schauen wir uns den Fall an, dass es sich um das erste einer Reihe von Auflistungselementen handelt. In diesem Fall ist die &auml;u&szlig;ere <b>If&#8230;Then<\/b>-Bedingung wahr.  Die n&auml;chste <b>If&#8230;Then<\/b>-Bedingung pr&uuml;ft, ob das aktuelle Absatzformat nicht mit dem des vorherigen Datensatzes &uuml;bereinstimmt. Dies ist hier der Fall, also folgt auch noch die Pr&uuml;fung der innersten <b>If&#8230;Then<\/b>-Bedingung. Diese pr&uuml;ft anhand der Variablen <b>strExtraAuszeichnungVorherigerDatensatz<\/b>, ob bereits der vorherige Datensatz ein Auflistungselement war. Dies ist hier nicht der Fall, also wird direkt die zweite Anweisung der mittleren <b>If&#8230;Then<\/b>-Bedingung ausgef&uuml;hrt.  <\/p>\n<p>Diese f&uuml;gt <b>strText <\/b>das HTML-Tag f&uuml;r die komplette Auflistung hinzu, also beispielsweise <b>&lt;ol&gt; <\/b>oder <b>&lt;ul&gt;<\/b>. Au&szlig;erdem wird die Variable <b>strAuszeichnungVorherigerDatensatz <\/b>mit der entsprechenden abschlie&szlig;enden Auszeichung gef&uuml;llt, also etwa <b><\/ol>\n<p> <\/b>oder <b><\/ul>\n<p><\/b>. Auch hier folgt nun das Anf&uuml;gen der eigentlichen HTML-Tags, sodass dieser Teil etwa so aussieht:<\/p>\n<pre>&lt;ul&gt;\r\n&lt;li&gt;Nummerierungspunkt 1&lt;\/li&gt;<\/pre>\n<p>Nun folgt entweder ein weiterer Auflistungspunkt oder ein Element eines anderen Absatzformats. Bei einem weiteren Auflistungspunkt gleichen Absatzformats ist die erste <b>If&#8230;Then<\/b>-Bedingung erf&uuml;llt, die zweite aber bereits nicht mehr, denn es folgt ja nun ein Absatz mit dem gleichen Absatzformat wie der vorherige Absatz. Hier wird also wiederum nur das schlie&szlig;ende Element der Auflistung in der Variablen <b>strExtraAuszeichnungVorherigerAbsatz <\/b>gef&uuml;llt. Anschlie&szlig;end folgen die HTML-Tags und der Absatz selbst &#8211; etwa so:<\/p>\n<pre>&lt;li&gt;Nummerierungspunkt 2&lt;\/li&gt;<\/pre>\n<p>Interessanterweise l&auml;uft die Prozedur auch beim letzten Auflistungspunkt genauso ab. Nach dem Abarbeiten des letzten Punktes der Auflistung wird also nicht etwa das schlie&szlig;ende Auflistungs-Tag angef&uuml;gt, also beispielsweise <b><\/ul>\n<p><\/b>.<\/p>\n<p>Stattdessen f&auml;hrt die Prozedur einfach mit dem folgenden Absatz fort. Hier trifft die Prozedur gleich bei der ersten <b>If&#8230;Then<\/b>-Bedingung wieder auf den Wert <b>True <\/b>(das Feld <b>HTMLAuszeichnungStartExtra <\/b>enth&auml;lt einen Wert und es handelt sich um ein Auflistungselement).<\/p>\n<p>Die Prozedur pr&uuml;ft nun weiter, ob das aktuelle Absatzformat dem vorherigen Absatzformat entspricht. Das aktuelle ermitteln wir wieder aus dem Feld <b>Absatzformat <\/b>des Datensatzes, das vorherige wird immer f&uuml;r den aktuellen Datensatz in der Variablen <b>strFormatVorher <\/b>abgespeichert. Schlie&szlig;lich folgt noch eine dritte <b>If&#8230;Then<\/b>-Bedingung, die pr&uuml;ft, ob auch der vorherige Absatz bereits ein Auflistungsabsatz war. Ist dies der Fall, stellen wir fest: <\/p>\n<ul>\n<li>Der vorherige Absatz war ein Auflistungsabsatz.<\/li>\n<li>Der aktuelle Absatz ist ein Auflistungsabsatz.<\/li>\n<li>Der aktuelle Absatz weist ein anderes Absatzformat auf als der vorherige.<\/li>\n<\/ul>\n<p>Dies f&uuml;hrt zu der Schlussfolgerung, dass der aktuelle Absatz eine neue Auflistung mit einem anderen Typ als im vorherigen Absatz beginnt &#8211; also folgt hier beispielsweise eine Auflistung ohne Nummerierung auf eine Auflistung mit Nummerierung. Sprich: Wir erg&auml;nzen den aktuellen Text in <b>strText <\/b>zun&auml;chst um das schlie&szlig;ende Element f&uuml;r die vorherige Auflistung.<\/p>\n<p>Das fehlende schlie&szlig;ende Element der vorherigen Auflistung wird also erst mit dem folgenden Element nachgereicht.<\/p>\n<p>Fehlt noch der Fall, bei dem der letzte Absatz ein Auflistungselement ist. In diesem Fall m&uuml;sste ja eigentlich das schlie&szlig;ende Element der Auflistung fehlen.<\/p>\n<p>Dem beugen wir schlicht und einfach mit einer weiteren <b>If&#8230;Then<\/b>-Bedingung hinter dem Ende der <b>Do While<\/b>-Schleife vor. Diese pr&uuml;ft, ob <b>strExtraAuszeichnungVorherigerAbsatz <\/b>noch einen Wert enth&auml;lt. In diesem Fall f&uuml;gen wir dem Inhalt der Variablen noch das in dieser Variablen gespeicherte schlie&szlig;ende Element an, also etwa <b><\/ol>\n<p> <\/b>oder <b><\/ul>\n<p><\/b>.<\/p>\n<p>Das Ergebnis der Funktion wird schlie&szlig;lich an die aufrufende Funktion zur&uuml;ckgegeben &#8211; und in diesem Fall in das Feld <b>Richtext <\/b>des Formulars eingetragen.<\/p>\n<p>Das Ergebnis sieht schlie&szlig;lich wie in Bild 10 aus, wo wir das Originaldokument und das Richtext-Dokument nebeneinander gestellt haben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2014_04\/pic_944_006.png\" alt=\"Vergleich des Originaldokuments und der Richtext-Version\" width=\"700\" height=\"562,3176\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Vergleich des Originaldokuments und der Richtext-Version<\/span><\/b><\/p>\n<p>Mit etwas Fingerspitzengef&uuml;hl l&auml;sst sich durch Umgestalten der Tags in der Tabelle <b>tblAbsatzformat <\/b>noch mehr herausholen.<\/p>\n<p>Dem Formular <b>frmDokumente <\/b>haben wir noch eine Schaltfl&auml;che namens <b>cmdAktualisieren <\/b>hinzugef&uuml;gt, welches das Richtext-Dokument nach &auml;nderungen direkt an den Abs&auml;tzen oder Absatzformaten im Unterformular aktualisiert. Dieses l&ouml;st die folgende Prozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAktualisieren_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strText<span style=\"color:blue;\"> As String<\/span>\r\n     strText = RichTextErstellen(Me!DokumentID)\r\n     Me!txtRichtext = strText\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>VonWordZumRichtext.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{BF67659A-6DC6-4370-9455-0A7A35A72EC7}\/aiu_944.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Das mit Access 2007 eingef&uuml;hrte Richtext-Format ist f&uuml;r viele Anwendungen interessant. Die Eingabe und Formatierung ist aber nicht wirklich ergonomisch &#8211; da sind Sie von Word mehr Komfort gewohnt. Warum aber nicht die Texte in Word eingeben und dann nach Access &uuml;bernehmen Alles, was Sie brauchen, sind einige Grundlagenkenntnisse &uuml;ber den Aufbau von Dokumenten in Word und die Absatz- und Zeichenvorlagen sowie zwei oder drei Tricks &#8211; schon haben Sie den Inhalt eines Word-Dokuments samt Formatierungen in ein Memofeld mit Richtext-Formatierung &uuml;berf&uuml;hrt.<\/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":[662014,66042014,44000026],"tags":[],"class_list":["post-55000944","post","type-post","status-publish","format-standard","hentry","category-662014","category-66042014","category-Interaktiv"],"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>Von Word zu Access-Richtext\/HTML - 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\/Von_Word_zu_AccessRichtextHTML\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Von Word zu Access-Richtext\/HTML\" \/>\n<meta property=\"og:description\" content=\"Das mit Access 2007 eingef&uuml;hrte Richtext-Format ist f&uuml;r viele Anwendungen interessant. Die Eingabe und Formatierung ist aber nicht wirklich ergonomisch - da sind Sie von Word mehr Komfort gewohnt. Warum aber nicht die Texte in Word eingeben und dann nach Access &uuml;bernehmen Alles, was Sie brauchen, sind einige Grundlagenkenntnisse &uuml;ber den Aufbau von Dokumenten in Word und die Absatz- und Zeichenvorlagen sowie zwei oder drei Tricks - schon haben Sie den Inhalt eines Word-Dokuments samt Formatierungen in ein Memofeld mit Richtext-Formatierung &uuml;berf&uuml;hrt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Von_Word_zu_AccessRichtextHTML\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:11:50+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg07.met.vgwort.de\/na\/2881ccac4208447c84eb436c836b7960\" \/>\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\\\/Von_Word_zu_AccessRichtextHTML\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Von_Word_zu_AccessRichtextHTML\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Von Word zu Access-Richtext\\\/HTML\",\"datePublished\":\"2020-05-22T21:11:50+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Von_Word_zu_AccessRichtextHTML\\\/\"},\"wordCount\":3855,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Von_Word_zu_AccessRichtextHTML\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2881ccac4208447c84eb436c836b7960\",\"articleSection\":[\"2014\",\"4\\\/2014\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Von_Word_zu_AccessRichtextHTML\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Von_Word_zu_AccessRichtextHTML\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Von_Word_zu_AccessRichtextHTML\\\/\",\"name\":\"Von Word zu Access-Richtext\\\/HTML - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Von_Word_zu_AccessRichtextHTML\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Von_Word_zu_AccessRichtextHTML\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2881ccac4208447c84eb436c836b7960\",\"datePublished\":\"2020-05-22T21:11:50+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Von_Word_zu_AccessRichtextHTML\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Von_Word_zu_AccessRichtextHTML\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Von_Word_zu_AccessRichtextHTML\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2881ccac4208447c84eb436c836b7960\",\"contentUrl\":\"http:\\\/\\\/vg07.met.vgwort.de\\\/na\\\/2881ccac4208447c84eb436c836b7960\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Von_Word_zu_AccessRichtextHTML\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Von Word zu Access-Richtext\\\/HTML\"}]},{\"@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":"Von Word zu Access-Richtext\/HTML - 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\/Von_Word_zu_AccessRichtextHTML\/","og_locale":"de_DE","og_type":"article","og_title":"Von Word zu Access-Richtext\/HTML","og_description":"Das mit Access 2007 eingef&uuml;hrte Richtext-Format ist f&uuml;r viele Anwendungen interessant. Die Eingabe und Formatierung ist aber nicht wirklich ergonomisch - da sind Sie von Word mehr Komfort gewohnt. Warum aber nicht die Texte in Word eingeben und dann nach Access &uuml;bernehmen Alles, was Sie brauchen, sind einige Grundlagenkenntnisse &uuml;ber den Aufbau von Dokumenten in Word und die Absatz- und Zeichenvorlagen sowie zwei oder drei Tricks - schon haben Sie den Inhalt eines Word-Dokuments samt Formatierungen in ein Memofeld mit Richtext-Formatierung &uuml;berf&uuml;hrt.","og_url":"https:\/\/access-im-unternehmen.de\/Von_Word_zu_AccessRichtextHTML\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:11:50+00:00","og_image":[{"url":"http:\/\/vg07.met.vgwort.de\/na\/2881ccac4208447c84eb436c836b7960","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\/Von_Word_zu_AccessRichtextHTML\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Von_Word_zu_AccessRichtextHTML\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Von Word zu Access-Richtext\/HTML","datePublished":"2020-05-22T21:11:50+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Von_Word_zu_AccessRichtextHTML\/"},"wordCount":3855,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Von_Word_zu_AccessRichtextHTML\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/2881ccac4208447c84eb436c836b7960","articleSection":["2014","4\/2014","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Von_Word_zu_AccessRichtextHTML\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Von_Word_zu_AccessRichtextHTML\/","url":"https:\/\/access-im-unternehmen.de\/Von_Word_zu_AccessRichtextHTML\/","name":"Von Word zu Access-Richtext\/HTML - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Von_Word_zu_AccessRichtextHTML\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Von_Word_zu_AccessRichtextHTML\/#primaryimage"},"thumbnailUrl":"http:\/\/vg07.met.vgwort.de\/na\/2881ccac4208447c84eb436c836b7960","datePublished":"2020-05-22T21:11:50+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Von_Word_zu_AccessRichtextHTML\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Von_Word_zu_AccessRichtextHTML\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Von_Word_zu_AccessRichtextHTML\/#primaryimage","url":"http:\/\/vg07.met.vgwort.de\/na\/2881ccac4208447c84eb436c836b7960","contentUrl":"http:\/\/vg07.met.vgwort.de\/na\/2881ccac4208447c84eb436c836b7960"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Von_Word_zu_AccessRichtextHTML\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Von Word zu Access-Richtext\/HTML"}]},{"@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\/55000944","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=55000944"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000944\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000944"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000944"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000944"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}