{"id":55000458,"date":"2025-02-01T00:00:00","date_gmt":"2025-06-23T16:35:35","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=458"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Zwischenablage_fuer_Texte_programmieren","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Zwischenablage_fuer_Texte_programmieren\/","title":{"rendered":"Zwischenablage f&uuml;r Texte programmieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg08.met.vgwort.de\/na\/c236c65793804408857b50de3485e0f2\" width=\"1\" height=\"1\" alt=\"\"><b>Die Zwischenablage ist ein praktisches Werkzeug, wenn es darum geht, Texte zu kopieren und an anderer Stelle wieder einzuf&uuml;gen. Das ist insbesondere sinnvoll, wenn es sich um umfangreichere Texte handelt. Dabei k&ouml;nnen wir Funktionen programmieren, die den markierten Text in die Zwischenablage kopieren und solche, die den Inhalt der Zwischenablage als Funktionsergebnis liefern.  In diesem Artikel schauen wir uns an, wo man solche Funktionen sinnvoll einsetzen kann und wie sie programmiert werden.<\/b><\/p>\n<h2>Texte in die Zwischenablage einf&uuml;gen<\/h2>\n<p>In unserer Praxis konnten wir Funktionen zum Kopieren von Texten in die Zwischenablage haupts&auml;chlich dort nutzen, wo eine Ausgabe in den Direktbereich zu umfangreich war, als dort komplett dargestellt zu werden. Das hei&szlig;t, wir lassen uns beispielsweise das Ergebnis des Aufrufs einer Rest-API im Direktbereich ausgeben und stellen dann beim Scrollen zum Beginn der Ausgabe fest, dass ein Teil abgeschnitten wurde. Hier gibt es dann zwei M&ouml;glichkeiten:<\/p>\n<ul>\n<li>Entweder wir interessieren uns nur f&uuml;r einen bestimmten Teil der Ausgabe wie beispielsweise den Anfang. Dann k&ouml;nnen wir die Ausgabe des Ergebnisses beispielsweise mit der <b>Left<\/b>-Funktion abschneiden und nur so viel ausgeben, dass der Direktbereich diesen fassen kann.<\/li>\n<li>Oder wir kopieren einfach die vollst&auml;ndige Ausgabe  mit einer daf&uuml;r vorgesehenen Funktion in die Zwischenablage und geben diese dann in eine entsprechenden Programm wie einem Text-Editor oder einem Code-Editor zur weiteren Untersuchung aus.<\/li>\n<\/ul>\n<p>Und genau f&uuml;r letzteren Zweck ben&ouml;tigen eine Routine, welche die R&uuml;ckgabe einer Funktion oder auch den Inhalt einer Variablen in die Zwischenablage kopiert.<\/p>\n<h2>Texte aus der Zwischenablage auslesen<\/h2>\n<p>Der umgekehrte Anwendungsfall tritt auf, wenn wir den Inhalte der Zwischenablage in eine Variable f&uuml;llen oder diesen direkt einer Funktion zur weiteren Verarbeitung zuweisen wollen.<\/p>\n<p>Auch hier ein Beispiel: Wir holen aus der Benutzeroberfl&auml;che beispielsweise von eBay oder einer anderen Rest-API ein Token, das oft so lang ist, dass man es in einer Konstanten nicht in einer einzelnen Zeile verarbeiten kann (Codezeilen in VBA haben eine nat&uuml;rliche Grenze, und zwar 1.024 Zeichen). Dann m&uuml;sste man dieses wie folgt auf mehrere Zeichen umbrechen:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const cStrBeispiel = \"1234567890\" _\r\n     & \"1234567890123456789012345678901234567890\" _\r\n     & \"1234567890123456789012345678901234567890\" _\r\n     & \"1234567890123456789012345678901234567890\" <\/pre>\n<p>Das macht keinen Spa&szlig; und vor allem ist es fehleranf&auml;llig, weil man hier schnell mal ein Zeichen zu viel oder zu wenig hat.<\/p>\n<p>Also k&ouml;nnten wir, wenn wir das Token aus der Zwischenablage direkt verarbeiten k&ouml;nnten, direkt die Hilfsfunktion aus Listing 1 f&uuml;r diesen Zweck nutzen. Die Funktion nimmt zwei Parameter entgegen. Der erste erwartet den Namen der zu definierenden Konstanten, der zweite die Anzahl der Zeichen je Zeile f&uuml;r die Konstante.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>ZwischenablageInKonstante(strKonstante<span style=\"color:blue;\"> As String<\/span>, lngZeichen<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strTemp<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strCode<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lngLaenge<span style=\"color:blue;\"> As Long<\/span>\r\n     strTemp = AusZwischenablage\r\n     strCode = \"Public Const \" & strKonstante & \"<span style=\"color:blue;\"> As String<\/span> = \"\r\n     strCode = strCode & \"\"\"\" & <span style=\"color:blue;\">Left<\/span>(strTemp, lngZeichen) & \"\"\" _\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strTemp = <span style=\"color:blue;\">Mid<\/span>(strTemp, lngZeichen)\r\n     lngLaenge = <span style=\"color:blue;\">Len<\/span>(strTemp)\r\n     <span style=\"color:blue;\">Do While<\/span> <span style=\"color:blue;\">Not<\/span> lngLaenge = 0\r\n         strCode = strCode & \"    & \"\"\" & <span style=\"color:blue;\">Left<\/span>(strTemp, lngZeichen) & \"\"\" _\" & <span style=\"color:blue;\">vbCrLf<\/span>\r\n         strTemp = <span style=\"color:blue;\">Mid<\/span>(strTemp, lngZeichen)\r\n         lngLaenge = <span style=\"color:blue;\">Len<\/span>(strTemp)\r\n     <span style=\"color:blue;\">Loop<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strCode) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         strCode = <span style=\"color:blue;\">Left<\/span>(strCode, <span style=\"color:blue;\">Len<\/span>(strCode) - 4)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     ZwischenablageInKonstante = strCode\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Funktion zum Zerlegen einer Zeichenkette in eine mehrzeilige Konstante<\/span><\/b><\/p>\n<p>Die Funktion holt mit der sp&auml;ter noch zu beschreibenden Funktion <b>AusZwischenablage <\/b>den Inhalt der Zwischenablage in die Variable <b>strTemp<\/b>. Dann stellt sie den ersten Teil des Codes der ersten Zeile zusammen, der nur aus der Deklaration der eigentlichen Konstanten besteht.<\/p>\n<p>Anschlie&szlig;end f&uuml;gt sie die ersten Zeichen entsprechend des Wertes des Parameters <b>lngZeichen <\/b>zusammen, indem sie mit der <b>Left<\/b>-Funktion die entsprechende Teilzeichenkette ausliest. Damit diese Zeichen nicht nochmals verwendet werden, verk&uuml;rzen wir die Zeichenkette aus <b>strTemp<\/b> vorne um die entsprechende Anzahl Zeichen. Danach gehen wir in eine <b>Do While<\/b>-Schleife, die wir erst verlassen, wenn die L&auml;nge der Zeichenkette in <b>strTemp <\/b>gleich <b>0 <\/b>ist &#8211; also wenn alle Teilzeichenketten in die Variable <b>strCode <\/b>gelangt sind und entsprechend vorn aus <b>strTemp <\/b>herausgeschnitten wurden.<\/p>\n<p>Diese Schritte f&uuml;hren wir f&uuml;r alle verbleibenden Zeichen durch und erhalten beispielsweise ein Ergebnis wie in Bild 1. Der Code &uuml;berschreitet so sicher nicht die zul&auml;ssige H&ouml;chstanzahl an Zeichen pro Zeile.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2025_01\/pic_458_001.png\" alt=\"Ergebnis des Aufteilens der Zwischenablage in eine mehrzeilige Konstante\" width=\"700\" height=\"184,974\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Ergebnis des Aufteilens der Zwischenablage in eine mehrzeilige Konstante<\/span><\/b><\/p>\n<h2>Funktionen zum Einlesen in und zum Ausgeben aus der Zwischenablage<\/h2>\n<p>Damit kommen wir zu den eigentlichen Funktionen. F&uuml;r diese ben&ouml;tigen wir einige API-Funktionen (siehe Listing 2). Im ersten Schritt schauen wir uns die Funktion zum Schreiben von Texten in die Zwischenablage an.<\/p>\n<pre>#If Win64 Then\r\n     '' 64-Bit Deklarationen\r\n     <span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function GlobalUnlock Lib \"kernel32\" (ByVal hMem<span style=\"color:blue;\"> As Long<\/span>Ptr)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function GlobalLock Lib \"kernel32\" (ByVal hMem<span style=\"color:blue;\"> As Long<\/span>Ptr)<span style=\"color:blue;\"> As Long<\/span>Ptr\r\n     <span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function GlobalAlloc Lib \"kernel32\" (ByVal wFlags<span style=\"color:blue;\"> As Long<\/span>, ByVal dwBytes<span style=\"color:blue;\"> As Long<\/span>) _\r\n        <span style=\"color:blue;\"> As Long<\/span>Ptr\r\n     <span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function CloseClipboard Lib \"user32\" ()<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function OpenClipboard Lib \"user32\" (ByVal hWnd<span style=\"color:blue;\"> As Long<\/span>Ptr)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function EmptyClipboard Lib \"user32\" ()<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function lstrcpyW Lib \"kernel32\" (ByVal lpString1<span style=\"color:blue;\"> As Long<\/span>Ptr, ByVal lpString2<span style=\"color:blue;\"> As Long<\/span>Ptr) _\r\n        <span style=\"color:blue;\"> As Long<\/span>Ptr\r\n     <span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function SetClipboardData Lib \"user32\" (ByVal wFormat<span style=\"color:blue;\"> As Long<\/span>, ByVal hMem<span style=\"color:blue;\"> As Long<\/span>Ptr) _\r\n        <span style=\"color:blue;\"> As Long<\/span>Ptr\r\n     <span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function GetClipboardData Lib \"user32\" (ByVal wFormat<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>Ptr\r\n     <span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function IsClipboardFormatAvailable Lib \"user32\" (ByVal wFormat<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function GlobalSize Lib \"kernel32\" (ByVal hMem<span style=\"color:blue;\"> As Long<\/span>Ptr)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare PtrSafe Function GlobalFree Lib \"kernel32\" (ByVal hMem<span style=\"color:blue;\"> As Long<\/span>Ptr)<span style=\"color:blue;\"> As Long<\/span>Ptr\r\n     <span style=\"color:blue;\">Private <\/span>Declare PtrSafe Sub CopyMemoryByAddr Lib \"kernel32\" Alias \"RtlMoveMemory\" (ByVal Destination<span style=\"color:blue;\"> As Long<\/span>Ptr, _\r\n         ByVal Source<span style=\"color:blue;\"> As Long<\/span>Ptr, ByVal Length<span style=\"color:blue;\"> As Long<\/span>)\r\n#Else\r\n     '' 32-Bit Deklarationen\r\n     <span style=\"color:blue;\">Private <\/span>Declare Function GlobalUnlock Lib \"kernel32\" (ByVal hMem<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare Function GlobalLock Lib \"kernel32\" (ByVal hMem<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare Function GlobalAlloc Lib \"kernel32\" (ByVal wFlags<span style=\"color:blue;\"> As Long<\/span>, ByVal dwBytes<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare Function CloseClipboard Lib \"user32\" ()<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare Function OpenClipboard Lib \"user32\" (ByVal hWnd<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare Function EmptyClipboard Lib \"user32\" ()<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare Function lstrcpyW Lib \"kernel32\" (ByVal lpString1<span style=\"color:blue;\"> As Long<\/span>, ByVal lpString2<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare Function SetClipboardData Lib \"user32\" (ByVal wFormat<span style=\"color:blue;\"> As Long<\/span>, ByVal hMem<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare Function GetClipboardData Lib \"user32\" (ByVal wFormat<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare Function IsClipboardFormatAvailable Lib \"user32\" (ByVal wFormat<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare Function GlobalSize Lib \"kernel32\" (ByVal hMem<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare Function GlobalFree Lib \"kernel32\" (ByVal hMem<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Private <\/span>Declare Sub CopyMemoryByAddr Lib \"kernel32\" Alias \"RtlMoveMemory\" (ByVal Destination<span style=\"color:blue;\"> As Long<\/span>, _\r\n         ByVal Source<span style=\"color:blue;\"> As Long<\/span>, ByVal Length<span style=\"color:blue;\"> As Long<\/span>)\r\n#End If<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: API-Deklarationen f&uuml;r Funktionen rund um die Zwischenablage<\/span><\/b><\/p>\n<h2>Texte in die Zwischenablage schreiben<\/h2>\n<p>Die Funktion <b>Inzwischenablage<\/b> &uuml;bernimmt genau diese Aufgabe (siehe Listing 3): Sie erwartet als Parameter eine Zeichenkette, also eine beliebige Zeichenfolge, die sp&auml;ter &uuml;ber <b>Strg + V<\/b> oder andere Clipboard-Funktionen in eine andere Anwendung eingef&uuml;gt werden kann. Die Besonderheit dabei ist, dass wir hier bewusst auf das Unicode-Format setzen, also die Daten in der Zwischenablage als <b>CF_UNICODETEXT <\/b>speichern. Das hat den Vorteil, dass auch Sonderzeichen, Emojis und Umlaute sauber &uuml;bergeben werden &#8211; ganz im Gegensatz zur &auml;lteren <b>CF_TEXT<\/b>-Variante, bei der h&auml;ufig verst&uuml;mmelte oder unvollst&auml;ndige Zeichenfolgen herauskamen.<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>Const GHND = &H42\r\n<span style=\"color:blue;\">Public <\/span>Const CF_UNICODETEXT = 13\r\n<span style=\"color:blue;\">Function <\/span>Inzwischenablage(ByVal MyString<span style=\"color:blue;\"> As String<\/span>)\r\n#If Win64 Then\r\n     <span style=\"color:blue;\">Dim <\/span>hGlobalMemory<span style=\"color:blue;\"> As Long<\/span>Ptr\r\n     <span style=\"color:blue;\">Dim <\/span>lpGlobalMemory<span style=\"color:blue;\"> As Long<\/span>Ptr\r\n     <span style=\"color:blue;\">Dim <\/span>hClipMemory<span style=\"color:blue;\"> As Long<\/span>Ptr\r\n#Else\r\n     <span style=\"color:blue;\">Dim <\/span>hGlobalMemory<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lpGlobalMemory<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>hClipMemory<span style=\"color:blue;\"> As Long<\/span>\r\n#End If\r\n     <span style=\"color:blue;\">Dim <\/span>X<span style=\"color:blue;\"> As Long<\/span>\r\n     hGlobalMemory = GlobalAlloc(GHND, (<span style=\"color:blue;\">Len<\/span>(MyString) + 1) * 2)\r\n     lpGlobalMemory = GlobalLock(hGlobalMemory)\r\n     <span style=\"color:blue;\">Call<\/span> lstrcpyW(lpGlobalMemory, StrPtr(MyString))\r\n     <span style=\"color:blue;\">Call<\/span> GlobalUnlock(hGlobalMemory)\r\n     <span style=\"color:blue;\">If <\/span>OpenClipboard(0&) = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Konnte Zwischenablage nicht &ouml;ffnen.\", vbExclamation\r\n         <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">Call<\/span> EmptyClipboard\r\n     hClipMemory = SetClipboardData(CF_UNICODETEXT, hGlobalMemory)\r\n     <span style=\"color:blue;\">Call<\/span> CloseClipboard\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Funktion zum Einf&uuml;gen von Text in die Zwischenablage<\/span><\/b><\/p>\n<p>Die Funktion verwendet Windows-API-Funktionen wie <b>GlobalAlloc<\/b>, <b>GlobalLock<\/b>, <b>OpenClipboard <\/b>und <b>SetClipboardData<\/b>.<\/p>\n<p>All diese Funktionen sind je nach eingesetzter Office- beziehungsweise VBA-Version als 32-Bit- oder 64-Bit-Deklarationen definiert. Damit die Funktion in beiden Umgebungen l&auml;uft, unterscheiden wir nur die Variablentypen und API-Deklarationen &uuml;ber einen <b>#If Win64<\/b>-Block &#8211; der &uuml;brige Code ist vollst&auml;ndig gemeinsam nutzbar.<\/p>\n<p>Das bedeutet f&uuml;r die Praxis: Mit <b>Inzwischenablage strMeinText <\/b>l&auml;sst sich in jedem VBA-Projekt schnell ein l&auml;ngerer Text (zum Beispiel eine JSON-Antwort einer API, Log-Ausgabe, Datenbankabfrage und so weiter) in die Zwischenablage kopieren &#8211; unabh&auml;ngig davon, ob Access, Excel oder Word als Host verwendet wird.<\/p>\n<h2>Texte aus der Zwischenablage lesen<\/h2>\n<p>Die Gegenfunktion tr&auml;gt den Namen <b>AusZwischenablage <\/b>und ist im Prinzip die Umkehrung der obigen Funktion (siehe Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Function <\/span>AusZwischenablage()<span style=\"color:blue;\"> As String<\/span>\r\n#If Win64 Then\r\n     <span style=\"color:blue;\">Dim <\/span>hClipMemory<span style=\"color:blue;\"> As Long<\/span>Ptr\r\n     <span style=\"color:blue;\">Dim <\/span>lpClipMemory<span style=\"color:blue;\"> As Long<\/span>Ptr\r\n#Else\r\n     <span style=\"color:blue;\">Dim <\/span>hClipMemory<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>lpClipMemory<span style=\"color:blue;\"> As Long<\/span>\r\n#End If\r\n     <span style=\"color:blue;\">Dim <\/span>Size<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>Buffer<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>posNull<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">If <\/span>IsClipboardFormatAvailable(CF_UNICODETEXT) = 0<span style=\"color:blue;\"> Then<\/span> <span style=\"color:blue;\">Exit Function<\/span>\r\n     <span style=\"color:blue;\">If <\/span>OpenClipboard(0&)<span style=\"color:blue;\"> Then<\/span>\r\n         hClipMemory = GetClipboardData(CF_UNICODETEXT)\r\n         <span style=\"color:blue;\">If <\/span>hClipMemory &lt;&gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n             lpClipMemory = GlobalLock(hClipMemory)\r\n             <span style=\"color:blue;\">If <\/span>lpClipMemory &lt;&gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                 Size = GlobalSize(hClipMemory)\r\n                 <span style=\"color:blue;\">If <\/span>Size &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                     Buffer = String$(Size \\ 2, vbNullChar)\r\n                     CopyMemoryByAddr StrPtr(Buffer), lpClipMemory, Size\r\n                     posNull = <span style=\"color:blue;\">InStr<\/span>(Buffer, vbNullChar)\r\n                     <span style=\"color:blue;\">If <\/span>posNull &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n                         Buffer = Left$(Buffer, posNull - 1)\r\n                     <span style=\"color:blue;\">End If<\/span>\r\n                     AusZwischenablage = Buffer\r\n                 <span style=\"color:blue;\">End If<\/span>\r\n                 <span style=\"color:blue;\">Call<\/span> GlobalUnlock(hClipMemory)\r\n             <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         <span style=\"color:blue;\">Call<\/span> CloseClipboard\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Funktion zum Auslesen von Text aus der Zwischenablage<\/span><\/b><\/p>\n<p>Auch sie verwendet die genannten Windows-API-Funktionen, diesmal jedoch <b>GetClipboardData<\/b>, <b>GlobalLock<\/b>, <b>GlobalSize <\/b>und <b>CopyMemory<\/b>, um den Inhalt der Zwischenablage auszulesen und in eine <b>String<\/b>-Variable zu &uuml;berf&uuml;hren.<\/p>\n<p>Ein wichtiger Aspekt ist dabei erneut das Format: Wir greifen gezielt auf den Inhalt der Zwischenablage im Unicode-Textformat (<b>CF_UNICODETEXT<\/b>) zu. Das stellt sicher, dass auch Inhalte verarbeitet werden k&ouml;nnen, die Sonderzeichen enthalten &#8211; was bei Tokens, XML-Dateien oder UTF-8-kodierten Inhalten in der Praxis st&auml;ndig vorkommt.<\/p>\n<p>Ein h&auml;ufiges Anwendungsszenario ist das Auslesen eines Werts, den man zuvor aus einer externen Quelle (zum Beispiel einer Webseite, einem Editor oder einer Web-API) kopiert hat. In der Praxis sieht das dann so aus:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>strToken<span style=\"color:blue;\"> As String<\/span>\r\nstrToken = AusZwischenablage<\/pre>\n<h2>Zusammenfassung und Ausblick<\/h2>\n<p>Diese Funktionen zum Einf&uuml;gen von Texten in die Zwischenablagen und zum Auslesen von Texten aus der Zwischenablage setzen wir beispielsweise im Artikel  ein.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Zwischenablage ist ein praktisches Werkzeug, wenn es darum geht, Texte zu kopieren und an anderer Stelle wieder einzuf&uuml;gen. Das ist insbesondere sinnvoll, wenn es sich um umfangreichere Texte handelt. Dabei k&ouml;nnen wir Funktionen programmieren, die den markierten Text in die Zwischenablage kopieren und solche, die den Inhalt der Zwischenablage als Funktionsergebnis liefern.  In diesem Artikel schauen wir uns an, wo man solche Funktionen sinnvoll einsetzen kann und wie sie programmiert werden.<\/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":[66012025,662025,44000027,44000025],"tags":[],"yst_prominent_words":[],"class_list":["post-55000458","post","type-post","status-publish","format-standard","hentry","category-66012025","category-662025","category-Excel_programmieren","category-VBAProgrammierung"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000458","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000458"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000458\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000458"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000458"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000458"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000458"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}