{"id":55000802,"date":"2011-10-01T00:00:00","date_gmt":"2020-05-22T21:58:38","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=802"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"VBAFunktionen_fuer_Entwickler","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_fuer_Entwickler\/","title":{"rendered":"VBA-Funktionen f&uuml;r Entwickler"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/ec0887d6e9494aaa910d8a1fdd823e09\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>In dieser Ausgabe unserer Tipps-und-Tricks-Reihe stellen wir Ihnen einige Funktionen vor, die Sie speziell als Entwickler einsetzen k&ouml;nnen. Sie erfahren beispielsweise, wie Sie neue Versionsnummern ermitteln, eine Versionsnummer auf G&uuml;ltigkeit pr&uuml;fen und verschiedene Versionsst&auml;nde vergleichen, ob eine Datenbank eine .mde\/.accde-Datei ist, wie Sie Texte per Code in die Zwischenablage kopieren oder wie Sie Zeichenketten f&uuml;r den Einsatz in URLs vorbereiten.<\/b><\/p>\n<p><b>Versionen fortschreiben<\/b><\/p>\n<p>Angenommen, Sie m&ouml;chten Ihrer Anwendung auf Knopfdruck eine neue Versionsnummer verpassen &#8211; beispielsweise, indem Sie diese in das Feld <b>Version<\/b> einer Optionentabelle schreiben.<\/p>\n<p>Ausgehend davon, dass Sie eine aus vier Elementen bestehende Versionsnummer verwenden (zum Beispiel <b>1.0.0.7<\/b>), m&uuml;ssen Sie zun&auml;chst festlegen, welche Stelle der Versionsnummer ge&auml;ndert werden soll.<\/p>\n<p>Bei der letzten Stelle ist dies kein Problem: Die wird einfach hochgez&auml;hlt (etwa von <b>1.0.0.7 <\/b>auf <b>1.0.0.8<\/b>). Bei allen anderen Stellen ist sind jedoch auch noch die folgenden Stellen auf <b>0 <\/b>einzustellen, zum Beispiel von <b>1.0.0.8 <\/b>auf <b>1.0.1.0<\/b>, von <b>1.0.1.9 <\/b>auf <b>1.1.0.0 <\/b>oder auch von <b>1.2.3.4 <\/b>auf <b>2.0.0.0<\/b>.<\/p>\n<p>Die Funktion aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-anchor\">Listing 1<\/a><\/span> erledigt dies, indem sie einfach die Position der zu &auml;ndernden Stelle abfragt und als Ergebnis die neue Versionsnummer zur&uuml;ckliefert.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Neue Versionsnummer ermitteln<\/p>\n<pre>Public Function NeueVersion(strVersion) As String\r\n    Dim strVersionsstufen() As String\r\n    Dim intVersionsebene As Integer\r\n    intVersionsebene = InputBox(&quot;Aktuelle Versionsnummer: &quot; &amp; strVersion &amp; vbCrLf _\r\n        &amp; &quot;Welche Stelle erh&ouml;hen&quot;, &quot;Neue Version&quot;, 4)\r\n    strVersionsstufen() = Split(strVersion, &quot;.&quot;)\r\n    Select Case intVersionsebene\r\n        Case 1\r\n            strVersionsstufen(0) = strVersionsstufen(0) + 1\r\n            strVersionsstufen(1) = 0\r\n            strVersionsstufen(2) = 0\r\n            strVersionsstufen(3) = 0\r\n        Case 2\r\n            strVersionsstufen(1) = strVersionsstufen(1) + 1\r\n            strVersionsstufen(2) = 0\r\n            strVersionsstufen(3) = 0\r\n        Case 3\r\n            strVersionsstufen(2) = strVersionsstufen(2) + 1\r\n            strVersionsstufen(3) = 0\r\n        Case 4\r\n            strVersionsstufen(3) = strVersionsstufen(3) + 1\r\n    End Select\r\n    strVersion = Join(strVersionsstufen(), &quot;.&quot;)\r\n    NeueVersion = strVersion\r\nEnd Function<\/pre>\n<p>Die Funktion erwartet als Parameter die aktuelle Versionsnummer in der Form <b>x.x.x.x<\/b>. Sie fragt als Erstes mit einer Inputbox die Stelle ab, die erh&ouml;ht werden soll. Die Inputbox erwartet einen Wert zwischen <b>1 <\/b>und <b>4<\/b>.<\/p>\n<p>Die einzelnen Ebenen der Versionsnummer werden dann mit der Funktion <b>Split <\/b>in die Felder des Arrays <b>intVersionsstufen <\/b>geschrieben. Die folgende <b>Select Case<\/b>-Bedingung verzweigt entsprechend der zu &auml;ndernden Ebene der Versionsnummer.<\/p>\n<p>Die zur jeweiligen Ebene geh&ouml;rende Zahl wird um eins erh&ouml;ht, die danach folgenden Ebenen auf <b>0 <\/b>eingestellt. Die <b>Join<\/b>-Anweisung f&uuml;gt die neuen Versionsstufen wieder zu einer vollst&auml;ndigen Versionsnummer zusammen.<\/p>\n<p>Die Funktion finden Sie im Modul <b>mdlVersionsnummern <\/b>der Beispieldatenbank.<\/p>\n<p><b>Versionsst&auml;nde vergleichen<\/b><\/p>\n<p>Wenn Sie mit Versionsst&auml;nden arbeiten, m&ouml;chten Sie vielleicht auch einmal zwei Versionsst&auml;nde vergleichen.<\/p>\n<p>Wenn man sich darauf einigt, zumindest f&uuml;r die hinteren drei Zahlen, also Hauptversionsnummer, Nebenversionsnummer, Revisionsnummer und Buildnummer (also etwa 1.0.3.8), nur einstellige Zahlen zu verwenden, k&ouml;nnte man einfach die Trennzeichen (wie den Punkt) weglassen und die resultierenden Zahlenwerte vergleichen.<\/p>\n<p>In der Regel gibt es aber auch Versionsst&auml;nde wie <b>2.1.13.1048<\/b>, und dort greift diese Vorgehensweise nicht mehr.<\/p>\n<p>Also ben&ouml;tigen wir eine etwas ausgefeiltere Funktion, um zu pr&uuml;fen, ob ein Versionsstand neuer als ein anderer ist. Diese Pr&uuml;fung erledigt die Funktion <b>IstVersionAktueller <\/b>aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-28-anchor\">Listing 2<\/a><\/span>.<\/p>\n<p class=\"listingueberschrift\">Listing 2: Pr&uuml;fen, ob eine Versionsnummer aktueller als die andere ist<\/p>\n<pre>Public Function IstVersionAktueller(strVersionNeu As String, strVersionAlt As String) As Boolean\r\n    Dim strVersionsstufenNeu() As String\r\n    Dim strVersionsstufenAlt() As String\r\n    Dim intNeu As Integer\r\n    Dim intAlt As Integer\r\n    Dim intVersionsebene As Integer\r\n    If Not VersionsnummerGueltig(strVersionNeu) Then\r\n        MsgBox &quot;Die Versionsnummer ''&quot; &amp; strVersionNeu &amp; &quot;'' ist ung&uuml;ltig.&quot;\r\n        Exit Function\r\n    End If\r\n    If Not VersionsnummerGueltig(strVersionAlt) Then\r\n        MsgBox &quot;Die Versionsnummer ''&quot; &amp; strVersionAlt &amp; &quot;'' ist ung&uuml;ltig.&quot;\r\n        Exit Function\r\n    End If\r\n    strVersionsstufenNeu = Split(strVersionNeu, &quot;.&quot;)\r\n    strVersionsstufenAlt = Split(strVersionAlt, &quot;.&quot;)\r\n    For intVersionsebene = 0 To 3\r\n        intNeu = CInt(strVersionsstufenNeu(intVersionsebene))\r\n        intAlt = CInt(strVersionsstufenAlt(intVersionsebene))\r\n        Select Case intNeu\r\n            Case Is &gt; intAlt\r\n                IstVersionAktueller = True\r\n                Exit Function\r\n            Case Is &lt; intAlt\r\n                Exit Function\r\n        End Select\r\n    Next intVersionsebene\r\nEnd Function<\/pre>\n<p>Die Funktion erwartet die Angabe zweier Versionsst&auml;nde, wobei der erste der aktuellere sein soll. Kann die Funktion dies best&auml;tigen, liefert sie den Wert <b>True <\/b>zur&uuml;ck, sonst <b>False<\/b>.<\/p>\n<p>F&uuml;r die Pr&uuml;fung werden die beiden Versionsst&auml;nde zun&auml;chst mit der Funktion <b>VersionsnummerGueltig <\/b>auf ihr Format gepr&uuml;ft (siehe weiter unten).<\/p>\n<p>Die Versionsnummern sollten aus vier durch Punkte getrennten Elementen bestehen (x.x.x.x).<\/p>\n<p>Haben die beiden Versionsnummern das erwartete Format, werden die einzelnen Elemente beider Versionsnummern in die Arrays <b>strVersionsstufenNeu() <\/b>und <b>strVersionsstufenAlt() <\/b>aufgeteilt. Die Funktion vergleicht dann vom jeweils ersten Element ausgehend alle Elemente.<\/p>\n<p>Dazu konvertiert sie den neuen und den alten Wert zun&auml;chst in die beiden Variablen <b>intNeu <\/b>und <b>intAlt<\/b>.<\/p>\n<p>Eine <b>Select Case<\/b>-Bedingung pr&uuml;ft dann zwei F&auml;lle:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Ist <b>intNeu <\/b>gr&ouml;&szlig;er als <b>intAlt<\/b> Dann ist die als neue Version angegebene Versionsnummer tats&auml;chlich die aktuellere.<\/li>\n<li class=\"aufz-hlung\">Ist <b>intNeu <\/b>kleiner als <b>intAlt<\/b> Dann ist die als &auml;ltere Version angegebene Versionsnummer die aktuellere.<\/li>\n<\/ul>\n<p>In beiden F&auml;llen wird die Funktion beendet, einmal mit dem R&uuml;ckgabewert <b>True <\/b>und einmal mit <b>False<\/b>. Sind beide Versionsnummern gleich, werden die Werte der jeweils n&auml;chsten Ebene der Versionsnummern verglichen.<\/p>\n<p>Sollte bis zum letzten Element keine Entscheidung gefallen sein, sind beide Versionsnummern gleich &#8211; das bedeutet, dass die Funktion ebenfalls den Wert <b>False <\/b>zur&uuml;ckgeben muss.<\/p>\n<p>Die Funktion finden Sie ebenfalls im Modul <b>mdlVersionsnummern <\/b>der Beispieldatenbank.<\/p>\n<p><b>Versionsnummern pr&uuml;fen<\/b><\/p>\n<p>Wenn Sie Versionsnummern vergleichen m&ouml;chten, sollten Sie zuvor pr&uuml;fen, ob diese auch g&uuml;ltig sind.<\/p>\n<p>Dies erledigt die Funktion <b>VersionsnummerGueltig <\/b>aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-29-anchor\">Listing 3<\/a><\/span>. Beim Entwickeln dieser Funktion haben wir eine Reihe von Testf&auml;llen zuhilfe genommen, die wie folgt in einer VBA-Prozedur landeten:<\/p>\n<p class=\"listingueberschrift\">Listing 3: Versionsnummer auf G&uuml;ltigkeit pr&uuml;fen<\/p>\n<pre>Public Function VersionsnummerGueltig(strVersion As String)\r\n    Dim strVersionsstufen() As String\r\n    Dim strNumerisch As String\r\n    Dim intVersionsstufe As Integer\r\n    Dim i As Integer\r\n    strVersionsstufen = Split(strVersion, &quot;.&quot;)\r\n    If Not (UBound(strVersionsstufen) - LBound(strVersionsstufen) = 3) Then\r\n        Exit Function\r\n    End If\r\n    For intVersionsstufe = LBound(strVersionsstufen) To UBound(strVersionsstufen)\r\n        strNumerisch = Replace(strVersionsstufen(intVersionsstufe), &quot;.&quot;, &quot;&quot;)\r\n        If Len(strNumerisch) = 0 Then\r\n            Exit Function\r\n        End If\r\n        For i = 1 To Len(strNumerisch)\r\n            If Not IsNumeric(Mid(strNumerisch, i, 1)) Then\r\n                Exit Function\r\n            End If\r\n        Next i\r\n    Next intVersionsstufe\r\n    VersionsnummerGueltig = True\r\nEnd Function\r\nPublic Sub Test_VersionsnummerGueltig()\r\n    Debug.Print &quot;Test 1:&quot;,\r\n    VersionsnummerGueltig(&quot;1&quot;) = False\r\n    ...\r\nEnd Sub<\/pre>\n<p><!--30percent--><\/p>\n<p>Weitere Testzeilen pr&uuml;ften beispielsweise die Werte <b>abc<\/b>, <b>&#8230;<\/b>, <b>1.0<\/b>, <b>1.0.1<\/b>, <b>1.0.0.0<\/b>, <b>1.0.0.0.0<\/b>, <b>1.2.3.4 <\/b>oder <b>1,2.3.4.5<\/b>. Auf diese Weise k&ouml;nnen Sie w&auml;hrend der Entwicklung einer solchen Funktion leicht pr&uuml;fen, ob sie f&uuml;r alle Testf&auml;lle das gew&uuml;nschte Ergebnis liefert.<\/p>\n<p>Die Funktion <b>VersionsnummerGueltig <\/b>erwartet eine Zeichenkette mit der Versionsnummer als Eingangsparameter und liefert einen Boolean-Wert zur&uuml;ck.<\/p>\n<p>Die Pr&uuml;fung erfolgt in zwei Schritten. Der erste pr&uuml;ft, ob die Versionsnummer &uuml;berhaupt aus vier Elementen besteht. Dazu ist das Vorhandensein von drei Punkten (.) n&ouml;tig.<\/p>\n<p>Damit ist aber noch nicht sichergestellt, dass die Versionsangabe auch vier durch die Punkte getrennte Zahlen enth&auml;lt.<\/p>\n<p>Dies pr&uuml;ft die Funktion im zweiten Schritt. Dort werden alle vier der in ein Array eingef&uuml;gten Elemente der Versionsnummer zun&auml;chst auf die Zeichenl&auml;nge gepr&uuml;ft (dies schlie&szlig;t fehlende Zahlen wie in <b>1..1.0<\/b> aus). Danach untersucht eine weitere Schleife, ob die einzelnen Elemente der Versionsnummer ausschlie&szlig;lich aus Zahlen bestehen.<\/p>\n<p>Schl&auml;gt eine der Pr&uuml;fungen fehl, wird die Funktion schlicht und einfach abgebrochen. Da <b>Boolean<\/b>-Variablen standardm&auml;&szlig;ig den Wert <b>0<\/b>, also <b>False<\/b>, enthalten, liefert die Funktion dann den korrekten Wert zur&uuml;ck.<\/p>\n<p>Nur wenn alle Pr&uuml;fungen gelingen und die Funktion somit nicht vorzeitig abgebrochen wird, weist die Funktion ihrem R&uuml;ckgabeparameter am Ende den Wert <b>True <\/b>zu.<\/p>\n<p>Die Funktion finden Sie ebenfalls im Modul <b>mdlVersionsnummern <\/b>der Beispieldatenbank.<\/p>\n<p><b>Pr&uuml;fen, ob Datenbank eine .mde\/.accde-Datei ist<\/b><\/p>\n<p>Die Pr&uuml;fung, ob eine Datenbank quelloffen ist oder nicht, ist sicher f&uuml;r mehrere Anwendungsf&auml;lle interessant. Im konkreten Fall wurde, wie &uuml;blich, mit einer quelloffenen Anwendung entwickelt, die dann vor der Verteilung in eine <b>.mde<\/b>\/<b>.accde <\/b>umgewandelt wurde.<\/p>\n<p>Dies war auch der einzige Unterschied zwischen der Entwicklungs- und der Produktiv-Version. W&auml;hrend der Entwicklung sollte die Anwendung allerdings noch die M&ouml;glichkeit bieten, zu Testzwecken alternative Backends auszuw&auml;hlen.<\/p>\n<p>Man k&ouml;nnte nun irgendwo eine zus&auml;tzliche Eigenschaft oder Konstante einbauen, um festzulegen, ob es sich um die Entwicklungs- oder die Produktiv-Version der Anwendung handelt.<\/p>\n<p>Das ist allerdings unn&ouml;tig, denn Sie k&ouml;nnen einer einfachen Eigenschaft des <b>Database<\/b>-Objekts entnehmen, ob gerade eine Datenbank mit offenen Quellen oder eine <b>.mde<\/b>\/<b>.accde<\/b>-Datenbank ge&ouml;ffnet ist.<\/p>\n<p>Dies erledigt die Funktion <b>IsMDE<\/b>. Sie erwartet einen Verweis auf das zu pr&uuml;fende Datenbankobjekt und untersucht, ob es eine Property namens <b>MDE <\/b>gibt und ob diese den Wert <b>T <\/b>enth&auml;lt.<\/p>\n<p>Falls ja, handelt es sich um eine <b>.mde<\/b>\/<b>.accde<\/b>-Datenbank:<\/p>\n<pre>Function IsMDE(db As Database) As Boolean\r\n    On Error Resume Next\r\n    Dim strMDE As String\r\n    strMDE = db.Properties(&quot;MDE&quot;)\r\n    If Err = 0 And strMDE = &quot;T&quot; Then\r\n        IsMDE = True\r\n    Else\r\n        IsMDE = False\r\n    End If\r\nEnd Function<\/pre>\n<p>Die Funktion finden Sie im Modul <b>mdlMDE <\/b>der Beispieldatenbank.<\/p>\n<p class=\"zwischen-berschrift-oberer-spaltenrand\">URLEncode<\/p>\n<p>Wenn Sie URLs zusammensetzen und dabei Parameter hinzuf&uuml;gen, m&uuml;ssen Sie diese URL-tauglich machen. Das bedeutet, dass bestimmte Sonderzeichen nicht vorkommen d&uuml;rfen. Die Funktion <b>URLEncode <\/b>wandelt einen Ausdruck so um, dass er in einer URL als Parameter verwendet werden kann. Dazu wandelt sie bestimmte Sonderzeichen in einer speziellen Kodierung um. Dabei handelt es sich um das Prozentzeichen und eine zweistellige hexadezimale Zahl.<\/p>\n<p>Die Zahl entspricht dabei dem ASCII-Code des jeweiligen Zeichens. Nicht umgewandelt werden lediglich die Zeichen <b>0<\/b>&#8211;<b>9<\/b>, <b>A<\/b>&#8211;<b>Z<\/b>, <b>a<\/b>&#8211;<b>z<\/b>, das Minuszeichen (<b>&#8211;<\/b>), der Punkt (<b>.<\/b>), der Unterstrich (<b>_<\/b>) und die Tilde (<b>~<\/b>). Die Funktion erwartet folgenden Parameter:<\/p>\n<ul>\n<li class=\"aufz-hlung\"><b>str<\/b>: Zu enkodierende Zeichenkette<\/li>\n<\/ul>\n<p>Die Funktion sieht wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-30-anchor\">Listing 4<\/a><\/span> aus. Sie finden sie im Modul <b>mdlURLEncode <\/b>der Beispieldatenbank zu diesem Beitrag.<\/p>\n<p class=\"listingueberschrift\">Listing 4: Zeichenketten URL-tauglich machen<\/p>\n<pre>Function URLEncode(StringVal As String) As String\r\n    Dim intLen As Integer\r\n    Dim i As Integer\r\n    Dim intCharCode As Integer\r\n    Dim strChar As String\r\n    Dim strTemp As String\r\n    intLen = Len(StringVal)\r\n    If intLen &gt; 0 Then\r\n        For I = 1 To intLen\r\n            strChar = Mid$(StringVal, I, 1)\r\n            intCharCode = Asc(strChar)\r\n            Select Case intCharCode\r\n            Case 97 To 122, 65 To 90, 48 To 57, 45, 46, 95, 126\r\n            strTemp = strTemp &amp; strChar\r\n            Case 0 To 15\r\n            strTemp = strTemp &amp; &quot;%0&quot; &amp; Hex(intCharCode)\r\n            Case Else\r\n            strTemp = strTemp &amp; &quot;%&quot; &amp; Hex(intCharCode)\r\n            End Select\r\n        Next i\r\n        URLEncode = strTemp\r\n    End If\r\nEnd Function<\/pre>\n<p><b>Text in Zwischenablage speichern<\/b><\/p>\n<p>Manchmal kann es sinnvoll sein, Texte in die Zwischenablage zu schreiben, vorrangig ist dies jedoch beim Entwickeln der Fall. Genau genommen trat diese Anforderung auf, als es die Ergebnisse des Aufrufs eines Webservice zu pr&uuml;fen galt.<\/p>\n<p>Dummerweise waren die zur&uuml;ckgelieferten XML-Dokumente jeweils so lang, dass sie nicht komplett im Direktfenster angezeigt werden konnten &#8211; es fehlte also jeweils der Anfang.<\/p>\n<p>Welche M&ouml;glichkeiten bleiben, um den kompletten Inhalt des XML-Dokuments zu betrachten Beispielsweise h&auml;tte man diesen gleich in eine Textdatei schreiben und dann diese Textdatei &ouml;ffnen k&ouml;nnen.<\/p>\n<p>Als Alternative bot sich aber auch an, den Text des Dokuments einfach in die Zwischenablage zu kopieren, von wo aus man diesen einfach an die gew&uuml;nschte Stelle kopieren konnte &#8211; in diesem Fall in einen Texteditor oder auch in ein Word-Dokument.<\/p>\n<p>Weitere Beispiele f&uuml;r das Schreiben von Zeichenketten in die Zwischenablage finden sich &uuml;berall dort, wo Sie Daten zu Debug-Zwecken in das Direktfenster eintragen.<\/p>\n<p>Wenn Sie etwa in einer Prozedur immer wieder einen Link zusammenstellen und diesen pr&uuml;fen m&ouml;chten, w&uuml;rden Sie diesen gegebenenfalls im Direktfenster ausgeben, ihn dort kopieren und in die Adressleiste des Browsers eingeben.<\/p>\n<p>Diesen Zwischenschritt k&ouml;nnen Sie sich sparen, wenn Sie die URL direkt in die Zwischenablage kopieren.<\/p>\n<p>Zugegeben: Solche Einsatzzwecke tauchen gewiss nicht t&auml;glich auf, aber wenn sich einmal eine Aufgabe findet, bei der Sie immer wieder die gleiche, per Code erzeugte Zeichenkette weiterverarbeiten m&uuml;ssen, k&ouml;nnen Sie mit der hier vorgestellten Funktion viel Zeit sparen.<\/p>\n<p>Der Aufruf der Funktion aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-31-anchor\">Listing 5<\/a><\/span> erfolgt beispielsweise wie folgt:<\/p>\n<pre>Dim str As String\r\nstr = &quot;Beispieltext&quot;\r\nClipBoard_SetData = str<\/pre>\n<p>Die Funktion stammt aus einem Knowledgebase-Artikel von Microsoft (<b>http:\/\/support.microsoft.com\/kbid=210216<\/b>). In der Beispieldatenbank finden Sie diese im Modul <b>mdlZwischenablage<\/b>.<\/p>\n<p class=\"listingueberschrift\">Listing 5: Zeichenkette in die Zwischenablage schreiben<\/p>\n<pre>Declare Function GlobalUnlock Lib &quot;kernel32&quot; (ByVal hMem As Long) As Long\r\nDeclare Function GlobalLock Lib &quot;kernel32&quot; (ByVal hMem As Long) As Long\r\nDeclare Function GlobalAlloc Lib &quot;kernel32&quot; (ByVal wFlags As Long, ByVal dwBytes As Long) As Long\r\nDeclare Function CloseClipboard Lib &quot;User32&quot; () As Long\r\nDeclare Function OpenClipboard Lib &quot;User32&quot; (ByVal hwnd As Long) As Long\r\nDeclare Function EmptyClipboard Lib &quot;User32&quot; () As Long\r\nDeclare Function lstrcpy Lib &quot;kernel32&quot; (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long\r\nDeclare Function SetClipboardData Lib &quot;User32&quot; (ByVal wFormat As Long, ByVal hMem As Long) As Long\r\nPublic Const GHND = &amp;H42\r\nPublic Const CF_TEXT = 1\r\nPublic Const MAXSIZE = 4096\r\nFunction ClipBoard_SetData(MyString As String)\r\n    Dim hGlobalMemory As Long, lpGlobalMemory As Long\r\n    Dim hClipMemory As Long, X As Long\r\n    hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)\r\n    lpGlobalMemory = GlobalLock(hGlobalMemory)\r\n    lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)\r\n    If GlobalUnlock(hGlobalMemory) &lt;&gt; 0 Then\r\n        MsgBox &quot;Could not unlock memory location. Copy aborted.&quot;\r\n        GoTo OutOfHere2\r\n    End If\r\n    If OpenClipboard(0&amp;) = 0 Then\r\n        MsgBox &quot;Could not open the Clipboard. Copy aborted.&quot;\r\n        Exit Function\r\n    End If\r\n    X = EmptyClipboard()\r\n    hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)\r\n    OutOfHere2:\r\n    If CloseClipboard() = 0 Then\r\n        MsgBox &quot;Could not close Clipboard.&quot;\r\n    End If\r\nEnd Function<\/pre>\n<p><b>XML-Dokumente formatieren<\/b><\/p>\n<p>Wenn Sie XML-Dokumente erstellen, geschieht das je nach der verwendeten Technik gleich in formatierter Form oder auch nicht.<\/p>\n<p>Unter &#8222;formatierter Form&#8220; verstehen wir das Aufteilen der einzelnen Elemente in je eine Zeile und das Einf&uuml;gen von Einr&uuml;ckungen zur besseren Lesbarkeit.<\/p>\n<p>Sp&auml;testens, wenn Sie mit Webservices arbeiten und von dort unformatierte XML-Dokumente erhalten, werden Sie sich w&uuml;nschen, Sie k&ouml;nnten diese auf die Schnelle mit einigen Formatierungen versehen.<\/p>\n<p>Alles, was Sie dazu brauchen, liefert die Funktion <b>FormatXML<\/b>. Die Funktion erwartet den Inhalt des XML-Dokuments als Parameter und liefert formatierten XML-Code zur&uuml;ck.<\/p>\n<p>Geben Sie also beispielsweise folgenden Ausdruck ein:<\/p>\n<pre>&lt;xml version=&quot;1.0&quot;&gt;&lt;ItemSearchResponse xmlns=&quot;...1&quot;&gt;&lt;OperationRequest&gt;&lt;HTTPHeaders&gt;...<\/pre>\n<p>Die Funktion liefert dann folgenden Ausdruck zur&uuml;ck, der wesentlich besser zu lesen ist:<\/p>\n<pre>&lt;xml version=&quot;1.0&quot;&gt;\r\n&lt;ItemSearchResponse xmlns=&quot;...&quot;&gt;\r\n&lt;OperationRequest&gt;\r\n&lt;HTTPHeaders&gt;...<\/pre>\n<p>Sie finden den Quellcode der Funktion aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-32-anchor\">Listing 6<\/a><\/span> im Modul <b>mdlXML<\/b> der Beispieldatenbank.<\/p>\n<p class=\"listingueberschrift\">Listing 6: XML-Dokument formatiert ausgeben<\/p>\n<pre>Public Function FormatXML(strXML As String) As String\r\n    Dim strTemp As String\r\n    Dim str() As String\r\n    Dim i As Integer\r\n    Dim intSlash As Integer\r\n    Dim intEinruecken As Integer\r\n    Dim bolDescription As Boolean\r\n    strTemp = strXML\r\n    strTemp = Replace(strTemp, &quot;&gt;&lt;&quot;, &quot;&gt;|~|&lt;&quot;)\r\n    str = Split(strTemp, &quot;|~|&quot;)\r\n    For i = LBound(str) To UBound(str)\r\n        If InStr(str(i), &quot;Now you&quot;) &gt; 0 Then\r\n            Debug.Print str(i)\r\n        End If\r\n        If str(i) = &quot;&lt;Description&gt;&quot; Then\r\n            bolDescription = True\r\n        ElseIf str(i) = &quot;&lt;\/Description&gt;&quot; Then\r\n            bolDescription = False\r\n        End If\r\n        If Not bolDescription Then\r\n            intSlash = InStr(1, str(i), &quot;&lt;\/&quot;)\r\n            If intSlash = 1 Then\r\n                intEinruecken = intEinruecken - 4\r\n            End If\r\n            str(i) = Space(intEinruecken) &amp; str(i)\r\n            If intSlash = 0 Then\r\n                intSlash = InStr(1, str(i), &quot;\/&gt;&quot;)\r\n                If intSlash = 0 Then\r\n                    intEinruecken = intEinruecken + 4\r\n                End If\r\n            End If\r\n        End If\r\n    Next i\r\n    FormatXML = Join(str, vbCrLf)\r\nEnd Function<\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Die in diesem Beitrag vorgestellten Techniken dienen dazu, oft von Hand durchgef&uuml;hrte Vorg&auml;nge zu automatisieren. Dies gilt vor allem f&uuml;r die beiden folgenden:<\/p>\n<ul>\n<li class=\"aufz-hlung\">Das Kopieren von Ausgaben, die eigentlich im Direktfenster landen sollten, aber zu gro&szlig; daf&uuml;r sind, in die Zwischenablage. Von dort aus k&ouml;nnen Sie sich das Ergebnis einfach im Texteditor Ihrer Wahl ansehen, anstatt gegebenenfalls die Ausgabe mit den Zeichenkettenfunktionen zu reduzieren.<\/li>\n<li class=\"aufz-hlung\">Das Umsetzen von XML-Dokumenten, die von Webservices und Co. oft ohne Zeilenumbr&uuml;che geliefert werden, in ein formatiertes XML-Dokument. Ich selbst habe oft lange XML-Dokumente im Texteditor umbrochen, um die gesuchten Informtationen finden zu k&ouml;nnen. Klar, das h&auml;tte normalerweise durch die Anzeige in einem XML-Editor oder Internetbrowser funktioniert &#8211; aber wenn die XML-Datei ung&uuml;ltige Daten enth&auml;lt, hilft auch das nicht weiter!<\/li>\n<\/ul>\n<p>In diesem Sinne: Haben Sie weitere Anforderungen dieser Art Dann her damit &#8211; <b>info@access-im-unternehmen.de<\/b> ist Ihre Adresse!<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>TippsUndTricks_Funktionen.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{8E768C5F-FBAA-4511-8A0E-916F5C91EB32}\/aiu_802.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In dieser Ausgabe unserer Tipps und Tricks-Reihe stellen wir Ihnen einige Funktionen vor, die Sie speziell als Entwickler einsetzen k&ouml;nnen. Sie erfahren beispielsweise, wie Sie neue Versionsnummern ermitteln, ob eine Datenbank eine .mde\/.accde-Datei ist, wie Sie Texte per Code in die Zwischenablage kopieren oder Zeichenketten f&uuml;r den Einsatz in URLs vorbereiten.<\/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":[662011,66052011,44000004],"tags":[],"class_list":["post-55000802","post","type-post","status-publish","format-standard","hentry","category-662011","category-66052011","category-Tipps_und_Tricks"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>VBA-Funktionen f&uuml;r Entwickler - 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\/VBAFunktionen_fuer_Entwickler\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"VBA-Funktionen f&uuml;r Entwickler\" \/>\n<meta property=\"og:description\" content=\"In dieser Ausgabe unserer Tipps und Tricks-Reihe stellen wir Ihnen einige Funktionen vor, die Sie speziell als Entwickler einsetzen k&ouml;nnen. Sie erfahren beispielsweise, wie Sie neue Versionsnummern ermitteln, ob eine Datenbank eine .mde\/.accde-Datei ist, wie Sie Texte per Code in die Zwischenablage kopieren oder Zeichenketten f&uuml;r den Einsatz in URLs vorbereiten.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/VBAFunktionen_fuer_Entwickler\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:58:38+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg08.met.vgwort.de\/na\/ec0887d6e9494aaa910d8a1fdd823e09\" \/>\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=\"14\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_fuer_Entwickler\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_fuer_Entwickler\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"VBA-Funktionen f&uuml;r Entwickler\",\"datePublished\":\"2020-05-22T21:58:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_fuer_Entwickler\\\/\"},\"wordCount\":1953,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_fuer_Entwickler\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/ec0887d6e9494aaa910d8a1fdd823e09\",\"articleSection\":[\"2011\",\"5\\\/2011\",\"Tipps und Tricks\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_fuer_Entwickler\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_fuer_Entwickler\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_fuer_Entwickler\\\/\",\"name\":\"VBA-Funktionen f&uuml;r Entwickler - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_fuer_Entwickler\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_fuer_Entwickler\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/ec0887d6e9494aaa910d8a1fdd823e09\",\"datePublished\":\"2020-05-22T21:58:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_fuer_Entwickler\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_fuer_Entwickler\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_fuer_Entwickler\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/ec0887d6e9494aaa910d8a1fdd823e09\",\"contentUrl\":\"http:\\\/\\\/vg08.met.vgwort.de\\\/na\\\/ec0887d6e9494aaa910d8a1fdd823e09\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/VBAFunktionen_fuer_Entwickler\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"VBA-Funktionen f&uuml;r Entwickler\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"VBA-Funktionen f&uuml;r Entwickler - 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\/VBAFunktionen_fuer_Entwickler\/","og_locale":"de_DE","og_type":"article","og_title":"VBA-Funktionen f&uuml;r Entwickler","og_description":"In dieser Ausgabe unserer Tipps und Tricks-Reihe stellen wir Ihnen einige Funktionen vor, die Sie speziell als Entwickler einsetzen k&ouml;nnen. Sie erfahren beispielsweise, wie Sie neue Versionsnummern ermitteln, ob eine Datenbank eine .mde\/.accde-Datei ist, wie Sie Texte per Code in die Zwischenablage kopieren oder Zeichenketten f&uuml;r den Einsatz in URLs vorbereiten.","og_url":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_fuer_Entwickler\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:58:38+00:00","og_image":[{"url":"http:\/\/vg08.met.vgwort.de\/na\/ec0887d6e9494aaa910d8a1fdd823e09","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"14\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_fuer_Entwickler\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_fuer_Entwickler\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"VBA-Funktionen f&uuml;r Entwickler","datePublished":"2020-05-22T21:58:38+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_fuer_Entwickler\/"},"wordCount":1953,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_fuer_Entwickler\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/ec0887d6e9494aaa910d8a1fdd823e09","articleSection":["2011","5\/2011","Tipps und Tricks"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/VBAFunktionen_fuer_Entwickler\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_fuer_Entwickler\/","url":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_fuer_Entwickler\/","name":"VBA-Funktionen f&uuml;r Entwickler - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_fuer_Entwickler\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_fuer_Entwickler\/#primaryimage"},"thumbnailUrl":"http:\/\/vg08.met.vgwort.de\/na\/ec0887d6e9494aaa910d8a1fdd823e09","datePublished":"2020-05-22T21:58:38+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_fuer_Entwickler\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/VBAFunktionen_fuer_Entwickler\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_fuer_Entwickler\/#primaryimage","url":"http:\/\/vg08.met.vgwort.de\/na\/ec0887d6e9494aaa910d8a1fdd823e09","contentUrl":"http:\/\/vg08.met.vgwort.de\/na\/ec0887d6e9494aaa910d8a1fdd823e09"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/VBAFunktionen_fuer_Entwickler\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"VBA-Funktionen f&uuml;r Entwickler"}]},{"@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\/55000802","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=55000802"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000802\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000802"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000802"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000802"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}