Zeichenketten: Unterschied zwischen den Versionen

Aus VBA-wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: „== Zeichenketten aneinanderknüpfen == Zeichenketten werden in VBA mit dem '&'-Operator aneinandergeknüpft: Dim strText As String strText = "Hallo " & "liebe…“)
 
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 ===


Der Zeilenumbruch erfolgt mit der VBA-Konstante 'vbCrLf' (Carriage return = Schlitten einer Schreibmaschine in Ausgangsstellung bringen, Line feed = Zeilenvorschub). Dim strText As String strText = "Erste Zeile ..." & vbCrLf & "Zweite Zeile!" MsgBox strText
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(400) ' Erzeugt Fehler: Ungültiges Argument (400 überschreitet den Maximalwert 255) Debug.Print ChrW(400) ' Im Debug-Fenster erscheint '?', weil der VBA-Editor dieses Zeichen nicht darstellen kann ActiveCell.Value = ChrW(400) ' In der Excel-Zelle wird das tatsächliche Zeichen dargestellt: &#400;
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: &#1162;</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ß" ' Darstellung der Buchstaben oder Zeichen wird geändert, nicht der Inhalt 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
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) ' Ha Debug.Print strTest 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
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): '+Text+++mit++überschüssigen+Leerzeichen+...+' Mit der Funktion 'ReplaceRecursively' kann dem abhilfe geschaffen werden:
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: '+Text+mit+überschüssigen+Leerzeichen+...+'
* 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 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
<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; 127
&#128; 128
&#129; 129
&#130; 130
&#131; 131
&#132; 132
&#133; 133
&#134; 134
&#135; 135
&#136; 136
&#137; 137
&#138; 138
&#139; 139
&#140; 140
&#141; 141
&#142; 142
&#143; 143
&#144; 144
&#145; 145
&#146; 146
&#147; 147
&#148; 148
&#149; 149
&#150; 150
&#151; 151
&#152; 152
&#153; 153
&#154; 154
&#155; 155
&#156; 156
&#157; 157
&#158; 158
&#159; 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