Zeichenketten: Unterschied zwischen den Versionen
Pwania (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „== Zeichenketten aneinanderknüpfen == Zeichenketten werden in VBA mit dem '&'-Operator aneinandergeknüpft: Dim strText As String strText = "Hallo " & "liebe…“) |
Pwania (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
(17 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
[[Category:vba-wiki]] | |||
== Zeichenketten aneinanderknüpfen == | == Zeichenketten aneinanderknüpfen == | ||
Zeichenketten werden in VBA mit dem '&'-Operator aneinandergeknüpft: Dim strText As String strText = "Hallo " & "liebe " strText = strText & "Teilnehmer!" MsgBox "Sie arbeiten mit " & Application.Name & " Version " & Application.Version | Zeichenketten werden in VBA mit dem '&'-Operator aneinandergeknüpft: | ||
<span style="Color:blue">Dim </span>strText<span style="Color:blue"> As String </span> | |||
strText <span style="Color:gray">=</span> <span style="Color:gray">"Hallo "</span> & <span style="Color:gray">"liebe "</span> | |||
strText <span style="Color:gray">=</span> strText & <span style="Color:gray">"Teilnehmer!"</span> | |||
MsgBox <span style="Color:gray">"Sie arbeiten mit "</span> & Application<span style="Color:gray">.</span>Name & <span style="Color:gray">" Version "</span> & Application<span style="Color:gray">.</span>Version<span style="Color:blue"> | |||
== Besondere Zeichen == | == Besondere Zeichen == | ||
Zeile 7: | Zeile 14: | ||
=== Zeilenumbruch === | === Zeilenumbruch === | ||
Für Zeilenumbrüche stehen uns mehrere Möglichkeiten zu Verfügung: | |||
* die VBA-Konstante 'vbCrLf' (Carriage return = Schlitten einer Schreibmaschine in Ausgangsstellung bringen, Line feed = Zeilenvorschub) | |||
* die VBA-Konstante 'vbNewLine' (vereinfachter Name für den gleichen Wert wie 'vbCrLf') | |||
* das in der Zeichentabelle hinterlegte Zeichen für den Zeilenvorschub Chr(13) | |||
Im praktischen Einsatz führen alle Möglichkeiten zum gleichen Ergebnis: | |||
<span style="Color:blue">Dim </span>strText<span style="Color:blue"> As String </span> | |||
strText <span style="Color:gray">=</span> <span style="Color:gray">"Erste Zeile ..."</span> & vbCrLf & <span style="Color:gray">"Zweite Zeile!"</span> | |||
MsgBox strText | |||
strText <span style="Color:gray">=</span> <span style="Color:gray">"Erste Zeile ..."</span> & vbNewLine & <span style="Color:gray">"Zweite Zeile!"</span> | |||
MsgBox strText | |||
strText <span style="Color:gray">=</span> <span style="Color:gray">"Erste Zeile ..."</span> & chr<span style="Color:gray">(13)</span> & <span style="Color:gray">"Zweite Zeile!"</span> | |||
MsgBox strText<span style="Color:blue"> | |||
'''Bitte beachten:''' Anwendungsbedingte Unterschiede können eventuell auftreten, wenn Sie Texte in Dokumente, Arbeitsblätter oder Formen schreiben. | |||
=== Anführungszeichen === | === Anführungszeichen === | ||
Das Anführungszeichen wird dazu verwendet, Klartext von der Programmierung zu trennen (ansonsten würde VBA versuchen, 'Hallo du' als eine Prozedur 'Hallo' mit dem Übergabeparameter 'du' auszuführen). Wenn Sie innerhalb einer Zeichenkette Anführungszeichen verwenden möchten, können Sie das Anführungszeichen doppeln: Debug.Print "Und er sagte, ""Bitte verlassen Sie das Gebäude umgehend!""" <span style="color:green">' Ergibt: Und er sagte, "Bitte verlassen Sie das Gebäude umgehend!"</span> '''Bitte beachten:''' Am Ende der Zeichenkette mussten hier nun drei Anführungszeichen eingesetzt werden: Zwei, um das zweite Anführungszeichen darzustellen und ein weiteres, um die Zeichenkette abzuschließen. | Das Anführungszeichen wird dazu verwendet, Klartext von der Programmierung zu trennen (ansonsten würde VBA versuchen, 'Hallo du' als eine Prozedur 'Hallo' mit dem Übergabeparameter 'du' auszuführen). | ||
Wenn Sie innerhalb einer Zeichenkette Anführungszeichen verwenden möchten, können Sie das Anführungszeichen doppeln: | |||
Debug<span style="Color:gray">.</span>Print <span style="Color:gray">"Und er sagte, ""Bitte verlassen Sie das Gebäude umgehend!"""</span> <span style="color:green">' Ergibt: Und er sagte, "Bitte verlassen Sie das Gebäude umgehend!"</span> | |||
'''Bitte beachten:''' Am Ende der Zeichenkette mussten hier nun drei Anführungszeichen eingesetzt werden: Zwei, um das zweite Anführungszeichen darzustellen und ein weiteres, um die Zeichenkette abzuschließen. | |||
=== Weitere besondere Zeichen finden und eingeben === | === Weitere besondere Zeichen finden und eingeben === | ||
Zeile 17: | Zeile 48: | ||
==== Asc ==== | ==== Asc ==== | ||
Die 'Asc'-Funktion liefert die Position des angegebenen Zeichens in der ASCII-Zeichentabelle zurück. Debug.Print Asc("A") ' ergibt 65 '''Bitte beachten:''' Die ASCII-Zeichentabelle (ASCII bedeutet 'American Standard Code for Information Interchange') enthielt ursprünglich nur die 128 Zeichen, welche im englischsprachigen Raum benötigt wurden, also Satzzeichen, Groß- und Kleinbuchstaben von A-Z und die Ziffern von 0-9. Nicht enthalten waren Accents, Umlaute oder gar kyrillische, asiatische, arabische etc. Zeichen. Inzwischen wurden die Zeichensätze erweitert und enthalten theoretisch millionen von Zeichen. Die 'Asc'-Funktion kann trotz ihres Namens auf mehr als die 128 Zeichen zugreifen, nämlich auf den erweiterten ASCII-Zeichensatz bis 255 (siehe [[#Zeichentabellen|Zeichentabellen]]). Dieser enthält zusätzlich Umlaute, Accents und weitere Zeichen, die im europäischen Raum Verwendung finden und auf dem lateinischen Alphabet basieren. | Die 'Asc'-Funktion liefert die Position des angegebenen Zeichens in der ASCII-Zeichentabelle zurück. | ||
Debug.Print Asc("A") ' ergibt 65 | |||
'''Bitte beachten:''' Die ASCII-Zeichentabelle (ASCII bedeutet 'American Standard Code for Information Interchange') enthielt ursprünglich nur die 128 Zeichen, welche im englischsprachigen Raum benötigt wurden, also Satzzeichen, Groß- und Kleinbuchstaben von A-Z und die Ziffern von 0-9. | |||
Nicht enthalten waren Accents, Umlaute oder gar kyrillische, asiatische, arabische etc. Zeichen. Inzwischen wurden die Zeichensätze erweitert und enthalten theoretisch millionen von Zeichen. | |||
Die 'Asc'-Funktion kann trotz ihres Namens auf mehr als die 128 Zeichen zugreifen, nämlich auf den erweiterten ASCII-Zeichensatz bis 255 (siehe [[#Zeichentabellen|Zeichentabellen]]). Dieser enthält zusätzlich Umlaute, Accents und weitere Zeichen, die im europäischen Raum Verwendung finden und auf dem lateinischen Alphabet basieren. Siehe hierzu auch [[Zeichenketten#AscW und ChrW|AscW und ChrW]]. | |||
==== Chr ==== | ==== Chr ==== | ||
Die 'Chr'-Funktion ist die Umkehr-Funktion der 'Asc'-Funktion: Sie liefert das Zeichen zurück, das an einer gegebenen Position in der Zeichentabelle steht. Debug.Print Chr(65) ' ergibt den Buchstaben 'A' '''Bitte beachten:''' Bei der 'Chr'-Funktion gelten die gleichen Anmerkungen wie zur 'Asc'-Funktion! | Die 'Chr'-Funktion ist die Umkehr-Funktion der 'Asc'-Funktion: Sie liefert das Zeichen zurück, das an einer gegebenen Position in der Zeichentabelle steht. | ||
Debug<span style="Color:gray">.</span>Print Chr<span style="Color:gray">(65)</span> <span style="Color:green">' ergibt den Buchstaben 'A' </span> | |||
'''Bitte beachten:''' Bei der 'Chr'-Funktion gelten die gleichen Anmerkungen wie zur 'Asc'-Funktion! | |||
==== AscW und ChrW ==== | ==== AscW und ChrW ==== | ||
Diese beiden Funktionen entsprechen den 'Asc'- und 'Chr'-Funktionen, können jedoch auf den gesamten Unicode-Zeichensatz zugreifen, welcher 65535 (2 ^16) Zeichen enthält. Diese Funktionen sind daher für internationale Lösungen, die über die Grenzen Europas eingesetzt werden sollen, empfehlenswert. '''Bitte beachten:''' Der VBA-Editor ist NICHT unicode-fähig! Das bedeutet, dass die Zeichen aus der Zeichentabelle über der Position 255 hier nur lückenhaft zur Verfügung stehen. Die Office-Anwendungen sind es aber, daher können Sie in Word-Dokumenten, Excel-Zellen und PowerPoint-Folien auf den gesamten Zeichensatz zurückgreifen. Debug.Print Chr( | Diese beiden Funktionen entsprechen den 'Asc'- und 'Chr'-Funktionen, können jedoch auf den gesamten Unicode-Zeichensatz zugreifen, welcher 65535 (2 ^16) Zeichen enthält. | ||
Diese Funktionen sind daher für internationale Lösungen, die über die Grenzen Europas eingesetzt werden sollen, empfehlenswert. | |||
'''Bitte beachten:''' Der VBA-Editor ist NICHT unicode-fähig! Das bedeutet, dass die Zeichen aus der Zeichentabelle über der Position 255 hier nur lückenhaft zur Verfügung stehen. | |||
Die Office-Anwendungen sind es aber, daher können Sie in Word-Dokumenten, Excel-Zellen und PowerPoint-Folien auf den gesamten Zeichensatz zurückgreifen. | |||
Debug<span style="Color:gray">.</span>Print Chr<span style="Color:gray">(1162)</span> <span style="Color:green">' Erzeugt Fehler: Ungültiges Argument (1162 überschreitet den Maximalwert 255)</span> | |||
Debug<span style="Color:gray">.</span>Print ChrW<span style="Color:gray">(1162)</span> <span style="Color:green">' Im Debug-Fenster erscheint '?', weil der VBA-Editor dieses Zeichen nicht darstellen kann</span> | |||
ActiveCell<span style="Color:gray">.</span>Value <span style="Color:gray">=</span> ChrW<span style="Color:gray">(1162)</span> <span style="Color:green">' In der Excel-Zelle wird das tatsächliche Zeichen dargestellt: Ҋ</span> | |||
==== Zeichentabellen ==== | ==== Zeichentabellen ==== | ||
Zeile 552: | Zeile 602: | ||
== Zeichenketten umwandeln == | == Zeichenketten umwandeln == | ||
UCase() LCase() Debug.Print StrConv("alle anfangsbuchstaben werden groß", vbProperCase) ' Alle Anfangsbuchstaben Werden Groß Debug.Print StrReverse("umgekehrt") ' trhekegmu Private Sub StringManipulation() Dim strTest As String, strAnswer As String strTest = "Hallo liebe Schulungsteilnehmer und Herr Heß" | UCase() | ||
LCase() | |||
Debug.Print StrConv("alle anfangsbuchstaben werden groß", vbProperCase) ' Alle Anfangsbuchstaben Werden Groß | |||
Debug.Print StrReverse("umgekehrt") ' trhekegmu | |||
<span style="Color:blue">Private Sub </span>StringManipulation<span style="Color:gray">()</span> | |||
<span style="Color:blue"> Dim </span>strTest<span style="Color:blue"> As String</span><span style="Color:gray">,</span> strAnswer<span style="Color:blue"> As String</span> | |||
strTest <span style="Color:gray">=</span> <span style="Color:gray">"Hallo liebe Schulungsteilnehmer und Herr Heß"</span> | |||
strTest <span style="Color:gray">=</span> UCase<span style="Color:gray">(</span>strTest<span style="Color:gray">)</span> | |||
Debug<span style="Color:gray">.</span>Print strTest | |||
strTest <span style="Color:gray">=</span> LCase<span style="Color:gray">(</span>strTest<span style="Color:gray">)</span> | |||
Debug<span style="Color:gray">.</span>Print strTest | |||
<span style="Color:green">' Beispiel If-Abfrage:</span> | |||
strAnswer <span style="Color:gray">=</span> <span style="Color:gray">"Yes"</span> | |||
<span style="Color:blue"> If </span>LCase<span style="Color:gray">(</span>strAnswer<span style="Color:gray">)</span> <span style="Color:gray">=</span> <span style="Color:gray">"yes"</span><span style="Color:blue"> Then</span> | |||
MsgBox <span style="Color:gray">"Ja"</span> | |||
<span style="Color:blue"> End If | |||
End Sub</span> | |||
== Zeichenketten aufteilen und kürzen == | == Zeichenketten aufteilen und kürzen == | ||
Left() Right() Mid() Trim() LTrim() RTrim() Private Sub StringCutters() Dim strTest As String, strString As String strString = "Hallo liebe Schulungsteilnehmer und Herr Heß" ' Hier werden Zeichenfolgen geschnitten: strTest = Left(strString, 2) | Left() | ||
Right() | |||
Mid() | |||
Trim() | |||
LTrim() | |||
RTrim() | |||
<span style="Color:blue">Private Sub </span>StringCutters<span style="Color:gray">()</span> | |||
<span style="Color:blue"> Dim </span>strTest<span style="Color:blue"> As String</span><span style="Color:gray">,</span> strString<span style="Color:blue"> As String</span> | |||
strString <span style="Color:gray">=</span> <span style="Color:gray">"Hallo liebe Schulungsteilnehmer und Herr Heß"</span> | |||
<span style="Color:green">' Hier werden Zeichenfolgen geschnitten:</span> | |||
strTest <span style="Color:gray">=</span> Left<span style="Color:gray">(</span>strString<span style="Color:gray">,</span> <span style="Color:gray">2)</span> | |||
Debug<span style="Color:gray">.</span>Print strTest <span style="Color:green">' Ha</span> | |||
strTest <span style="Color:gray">=</span> Right<span style="Color:gray">(</span>strString<span style="Color:gray">,</span> <span style="Color:gray">2)</span> | |||
Debug<span style="Color:gray">.</span>Print strTest <span style="Color:green">' eß</span> | |||
strTest <span style="Color:gray">=</span> Mid<span style="Color:gray">(</span>strString<span style="Color:gray">,</span> <span style="Color:gray">7,</span> <span style="Color:gray">25)</span> | |||
Debug<span style="Color:gray">.</span>Print strTest <span style="Color:green">' liebe Schulungsteilnehmer</span> | |||
<span style="Color:green">' Die Trim-Funktionen entfernen Leerzeichen (auch mehrere) vom Anfange und/oder Ende des Textes</span> | |||
strString <span style="Color:gray">=</span> <span style="Color:gray">" Trim Me "</span> | |||
Debug<span style="Color:gray">.</span>Print <span style="Color:gray">"'"</span> & strString & <span style="Color:gray">"'"</span> <span style="Color:green">' Trim Me '</span> | |||
strTest <span style="Color:gray">=</span> LTrim<span style="Color:gray">(</span>strString<span style="Color:gray">)</span> | |||
Debug<span style="Color:gray">.</span>Print <span style="Color:gray">"'"</span> & strTest & <span style="Color:gray">"'"</span> <span style="Color:green">'Trim Me '</span> | |||
strTest <span style="Color:gray">=</span> RTrim<span style="Color:gray">(</span>strString<span style="Color:gray">)</span> | |||
Debug<span style="Color:gray">.</span>Print <span style="Color:gray">"'"</span> & strTest & <span style="Color:gray">"'"</span> <span style="Color:green">' Trim Me'</span> | |||
strTest <span style="Color:gray">=</span> Trim<span style="Color:gray">(</span>strString<span style="Color:gray">)</span> | |||
Debug<span style="Color:gray">.</span>Print <span style="Color:gray">"'"</span> & strTest & <span style="Color:gray">"'"</span> <span style="Color:green">'Trim Me'</span> | |||
<span style="Color:blue">End Sub</span> | |||
== In Zeichenketten ersetzen == | == In Zeichenketten ersetzen == | ||
Die Funktion für das Ersetzen von Teilen einer Zeichenkette heißt 'Replace'. Private Sub StringReplace() Dim strString As String ' Suchen und Ersetzen von Zeichenfolgen strString = "Ich werde gesucht und ersetzt" Debug.Print strString Debug.Print Replace(strString, "gesucht", "gefunden") ' Groß- / Kleinschreibung wird beachtet! Debug.Print Replace(strString, "Gesucht", "gefunden") ' vbTextCompare: Groß- / Kleinschreibung wird ignoriert! Debug.Print Replace(strString, "Gesucht", "gefunden", , , vbTextCompare) End Sub Das reine 'Replace' führt die Ersetzung jedoch nur in einem Durchlauf durch, daher können mehrfach hintereinander auftretende Treffer eventuell nicht alle ersetzt werden (zur besseren Darstellung werden '+'-Zeichen statt Leerzeichen verwendet): Debug.Print Replace("++Text+++++mit+++überschüssigen+Leerzeichen+...+", "++", "+") Ergebnis (enthält immer noch doppelte Leerzeichen): | Die Funktion für das Ersetzen von Teilen einer Zeichenkette heißt 'Replace'. | ||
<span style="Color:blue">Private Sub </span>StringReplace<span style="Color:gray">()</span> | |||
<span style="Color:blue"> Dim </span>strString<span style="Color:blue"> As String </span><span style="Color:green">' Suchen und Ersetzen von Zeichenfolgen</span> | |||
strString <span style="Color:gray">=</span> <span style="Color:gray">"Ich werde gesucht und ersetzt"</span> | |||
Debug<span style="Color:gray">.</span>Print strString | |||
Debug<span style="Color:gray">.</span>Print Replace<span style="Color:gray">(</span>strString<span style="Color:gray">,</span> <span style="Color:gray">"gesucht",</span> <span style="Color:gray">"gefunden")</span> | |||
<span style="Color:green">' Groß- / Kleinschreibung wird beachtet!</span> | |||
Debug<span style="Color:gray">.</span>Print Replace<span style="Color:gray">(</span>strString<span style="Color:gray">,</span> <span style="Color:gray">"Gesucht",</span> <span style="Color:gray">"gefunden")</span> | |||
<span style="Color:green">' vbTextCompare: Groß- / Kleinschreibung wird ignoriert!</span> | |||
Debug<span style="Color:gray">.</span>Print Replace<span style="Color:gray">(</span>strString<span style="Color:gray">,</span> <span style="Color:gray">"Gesucht",</span> <span style="Color:gray">"gefunden",</span> <span style="Color:gray">,</span> <span style="Color:gray">,</span> vbTextCompare<span style="Color:gray">)</span><span style="Color:blue"> | |||
End Sub</span> | |||
Das reine 'Replace' führt die Ersetzung jedoch nur in einem Durchlauf durch, daher können mehrfach hintereinander auftretende Treffer eventuell nicht alle ersetzt werden (zur besseren Darstellung werden '+'-Zeichen statt Leerzeichen verwendet): | |||
Debug<span style="Color:gray">.</span>Print Replace<span style="Color:gray">("++Text+++++mit+++überschüssigen+Leerzeichen+...+",</span> <span style="Color:gray">"++",</span> <span style="Color:gray">"+")</span> | |||
Das Ergebnis (enthält immer noch doppelte Leerzeichen): | |||
+Text+++mit++überschüssigen+Leerzeichen+...+ | |||
Mit einer selbst geschriebenen Funktion 'ReplaceRecursively' kann dem abhilfe geschaffen werden: | |||
* Der ursprüngliche Text wird in einer Variablen gespeichert. | * Der ursprüngliche Text wird in einer Variablen gespeichert. | ||
* Das Ersetzen mit 'Replace' wird durchgeführt (mit Rücksicht auf die optionale Angabe zur Groß- und Kleinschreibung). | * Das Ersetzen mit 'Replace' wird durchgeführt (mit Rücksicht auf die optionale Angabe zur Groß- und Kleinschreibung). | ||
* Wenn durch das Ersetzen eine Änderung am Text erfolgt ist, wird die Funktion nochmals aufgerufen (siehe [[Rekursionen]]). | * Wenn durch das Ersetzen eine Änderung am Text erfolgt ist, wird die Funktion nochmals aufgerufen (siehe [[Rekursionen]]). | ||
* Hierbei wird das Ergebnis des Ersetzens als neuer Ausgangstext verwendet. Public Function ReplaceRecursively(ByVal strInText As String, ByVal strFind As String, ByVal strReplace As String, Optional ByVal blnMatchCase As Boolean) As String Dim strTemp As String strTemp = strInText If blnMatchCase = True Then ReplaceRecursively = Replace(strInText, strFind, strReplace) Else ReplaceRecursively = Replace(strInText, strFind, strReplace, , , vbTextCompare) End If If strTemp <> ReplaceRecursively Then ReplaceRecursively = ReplaceRecursively(ReplaceRecursively, strFind, strReplace, blnMatchCase) End If End Function Ergebnis: | * Hierbei wird das Ergebnis des Ersetzens als neuer Ausgangstext verwendet. | ||
<span style="Color:blue">Public Function </span>ReplaceRecursively<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strInText<span style="Color:blue"> As String</span><span style="Color:gray">,</span><span style="Color:blue"> ByVal </span>strFind<span style="Color:blue"> As String</span><span style="Color:gray">,</span><span style="Color:blue"> ByVal </span>strReplace<span style="Color:blue"> As String</span><span style="Color:gray">,</span> Optional<span style="Color:blue"> ByVal </span>blnMatchCase<span style="Color:blue"> As Boolean</span><span style="Color:gray">)</span><span style="Color:blue"> As String</span> | |||
<span style="Color:blue"> Dim </span>strTemp<span style="Color:blue"> As String</span> | |||
strTemp <span style="Color:gray">=</span> strInText | |||
<span style="Color:blue"> If </span>blnMatchCase <span style="Color:gray">=</span><span style="Color:blue"> True Then</span> | |||
ReplaceRecursively <span style="Color:gray">=</span> Replace<span style="Color:gray">(</span>strInText<span style="Color:gray">,</span> strFind<span style="Color:gray">,</span> strReplace<span style="Color:gray">)</span> | |||
<span style="Color:blue"> Else</span> | |||
ReplaceRecursively <span style="Color:gray">=</span> Replace<span style="Color:gray">(</span>strInText<span style="Color:gray">,</span> strFind<span style="Color:gray">,</span> strReplace<span style="Color:gray">,</span> <span style="Color:gray">,</span> <span style="Color:gray">,</span> vbTextCompare<span style="Color:gray">)</span> | |||
<span style="Color:blue"> End If</span> | |||
<span style="Color:blue"> If </span>strTemp <span style="Color:gray"><></span> ReplaceRecursively<span style="Color:blue"> Then </span> | |||
ReplaceRecursively <span style="Color:gray">=</span> ReplaceRecursively<span style="Color:gray">(</span>ReplaceRecursively<span style="Color:gray">,</span> strFind<span style="Color:gray">,</span> strReplace<span style="Color:gray">,</span> blnMatchCase<span style="Color:gray">)</span> <span style="Color:green">' rekursiver Aufruf der eigenen Funktion wirkt wie eine Schleife</span> | |||
<span style="Color:blue"> End If | |||
End Function</span> | |||
Debug<span style="Color:gray">.</span>Print ReplaceRecursively<span style="Color:gray">("++Text+++++mit+++überschüssigen+Leerzeichen+...+",</span> <span style="Color:gray">"++",</span> <span style="Color:gray">"+")</span> | |||
Ergebnis nun: | |||
+Text+mit+überschüssigen+Leerzeichen+...+ | |||
== Position innerhalb einer Zeichenkette, Länge ermitteln == | == Position innerhalb einer Zeichenkette, Länge ermitteln == | ||
InStr() InStrRev() Len() Private Sub StringMath() Dim strTest As String, strString As String Dim lngPosition As Long, lngLength As Long strString = "Hallo liebe Schulungsteilnehmer und Herr Heß" ' Ermittlung der Länge einer Zeichenkette: lngLength = Len(strString) Debug.Print "Die Zeichenkette enthält " & lngLength & " Zeichen" ' Ermittlung von Zeichenpositionen: lngPosition = InStr(strString, " ") Debug.Print "Erstes Leerzeichen an Position: " & lngPosition ' bei der Suche nach dem nächsten Leerzeichen die letzte Position + 1 als Anfangsposition verwenden! lngPosition = InStr(lngPosition + 1, strString, " ") Debug.Print "Zweites Leerzeichen an Position: " & lngPosition lngPosition = InStr(strString, "y") Debug.Print "'y' an Position: " & lngPosition lngPosition = InStr(strString, "Schul") Debug.Print "'Schul' an Position: " & lngPosition ' InStr und InStrRev achten auf Groß- / Kleinschreibung! lngPosition = InStr(strString, "schul") Debug.Print "'schul' (klein geschrieben!) an Position: " & lngPosition ' Wenn die Groß- / Kleinschreibung nicht berücksichtigt werden soll, ' kann der Parameter 'Compare' auf 'vbTextCompare' geändert werden. ' Dann muss allerdings auch der Anfangspunkt angegeben werden: lngPosition = InStr(1, strString, "SCHul", vbTextCompare) Debug.Print "'SCHul' (Groß-/Kleinschreibung nicht beachten!) an Position: " & lngPosition ' InStrRev findet die letzte Position einer Zeichenkette innerhalb der vorgegebenen Zeichenkette ' Die Position wird weiterhin von links gesehen angegeben lngPosition = InStrRev(strString, " ") Debug.Print "Letztes Leerzeichen an Position: " & lngPosition ' bei der Suche nach dem vorhergehenden Leerzeichen die letzte Position - 1 als Anfangsposition verwenden! lngPosition = InStrRev(strString, " ", 41 - 1) Debug.Print "Vorletztes Leerzeichen an Position: " & lngPosition End Sub | InStr() | ||
InStrRev() | |||
Len() | |||
<span style="Color:blue">Private Sub </span>StringMath<span style="Color:gray">()</span> | |||
<span style="Color:blue"> Dim </span>strTest<span style="Color:blue"> As String</span><span style="Color:gray">,</span> strString<span style="Color:blue"> As String</span> | |||
<span style="Color:blue"> Dim </span>lngPosition<span style="Color:blue"> As Long</span><span style="Color:gray">,</span> lngLength<span style="Color:blue"> As Long</span> | |||
strString <span style="Color:gray">=</span> <span style="Color:gray">"Hallo liebe Schulungsteilnehmer und Herr Heß"</span> | |||
<span style="Color:green">' Ermittlung der Länge einer Zeichenkette:</span> | |||
lngLength <span style="Color:gray">=</span> Len<span style="Color:gray">(</span>strString<span style="Color:gray">)</span> | |||
Debug<span style="Color:gray">.</span>Print <span style="Color:gray">"Die Zeichenkette enthält "</span> & lngLength & <span style="Color:gray">" Zeichen"</span> | |||
<span style="Color:green">' Ermittlung von Zeichenpositionen:</span> | |||
lngPosition <span style="Color:gray">=</span> InStr<span style="Color:gray">(</span>strString<span style="Color:gray">,</span> <span style="Color:gray">" ")</span> | |||
Debug<span style="Color:gray">.</span>Print <span style="Color:gray">"Erstes Leerzeichen an Position: "</span> & lngPosition | |||
<span style="Color:green">' bei der Suche nach dem nächsten Leerzeichen die letzte Position + 1 als Anfangsposition verwenden!</span> | |||
lngPosition <span style="Color:gray">=</span> InStr<span style="Color:gray">(</span>lngPosition <span style="Color:gray">+</span> <span style="Color:gray">1,</span> strString<span style="Color:gray">,</span> <span style="Color:gray">" ")</span> | |||
Debug<span style="Color:gray">.</span>Print <span style="Color:gray">"Zweites Leerzeichen an Position: "</span> & lngPosition | |||
lngPosition <span style="Color:gray">=</span> InStr<span style="Color:gray">(</span>strString<span style="Color:gray">,</span> <span style="Color:gray">"y")</span> | |||
Debug<span style="Color:gray">.</span>Print <span style="Color:gray">"'y' an Position: "</span> & lngPosition | |||
lngPosition <span style="Color:gray">=</span> InStr<span style="Color:gray">(</span>strString<span style="Color:gray">,</span> <span style="Color:gray">"Schul")</span> | |||
Debug<span style="Color:gray">.</span>Print <span style="Color:gray">"'Schul' beginnt an Position: "</span> & lngPosition | |||
<span style="Color:green">' InStr und InStrRev achten auf Groß- / Kleinschreibung!</span> | |||
lngPosition <span style="Color:gray">=</span> InStr<span style="Color:gray">(</span>strString<span style="Color:gray">,</span> <span style="Color:gray">"schul")</span> | |||
Debug<span style="Color:gray">.</span>Print <span style="Color:gray">"'schul' (klein geschrieben!) an Position: "</span> & lngPosition | |||
<span style="Color:green">' Wenn die Groß- / Kleinschreibung nicht berücksichtigt werden soll,</span> | |||
<span style="Color:green">' kann der Parameter 'Compare' auf 'vbTextCompare' geändert werden.</span> | |||
<span style="Color:green">' Dann muss allerdings auch der Anfangspunkt angegeben werden:</span> | |||
lngPosition <span style="Color:gray">=</span> InStr<span style="Color:gray">(1,</span> strString<span style="Color:gray">,</span> <span style="Color:gray">"SCHul",</span> vbTextCompare<span style="Color:gray">)</span> | |||
Debug<span style="Color:gray">.</span>Print <span style="Color:gray">"'SCHul' (Groß-/Kleinschreibung nicht beachten!) an Position: "</span> & lngPosition | |||
<span style="Color:green">' InStrRev findet die letzte Position einer Zeichenkette innerhalb der vorgegebenen Zeichenkette</span> | |||
<span style="Color:green">' Die Position wird weiterhin von links gesehen angegeben</span> | |||
lngPosition <span style="Color:gray">=</span> InStrRev<span style="Color:gray">(</span>strString<span style="Color:gray">,</span> <span style="Color:gray">" ")</span> | |||
Debug<span style="Color:gray">.</span>Print <span style="Color:gray">"Letztes Leerzeichen an Position: "</span> & lngPosition | |||
<span style="Color:green">' bei der Suche nach dem vorhergehenden Leerzeichen die letzte Position - 1 als Anfangsposition verwenden!</span> | |||
lngPosition <span style="Color:gray">=</span> InStrRev<span style="Color:gray">(</span>strString<span style="Color:gray">,</span> <span style="Color:gray">" ",</span> <span style="Color:gray">41</span> <span style="Color:gray">-</span> <span style="Color:gray">1)</span> | |||
Debug<span style="Color:gray">.</span>Print <span style="Color:gray">"Vorletztes Leerzeichen an Position: "</span> & lngPosition<span style="Color:blue"> | |||
End Sub</span> | |||
== Zeichenkette erzeugen == | == Zeichenkette erzeugen == | ||
Mithilfe der String-Funktion können Sie eine Zeichenkette erzeugen, die eine angegebene Anzahl von Wiederholungen des gleichen Buchstaben enthält: Debug.Print String(3, "A") ' Ergibt 'AAA' In einem 'Like'-Vergleich können wir dies wie folgt einsetzen: Public Function IsNumber(ByVal strNumber As String) As Boolean IsNumber = True If strNumber Like String(Len(strNumber), "#") Then Exit Function End If IsNumber = False End Function Die Anweisung 'String(Len(strNumber), "#")' erzeugt einen Vergleichs-Text, der aus so vielen '#' besteht, wie Zeichen im übergebenen String sind. Hiermit wird also festgestellt, ob strNumber ausschließlich aus Ziffern besteht, also eine Ganzzahl ist. | Mithilfe der String-Funktion können Sie eine Zeichenkette erzeugen, die eine angegebene Anzahl von Wiederholungen des gleichen Buchstaben enthält: | ||
Debug<span style="Color:gray">.</span>Print String<span style="Color:gray">(3,</span> <span style="Color:gray">"A")</span> <span style="Color:green">' Ergibt 'AAA' </span> | |||
In einem 'Like'-Vergleich können wir dies wie folgt einsetzen: | |||
<span style="Color:blue">Public Function </span>IsNumber<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strNumber<span style="Color:blue"> As String</span><span style="Color:gray">)</span><span style="Color:blue"> As Boolean</span> | |||
IsNumber <span style="Color:gray">=</span><span style="Color:blue"> True</span> | |||
<span style="Color:blue"> If </span>strNumber<span style="Color:blue"> Like </span>String<span style="Color:gray">(</span>Len<span style="Color:gray">(</span>strNumber<span style="Color:gray">),</span> <span style="Color:gray">"#")</span><span style="Color:blue"> Then</span> | |||
<span style="Color:blue"> Exit Function</span> | |||
<span style="Color:blue"> End If</span> | |||
IsNumber <span style="Color:gray">=</span><span style="Color:blue"> False | |||
End Function</span> | |||
Die Anweisung 'String(Len(strNumber), "#")' erzeugt einen Vergleichs-Text, der aus so vielen '#' besteht, wie Zeichen im übergebenen String sind. Hiermit wird also festgestellt, ob strNumber ausschließlich aus Ziffern besteht, also eine Ganzzahl ist. | |||
== Beispiele == | == Beispiele == | ||
Public Function LastWord(ByVal strText As String) As String Dim strWord As String Dim lngPosition As Long lngPosition = InStrRev(strText, " ") strWord = Right(strText, Len(strText) - lngPosition) LastWord = strWord End Function Private Function LastWordMid(ByVal strText As String) As String Dim strWord As String Dim lngPosition As Long lngPosition = InStrRev(strText, " ") strWord = Mid(strText, lngPosition + 1) LastWordMid = strWord End Function Public Function FirstWord(ByVal strText As String) As String Dim strWord As String Dim lngPosition As Long lngPosition = InStr(strText, " ") If lngPosition <= 0 Then strWord = strText Else strWord = Left(strText, lngPosition - 1) End If FirstWord = strWord End Function Public Function AnyWord(ByVal strText As String, ByVal lngIndex As Long) As String Dim strWord As String Dim | <span style="Color:blue">Public Function </span>LastWord<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strText<span style="Color:blue"> As String</span><span style="Color:gray">)</span><span style="Color:blue"> As String</span> | ||
<span style="Color:blue"> Dim </span>strWord<span style="Color:blue"> As String</span> | |||
<span style="Color:blue"> Dim </span>lngPosition<span style="Color:blue"> As Long</span> | |||
lngPosition <span style="Color:gray">=</span> InStrRev<span style="Color:gray">(</span>strText<span style="Color:gray">,</span> <span style="Color:gray">" ")</span> | |||
strWord <span style="Color:gray">=</span> Right<span style="Color:gray">(</span>strText<span style="Color:gray">,</span> Len<span style="Color:gray">(</span>strText<span style="Color:gray">)</span> <span style="Color:gray">-</span> lngPosition<span style="Color:gray">)</span> | |||
LastWord <span style="Color:gray">=</span> strWord<span style="Color:blue"> | |||
End Function</span> | |||
<span style="Color:blue">Private Function </span>LastWordMid<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strText<span style="Color:blue"> As String</span><span style="Color:gray">)</span><span style="Color:blue"> As String</span> | |||
<span style="Color:blue"> Dim </span>strWord<span style="Color:blue"> As String</span> | |||
<span style="Color:blue"> Dim </span>lngPosition<span style="Color:blue"> As Long</span> | |||
lngPosition <span style="Color:gray">=</span> InStrRev<span style="Color:gray">(</span>strText<span style="Color:gray">,</span> <span style="Color:gray">" ")</span> | |||
strWord <span style="Color:gray">=</span> Mid<span style="Color:gray">(</span>strText<span style="Color:gray">,</span> lngPosition <span style="Color:gray">+</span> <span style="Color:gray">1)</span> | |||
LastWordMid <span style="Color:gray">=</span> strWord<span style="Color:blue"> | |||
End Function</span> | |||
<span style="Color:blue">Public Function </span>FirstWord<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strText<span style="Color:blue"> As String</span><span style="Color:gray">)</span><span style="Color:blue"> As String</span> | |||
<span style="Color:blue"> Dim </span>strWord<span style="Color:blue"> As String</span> | |||
<span style="Color:blue"> Dim </span>lngPosition<span style="Color:blue"> As Long</span> | |||
lngPosition <span style="Color:gray">=</span> InStr<span style="Color:gray">(</span>strText<span style="Color:gray">,</span> <span style="Color:gray">" ")</span> | |||
<span style="Color:blue"> If </span>lngPosition <span style="Color:gray"><</span> <span style="Color:gray">=</span> <span style="Color:gray">0</span><span style="Color:blue"> Then</span> | |||
strWord <span style="Color:gray">=</span> strText | |||
<span style="Color:blue"> Else</span> | |||
strWord <span style="Color:gray">=</span> Left<span style="Color:gray">(</span>strText<span style="Color:gray">,</span> lngPosition <span style="Color:gray">-</span> <span style="Color:gray">1)</span> | |||
<span style="Color:blue"> End If</span> | |||
FirstWord <span style="Color:gray">=</span> strWord<span style="Color:blue"> | |||
End Function</span> | |||
<span style="Color:blue">Public Function </span>AnyWord<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strText<span style="Color:blue"> As String</span><span style="Color:gray">,</span><span style="Color:blue"> ByVal </span>lngIndex<span style="Color:blue"> As Long</span><span style="Color:gray">)</span><span style="Color:blue"> As String</span> | |||
<span style="Color:blue"> Dim </span>strWord<span style="Color:blue"> As String</span> | |||
<span style="Color:blue"> Dim </span>lngPos<span style="Color:gray">1</span><span style="Color:blue"> As Long</span><span style="Color:gray">,</span> lngPos<span style="Color:gray">2</span><span style="Color:blue"> As Long</span><span style="Color:gray">,</span> lngWord<span style="Color:blue"> As Long</span> | |||
<span style="Color:blue"> Dim </span>blnLastItem<span style="Color:blue"> As Boolean</span> | |||
lngPos<span style="Color:gray">1</span> <span style="Color:gray">=</span> <span style="Color:gray">1</span> | |||
<span style="Color:blue"> For </span>lngWord <span style="Color:gray">=</span> <span style="Color:gray">1</span><span style="Color:blue"> To </span>lngIndex | |||
<span style="Color:blue"> If </span>blnLastItem <span style="Color:gray">=</span><span style="Color:blue"> True Then</span> | |||
strWord <span style="Color:gray">=</span> <span style="Color:gray">""</span> | |||
<span style="Color:blue"> Exit For</span> | |||
<span style="Color:blue"> End If</span> | |||
lngPos<span style="Color:gray">2</span> <span style="Color:gray">=</span> InStr<span style="Color:gray">(</span>lngPos<span style="Color:gray">1,</span> strText<span style="Color:gray">,</span> <span style="Color:gray">" ")</span> | |||
<span style="Color:blue"> If </span>lngPos<span style="Color:gray">2</span> <span style="Color:gray"><</span> <span style="Color:gray">=</span> <span style="Color:gray">0</span><span style="Color:blue"> Then</span> | |||
<span style="Color:blue"> If </span>lngPos<span style="Color:gray">1</span> <span style="Color:gray"><</span> <span style="Color:gray">=</span> <span style="Color:gray">1</span><span style="Color:blue"> Then</span> | |||
strWord <span style="Color:gray">=</span> strText | |||
blnLastItem <span style="Color:gray">=</span><span style="Color:blue"> True</span> | |||
<span style="Color:blue"> Else</span> | |||
strWord <span style="Color:gray">=</span> Mid<span style="Color:gray">(</span>strText<span style="Color:gray">,</span> lngPos<span style="Color:gray">1)</span> | |||
blnLastItem <span style="Color:gray">=</span><span style="Color:blue"> True</span> | |||
<span style="Color:blue"> End If</span> | |||
<span style="Color:blue"> Else</span> | |||
strWord <span style="Color:gray">=</span> Mid<span style="Color:gray">(</span>strText<span style="Color:gray">,</span> lngPos<span style="Color:gray">1,</span> lngPos<span style="Color:gray">2</span> <span style="Color:gray">-</span> lngPos<span style="Color:gray">1)</span> | |||
<span style="Color:blue"> End If</span> | |||
lngPos<span style="Color:gray">1</span> <span style="Color:gray">=</span> lngPos<span style="Color:gray">2</span> <span style="Color:gray">+</span> <span style="Color:gray">1</span> | |||
<span style="Color:blue"> Next </span>lngWord | |||
AnyWord <span style="Color:gray">=</span> strWord<span style="Color:blue"> | |||
End Function</span> | |||
<span style="Color:blue">Public Function </span>ListItem<span style="Color:gray">(</span><span style="Color:blue">ByVal </span>strList<span style="Color:blue"> As String</span><span style="Color:gray">,</span><span style="Color:blue"> ByVal </span>lngItem<span style="Color:blue"> As Long</span><span style="Color:gray">,</span> Optional<span style="Color:blue"> ByVal </span>strSeparator<span style="Color:blue"> As String </span><span style="Color:gray">=</span> <span style="Color:gray">",")</span><span style="Color:blue"> As String</span> | |||
<span style="Color:blue"> Dim </span>strWord<span style="Color:blue"> As String</span> | |||
<span style="Color:blue"> Dim </span>lngPos<span style="Color:gray">1</span><span style="Color:blue"> As Long</span><span style="Color:gray">,</span> lngPos<span style="Color:gray">2</span><span style="Color:blue"> As Long</span><span style="Color:gray">,</span> lngWord<span style="Color:blue"> As Long</span><span style="Color:gray">,</span> lngOffset<span style="Color:blue"> As Long</span> | |||
<span style="Color:blue"> Dim </span>blnLastItem<span style="Color:blue"> As Boolean</span> | |||
lngPos<span style="Color:gray">1</span> <span style="Color:gray">=</span> <span style="Color:gray">1</span> | |||
<span style="Color:blue"> For </span>lngWord <span style="Color:gray">=</span> <span style="Color:gray">1</span><span style="Color:blue"> To </span>lngItem | |||
<span style="Color:blue"> If </span>blnLastItem <span style="Color:gray">=</span><span style="Color:blue"> True Then</span> | |||
strWord <span style="Color:gray">=</span> <span style="Color:gray">""</span> | |||
<span style="Color:blue"> Exit For</span> | |||
<span style="Color:blue"> End If</span> | |||
<span style="Color:blue"> If </span>lngWord <span style="Color:gray">></span> <span style="Color:gray">1</span><span style="Color:blue"> Then</span> | |||
lngOffset <span style="Color:gray">=</span> Len<span style="Color:gray">(</span>strSeparator<span style="Color:gray">)</span> <span style="Color:gray">-</span> <span style="Color:gray">1</span> | |||
<span style="Color:blue"> End If</span> | |||
lngPos<span style="Color:gray">2</span> <span style="Color:gray">=</span> InStr<span style="Color:gray">(</span>lngPos<span style="Color:gray">1,</span> strList<span style="Color:gray">,</span> strSeparator<span style="Color:gray">)</span> | |||
<span style="Color:blue"> If </span>lngPos<span style="Color:gray">2</span> <span style="Color:gray"><</span> <span style="Color:gray">=</span> <span style="Color:gray">0</span><span style="Color:blue"> Then</span> | |||
<span style="Color:blue"> If </span>lngPos<span style="Color:gray">1</span> <span style="Color:gray"><</span> <span style="Color:gray">=</span> <span style="Color:gray">1</span><span style="Color:blue"> Then</span> | |||
strWord <span style="Color:gray">=</span> strList | |||
blnLastItem <span style="Color:gray">=</span><span style="Color:blue"> True</span> | |||
<span style="Color:blue"> Else</span> | |||
strWord <span style="Color:gray">=</span> Mid<span style="Color:gray">(</span>strList<span style="Color:gray">,</span> lngPos<span style="Color:gray">1</span> <span style="Color:gray">+</span> lngOffset<span style="Color:gray">)</span> | |||
blnLastItem <span style="Color:gray">=</span><span style="Color:blue"> True</span> | |||
<span style="Color:blue"> End If</span> | |||
<span style="Color:blue"> Else</span> | |||
strWord <span style="Color:gray">=</span> Mid<span style="Color:gray">(</span>strList<span style="Color:gray">,</span> lngPos<span style="Color:gray">1</span> <span style="Color:gray">+</span> lngOffset<span style="Color:gray">,</span> lngPos<span style="Color:gray">2</span> <span style="Color:gray">-</span> lngPos<span style="Color:gray">1</span> <span style="Color:gray">-</span> lngOffset<span style="Color:gray">)</span> | |||
<span style="Color:blue"> End If</span> | |||
lngPos<span style="Color:gray">1</span> <span style="Color:gray">=</span> lngPos<span style="Color:gray">2</span> <span style="Color:gray">+</span> <span style="Color:gray">1</span> | |||
<span style="Color:blue"> Next </span>lngWord | |||
ListItem <span style="Color:gray">=</span> strWord<span style="Color:blue"> | |||
End Function</span> |
Aktuelle Version vom 28. Januar 2023, 00:40 Uhr
Zeichenketten aneinanderknüpfen
Zeichenketten werden in VBA mit dem '&'-Operator aneinandergeknüpft:
Dim strText As String strText = "Hallo " & "liebe " strText = strText & "Teilnehmer!" MsgBox "Sie arbeiten mit " & Application.Name & " Version " & Application.Version
Besondere Zeichen
Zeilenumbruch
Für Zeilenumbrüche stehen uns mehrere Möglichkeiten zu Verfügung:
- die VBA-Konstante 'vbCrLf' (Carriage return = Schlitten einer Schreibmaschine in Ausgangsstellung bringen, Line feed = Zeilenvorschub)
- die VBA-Konstante 'vbNewLine' (vereinfachter Name für den gleichen Wert wie 'vbCrLf')
- das in der Zeichentabelle hinterlegte Zeichen für den Zeilenvorschub Chr(13)
Im praktischen Einsatz führen alle Möglichkeiten zum gleichen Ergebnis:
Dim strText As String strText = "Erste Zeile ..." & vbCrLf & "Zweite Zeile!" MsgBox strText strText = "Erste Zeile ..." & vbNewLine & "Zweite Zeile!" MsgBox strText strText = "Erste Zeile ..." & chr(13) & "Zweite Zeile!" MsgBox strText
Bitte beachten: Anwendungsbedingte Unterschiede können eventuell auftreten, wenn Sie Texte in Dokumente, Arbeitsblätter oder Formen schreiben.
Anführungszeichen
Das Anführungszeichen wird dazu verwendet, Klartext von der Programmierung zu trennen (ansonsten würde VBA versuchen, 'Hallo du' als eine Prozedur 'Hallo' mit dem Übergabeparameter 'du' auszuführen).
Wenn Sie innerhalb einer Zeichenkette Anführungszeichen verwenden möchten, können Sie das Anführungszeichen doppeln:
Debug.Print "Und er sagte, ""Bitte verlassen Sie das Gebäude umgehend!""" ' Ergibt: Und er sagte, "Bitte verlassen Sie das Gebäude umgehend!"
Bitte beachten: Am Ende der Zeichenkette mussten hier nun drei Anführungszeichen eingesetzt werden: Zwei, um das zweite Anführungszeichen darzustellen und ein weiteres, um die Zeichenkette abzuschließen.
Weitere besondere Zeichen finden und eingeben
Asc
Die 'Asc'-Funktion liefert die Position des angegebenen Zeichens in der ASCII-Zeichentabelle zurück.
Debug.Print Asc("A") ' ergibt 65
Bitte beachten: Die ASCII-Zeichentabelle (ASCII bedeutet 'American Standard Code for Information Interchange') enthielt ursprünglich nur die 128 Zeichen, welche im englischsprachigen Raum benötigt wurden, also Satzzeichen, Groß- und Kleinbuchstaben von A-Z und die Ziffern von 0-9.
Nicht enthalten waren Accents, Umlaute oder gar kyrillische, asiatische, arabische etc. Zeichen. Inzwischen wurden die Zeichensätze erweitert und enthalten theoretisch millionen von Zeichen.
Die 'Asc'-Funktion kann trotz ihres Namens auf mehr als die 128 Zeichen zugreifen, nämlich auf den erweiterten ASCII-Zeichensatz bis 255 (siehe Zeichentabellen). Dieser enthält zusätzlich Umlaute, Accents und weitere Zeichen, die im europäischen Raum Verwendung finden und auf dem lateinischen Alphabet basieren. Siehe hierzu auch AscW und ChrW.
Chr
Die 'Chr'-Funktion ist die Umkehr-Funktion der 'Asc'-Funktion: Sie liefert das Zeichen zurück, das an einer gegebenen Position in der Zeichentabelle steht.
Debug.Print Chr(65) ' ergibt den Buchstaben 'A'
Bitte beachten: Bei der 'Chr'-Funktion gelten die gleichen Anmerkungen wie zur 'Asc'-Funktion!
AscW und ChrW
Diese beiden Funktionen entsprechen den 'Asc'- und 'Chr'-Funktionen, können jedoch auf den gesamten Unicode-Zeichensatz zugreifen, welcher 65535 (2 ^16) Zeichen enthält.
Diese Funktionen sind daher für internationale Lösungen, die über die Grenzen Europas eingesetzt werden sollen, empfehlenswert.
Bitte beachten: Der VBA-Editor ist NICHT unicode-fähig! Das bedeutet, dass die Zeichen aus der Zeichentabelle über der Position 255 hier nur lückenhaft zur Verfügung stehen.
Die Office-Anwendungen sind es aber, daher können Sie in Word-Dokumenten, Excel-Zellen und PowerPoint-Folien auf den gesamten Zeichensatz zurückgreifen.
Debug.Print Chr(1162) ' Erzeugt Fehler: Ungültiges Argument (1162 überschreitet den Maximalwert 255) Debug.Print ChrW(1162) ' Im Debug-Fenster erscheint '?', weil der VBA-Editor dieses Zeichen nicht darstellen kann ActiveCell.Value = ChrW(1162) ' In der Excel-Zelle wird das tatsächliche Zeichen dargestellt: Ҋ
Zeichentabellen
Erweiterte ASCII-Tabelle bis 255
Zeichen | Keycode | VB Variable | Beschreibung |
---|---|---|---|
1 | |||
2 | |||
3 | |||
4 | |||
5 | |||
6 | |||
7 | |||
8 | |||
9 | vbTab | Tabstopp, Tabulator | |
10 | vbLf | Entspricht in manchen Anwendungen (wie XML) dem Linefeed (weicher Umbruch) | |
11 | vbVerticalTab | Zeilenendmarke ("Weicher Umbruch") | |
12 | vbFormFeed | Seitenwechsel | |
13 | vbCr, vbNewLine | Entspricht in manchen Anwendungen (wie Word Formularfeldern) dem Zeilenvorschub | |
14 | Spaltenwechsel | ||
15 | |||
16 | |||
17 | |||
18 | |||
19 | |||
20 | |||
21 | |||
22 | |||
23 | |||
24 | |||
25 | |||
26 | |||
27 | |||
28 | |||
29 | |||
— | 30 | Geschützter Bindestrich (STRG + UMSCHALT + MINUS) | |
¬ | 31 | Bedingter Trennstrich (STRG + MINUS) | |
· | 32 | Leerzeichen | |
! | 33 | ||
" | 34 | ||
# | 35 | ||
$ | 36 | ||
% | 37 | ||
& | 38 | ||
' | 39 | ||
( | 40 | ||
) | 41 | ||
* | 42 | ||
+ | 43 | ||
, | 44 | ||
- | 45 | ||
. | 46 | ||
/ | 47 | ||
0 | 48 | ||
1 | 49 | ||
2 | 50 | ||
3 | 51 | ||
4 | 52 | ||
5 | 53 | ||
6 | 54 | ||
7 | 55 | ||
8 | 56 | ||
9 | 57 | ||
: | 58 | ||
; | 59 | ||
< | 60 | ||
= | 61 | ||
> | 62 | ||
? | 63 | ||
@ | 64 | ||
A | 65 | ||
B | 66 | ||
C | 67 | ||
D | 68 | ||
E | 69 | ||
F | 70 | ||
G | 71 | ||
H | 72 | ||
I | 73 | ||
J | 74 | ||
K | 75 | ||
L | 76 | ||
M | 77 | ||
N | 78 | ||
O | 79 | ||
P | 80 | ||
Q | 81 | ||
R | 82 | ||
S | 83 | ||
T | 84 | ||
U | 85 | ||
V | 86 | ||
W | 87 | ||
X | 88 | ||
Y | 89 | ||
Z | 90 | ||
[ | 91 | ||
\ | 92 | ||
] | 93 | ||
^ | 94 | ||
_ | 95 | ||
` | 96 | ||
a | 97 | ||
b | 98 | ||
c | 99 | ||
d | 100 | ||
e | 101 | ||
f | 102 | ||
g | 103 | ||
h | 104 | ||
i | 105 | ||
j | 106 | ||
k | 107 | ||
l | 108 | ||
m | 109 | ||
n | 110 | ||
o | 111 | ||
p | 112 | ||
q | 113 | ||
r | 114 | ||
s | 115 | ||
t | 116 | ||
u | 117 | ||
v | 118 | ||
w | 119 | ||
x | 120 | ||
y | 121 | ||
z | 122 | ||
{ | 123 | ||
| | 124 | ||
} | 125 | ||
~ | 126 | ||
 | 127 | ||
€ | 128 | ||
 | 129 | ||
‚ | 130 | ||
ƒ | 131 | ||
„ | 132 | ||
… | 133 | ||
† | 134 | ||
‡ | 135 | ||
ˆ | 136 | ||
‰ | 137 | ||
Š | 138 | ||
‹ | 139 | ||
Œ | 140 | ||
 | 141 | ||
Ž | 142 | ||
 | 143 | ||
 | 144 | ||
‘ | 145 | ||
’ | 146 | ||
“ | 147 | ||
” | 148 | ||
• | 149 | ||
– | 150 | ||
— | 151 | ||
˜ | 152 | ||
™ | 153 | ||
š | 154 | ||
› | 155 | ||
œ | 156 | ||
 | 157 | ||
ž | 158 | ||
Ÿ | 159 | ||
160 | Geschütztes Leerzeichen (Windows) (STRG + UMSCHALT + LEERTASTE) | ||
¡ | 161 | ||
¢ | 162 | ||
£ | 163 | ||
¤ | 164 | ||
¥ | 165 | ||
¦ | 166 | ||
§ | 167 | ||
¨ | 168 | ||
© | 169 | ||
ª | 170 | ||
« | 171 | ||
¬ | 172 | ||
| 173 | ||
® | 174 | ||
¯ | 175 | ||
° | 176 | ||
± | 177 | ||
² | 178 | ||
³ | 179 | ||
´ | 180 | ||
µ | 181 | ||
¶ | 182 | ||
· | 183 | ||
¸ | 184 | ||
¹ | 185 | ||
º | 186 | ||
» | 187 | ||
¼ | 188 | ||
½ | 189 | ||
¾ | 190 | ||
¿ | 191 | ||
À | 192 | ||
Á | 193 | ||
 | 194 | ||
à | 195 | ||
Ä | 196 | ||
Å | 197 | ||
Æ | 198 | ||
Ç | 199 | ||
È | 200 | ||
É | 201 | ||
Ê | 202 | ||
Ë | 203 | ||
Ì | 204 | ||
Í | 205 | ||
Î | 206 | ||
Ï | 207 | ||
Ð | 208 | ||
Ñ | 209 | ||
Ò | 210 | ||
Ó | 211 | ||
Ô | 212 | ||
Õ | 213 | ||
Ö | 214 | ||
× | 215 | ||
Ø | 216 | ||
Ù | 217 | ||
Ú | 218 | ||
Û | 219 | ||
Ü | 220 | ||
Ý | 221 | ||
Þ | 222 | ||
ß | 223 | ||
à | 224 | ||
á | 225 | ||
â | 226 | ||
ã | 227 | ||
ä | 228 | ||
å | 229 | ||
æ | 230 | ||
ç | 231 | ||
è | 232 | ||
é | 233 | ||
ê | 234 | ||
ë | 235 | ||
ì | 236 | ||
í | 237 | ||
î | 238 | ||
ï | 239 | ||
ð | 240 | ||
ñ | 241 | ||
ò | 242 | ||
ó | 243 | ||
ô | 244 | ||
õ | 245 | ||
ö | 246 | ||
÷ | 247 | ||
ø | 248 | ||
ù | 249 | ||
ú | 250 | ||
û | 251 | ||
ü | 252 | ||
ý | 253 | ||
þ | 254 | ||
ÿ | 255 |
Weitere Zeichentabellen
Weitere ausführliche Zeichentabellen finden Sie hier: Zeichentabelle
Zeichenketten umwandeln
UCase() LCase() Debug.Print StrConv("alle anfangsbuchstaben werden groß", vbProperCase) ' Alle Anfangsbuchstaben Werden Groß Debug.Print StrReverse("umgekehrt") ' trhekegmu
Private Sub StringManipulation() Dim strTest As String, strAnswer As String strTest = "Hallo liebe Schulungsteilnehmer und Herr Heß" strTest = UCase(strTest) Debug.Print strTest strTest = LCase(strTest) Debug.Print strTest ' Beispiel If-Abfrage: strAnswer = "Yes" If LCase(strAnswer) = "yes" Then MsgBox "Ja" End If End Sub
Zeichenketten aufteilen und kürzen
Left() Right() Mid() Trim() LTrim() RTrim()
Private Sub StringCutters() Dim strTest As String, strString As String strString = "Hallo liebe Schulungsteilnehmer und Herr Heß" ' Hier werden Zeichenfolgen geschnitten: strTest = Left(strString, 2) Debug.Print strTest ' Ha strTest = Right(strString, 2) Debug.Print strTest ' eß strTest = Mid(strString, 7, 25) Debug.Print strTest ' liebe Schulungsteilnehmer ' Die Trim-Funktionen entfernen Leerzeichen (auch mehrere) vom Anfange und/oder Ende des Textes strString = " Trim Me " Debug.Print "'" & strString & "'" ' Trim Me ' strTest = LTrim(strString) Debug.Print "'" & strTest & "'" 'Trim Me ' strTest = RTrim(strString) Debug.Print "'" & strTest & "'" ' Trim Me' strTest = Trim(strString) Debug.Print "'" & strTest & "'" 'Trim Me' End Sub
In Zeichenketten ersetzen
Die Funktion für das Ersetzen von Teilen einer Zeichenkette heißt 'Replace'.
Private Sub StringReplace() Dim strString As String ' Suchen und Ersetzen von Zeichenfolgen strString = "Ich werde gesucht und ersetzt" Debug.Print strString Debug.Print Replace(strString, "gesucht", "gefunden") ' Groß- / Kleinschreibung wird beachtet! Debug.Print Replace(strString, "Gesucht", "gefunden") ' vbTextCompare: Groß- / Kleinschreibung wird ignoriert! Debug.Print Replace(strString, "Gesucht", "gefunden", , , vbTextCompare) End Sub
Das reine 'Replace' führt die Ersetzung jedoch nur in einem Durchlauf durch, daher können mehrfach hintereinander auftretende Treffer eventuell nicht alle ersetzt werden (zur besseren Darstellung werden '+'-Zeichen statt Leerzeichen verwendet):
Debug.Print Replace("++Text+++++mit+++überschüssigen+Leerzeichen+...+", "++", "+")
Das Ergebnis (enthält immer noch doppelte Leerzeichen):
+Text+++mit++überschüssigen+Leerzeichen+...+
Mit einer selbst geschriebenen Funktion 'ReplaceRecursively' kann dem abhilfe geschaffen werden:
- Der ursprüngliche Text wird in einer Variablen gespeichert.
- Das Ersetzen mit 'Replace' wird durchgeführt (mit Rücksicht auf die optionale Angabe zur Groß- und Kleinschreibung).
- Wenn durch das Ersetzen eine Änderung am Text erfolgt ist, wird die Funktion nochmals aufgerufen (siehe Rekursionen).
- Hierbei wird das Ergebnis des Ersetzens als neuer Ausgangstext verwendet.
Public Function ReplaceRecursively(ByVal strInText As String, ByVal strFind As String, ByVal strReplace As String, Optional ByVal blnMatchCase As Boolean) As String Dim strTemp As String strTemp = strInText If blnMatchCase = True Then ReplaceRecursively = Replace(strInText, strFind, strReplace) Else ReplaceRecursively = Replace(strInText, strFind, strReplace, , , vbTextCompare) End If If strTemp <> ReplaceRecursively Then ReplaceRecursively = ReplaceRecursively(ReplaceRecursively, strFind, strReplace, blnMatchCase) ' rekursiver Aufruf der eigenen Funktion wirkt wie eine Schleife End If End Function
Debug.Print ReplaceRecursively("++Text+++++mit+++überschüssigen+Leerzeichen+...+", "++", "+")
Ergebnis nun:
+Text+mit+überschüssigen+Leerzeichen+...+
Position innerhalb einer Zeichenkette, Länge ermitteln
InStr() InStrRev() Len()
Private Sub StringMath() Dim strTest As String, strString As String Dim lngPosition As Long, lngLength As Long strString = "Hallo liebe Schulungsteilnehmer und Herr Heß" ' Ermittlung der Länge einer Zeichenkette: lngLength = Len(strString) Debug.Print "Die Zeichenkette enthält " & lngLength & " Zeichen" ' Ermittlung von Zeichenpositionen: lngPosition = InStr(strString, " ") Debug.Print "Erstes Leerzeichen an Position: " & lngPosition ' bei der Suche nach dem nächsten Leerzeichen die letzte Position + 1 als Anfangsposition verwenden! lngPosition = InStr(lngPosition + 1, strString, " ") Debug.Print "Zweites Leerzeichen an Position: " & lngPosition lngPosition = InStr(strString, "y") Debug.Print "'y' an Position: " & lngPosition lngPosition = InStr(strString, "Schul") Debug.Print "'Schul' beginnt an Position: " & lngPosition ' InStr und InStrRev achten auf Groß- / Kleinschreibung! lngPosition = InStr(strString, "schul") Debug.Print "'schul' (klein geschrieben!) an Position: " & lngPosition ' Wenn die Groß- / Kleinschreibung nicht berücksichtigt werden soll, ' kann der Parameter 'Compare' auf 'vbTextCompare' geändert werden. ' Dann muss allerdings auch der Anfangspunkt angegeben werden: lngPosition = InStr(1, strString, "SCHul", vbTextCompare) Debug.Print "'SCHul' (Groß-/Kleinschreibung nicht beachten!) an Position: " & lngPosition ' InStrRev findet die letzte Position einer Zeichenkette innerhalb der vorgegebenen Zeichenkette ' Die Position wird weiterhin von links gesehen angegeben lngPosition = InStrRev(strString, " ") Debug.Print "Letztes Leerzeichen an Position: " & lngPosition ' bei der Suche nach dem vorhergehenden Leerzeichen die letzte Position - 1 als Anfangsposition verwenden! lngPosition = InStrRev(strString, " ", 41 - 1) Debug.Print "Vorletztes Leerzeichen an Position: " & lngPosition End Sub
Zeichenkette erzeugen
Mithilfe der String-Funktion können Sie eine Zeichenkette erzeugen, die eine angegebene Anzahl von Wiederholungen des gleichen Buchstaben enthält:
Debug.Print String(3, "A") ' Ergibt 'AAA'
In einem 'Like'-Vergleich können wir dies wie folgt einsetzen:
Public Function IsNumber(ByVal strNumber As String) As Boolean IsNumber = True If strNumber Like String(Len(strNumber), "#") Then Exit Function End If IsNumber = False End Function
Die Anweisung 'String(Len(strNumber), "#")' erzeugt einen Vergleichs-Text, der aus so vielen '#' besteht, wie Zeichen im übergebenen String sind. Hiermit wird also festgestellt, ob strNumber ausschließlich aus Ziffern besteht, also eine Ganzzahl ist.
Beispiele
Public Function LastWord(ByVal strText As String) As String Dim strWord As String Dim lngPosition As Long lngPosition = InStrRev(strText, " ") strWord = Right(strText, Len(strText) - lngPosition) LastWord = strWord End Function
Private Function LastWordMid(ByVal strText As String) As String Dim strWord As String Dim lngPosition As Long lngPosition = InStrRev(strText, " ") strWord = Mid(strText, lngPosition + 1) LastWordMid = strWord End Function
Public Function FirstWord(ByVal strText As String) As String Dim strWord As String Dim lngPosition As Long lngPosition = InStr(strText, " ") If lngPosition < = 0 Then strWord = strText Else strWord = Left(strText, lngPosition - 1) End If FirstWord = strWord End Function
Public Function AnyWord(ByVal strText As String, ByVal lngIndex As Long) As String Dim strWord As String Dim lngPos1 As Long, lngPos2 As Long, lngWord As Long Dim blnLastItem As Boolean lngPos1 = 1 For lngWord = 1 To lngIndex If blnLastItem = True Then strWord = "" Exit For End If lngPos2 = InStr(lngPos1, strText, " ") If lngPos2 < = 0 Then If lngPos1 < = 1 Then strWord = strText blnLastItem = True Else strWord = Mid(strText, lngPos1) blnLastItem = True End If Else strWord = Mid(strText, lngPos1, lngPos2 - lngPos1) End If lngPos1 = lngPos2 + 1 Next lngWord AnyWord = strWord End Function
Public Function ListItem(ByVal strList As String, ByVal lngItem As Long, Optional ByVal strSeparator As String = ",") As String Dim strWord As String Dim lngPos1 As Long, lngPos2 As Long, lngWord As Long, lngOffset As Long Dim blnLastItem As Boolean lngPos1 = 1 For lngWord = 1 To lngItem If blnLastItem = True Then strWord = "" Exit For End If If lngWord > 1 Then lngOffset = Len(strSeparator) - 1 End If lngPos2 = InStr(lngPos1, strList, strSeparator) If lngPos2 < = 0 Then If lngPos1 < = 1 Then strWord = strList blnLastItem = True Else strWord = Mid(strList, lngPos1 + lngOffset) blnLastItem = True End If Else strWord = Mid(strList, lngPos1 + lngOffset, lngPos2 - lngPos1 - lngOffset) End If lngPos1 = lngPos2 + 1 Next lngWord ListItem = strWord End Function