VBA - String

Programmierung von Text & Zeichen

'String' bedeutet 'Zeichenkette'. Auf dieser Seite wird demonstriert, wie man mit Visual Basic Zeichen und Texte programmiert. Besondee Beachtung findet die Anwendung als 'Benutzer-definierte' Hilfs-Funktionen, z.B. für Kalkulations-Programme.
Visual Basic for Applications VBA Visual Basic for Applications
String Typ, Länge, Verkettung, Umwandlung, Array
Zeichen ASCII- und Unicode-Zeichen, Codenummer
Suchen Suchen und Ersetzen von Strings und Zeichen
Teile Teil-Strings von links, aus der Mitte, von rechts
Groß & Klein Umwandlung von Groß- und Kleinbuchstaben
Wiederholung Strings fixer Länge durch Auffüllen mit wiederholten Zeichen
Split() & Join() Aufspaltung von Text in Array-Elemente
Ziffern-Strings Rechnen mit beliebiger Genauigkeit und beliebig großen Zahlen
Verwandte Themen Zeichensätze, Unicode, Zeichen und Strings in verscheidenen IT-Bereichen und Programmiersprachen

Der Daten-Typ String

Typ

Für Zeichen und Zeichen-Ketten (Strings) bietet VBA den Typ String
In der vereinfachten Version kann man die Deklaration weglassen, das ist jedoch nicht empfehlenswert !
Verwenden sie am Anfang jedes VBA-Moduls die Anweisung Option Explicit, mit welcher die saubere Deklaration aller Variablen erzwungen wird.
Deklaration der Variablen s und t als String:
Option Explicit
Dim s, t As String

Länge

Die Angabe der Länge erfolgt in Zeichen, nicht in Byte. Auch ↓ Unicode-Zeichen werden als 1 Zeichen gezählt.
Länge eines Strings:
s = "ab" & ChrW(&H20AC);
' ergibt s=ab€
k = Len(s)
' ergibt k=3

Verkettung

Strings und Zeichen werden durch den Operator & miteinander verkettet (aneinander gehängt). Der gleiche Operator wird auch in Kalkulations-Programmen (LibreOffice, OpenOffice, MS-Excel) verwendet, in VBA muss jedoch vor und nach dem Operator je 1 Leerzeichen stehen.
Verkettung von 2 Strings und 1 Zeichen:
s = "Visual"
t = " Basi"
z = s & t & Chr(99)
' ergibt z="Visual Basic"

Umwandlung

Die Umwandlung beliebiger Variablen-Typen in Strings erfolgt automatisch, wenn man sie an eine String-Variable zuweist, oder wenn man sie mit dem Operator & verkettet (abgeschaltete Zeile).
Besser ist es jedoch, Daten oder Variable mit der Funktion CStr ausdrücklich in Strings umzuwandeln: Das ist verlässlich, sicher und im Programm besser erkennbar.
Umwandlung Zahl → String
i = 12
's = "Seite " & i
s = "Seite " & CStr(i)
'ergibt s="Seite 12"

Array

Wie mit jedem anderen Variablen-Typ kann man auch ein Array von Strings deklarieren und verwenden.

Details zu VBA-Arrays
Verwendung von String-Arrays
Dim s, dow(7) As String
dow(1) = "Mo"
dow(2) = "Di"
s = dow(2)
' ergibt s="Di"

Vergleich

VBA arbeitet korrekt und berücksichtigt den Unterschied zwischen Groß- und Kleinbuchstaben.

Kalkulations-Programme arbeiten unterschiedlich:
=WENN("A"="a";"gleich";"ungleich")
LibreOffice und OpenOffice arbeiten korrekt, MS-Excel ignoriert den Unterschied.
Die VBA-Funktion rechts kann auch in MS-Excel zwischen Groß- und Klein-Buchstaben unterscheiden:
=WENN(pst_strings_equal("A";"a");"gleich";"ungleich")

Das gilt auch für ↓ Unicode-Zeichen: Bei Umlauten, griechischen Buchstaben, usw. ignoriert Excel den Unterschied zwischen großen und kleinen Zeichen, OpenOffice und VBA arbeiten korrekt.
Function pst_strings_equal( _
Optional text1 As String = "", _
Optional text2 As String = "") _
As Boolean
Dim iseq As Boolean
iseq = False
If text1 = text2 Then iseq = True
pst_strings_equal = iseq
End Function

ASCII- und Unicode-Zeichen

Zeichen wie z.B. das 'A' werden intern als Bitmuster (bestehend aus 8 oder mehr Bits) gespeichert.
Nur aus dem Zusammenhang (!) ergibt sich, ob ein derartiges Muster als Zahl, Zeichen, Farbe, Ton, ... interpretiert werden soll.
Die wichtigsten (→ ASCII)-Zeichen werden genauso gespeichert wie die ganzen DezimalZahlen 0..255
Ein → Zeichencode ist ein Standard, in dem festgelegt wird, mit welchen ganzen Zahlen (CodeNummern) die einzelnen Zeichen gespeichert werden.

Details zum Thema Zeichen-Codes

Umwandlung CodeNummer → Zeichen

VBA bietet die Funktion Chr zur Umwandlung von CodeNummern (0..255) in Zeichen. Diese Funktion entspricht der Funktion =ZEICHEN von Kalkulations-Programmen.
Die Anwendung ist jedoch nur für die → ASCII-CodeNummern (0..127) sicher. Verwenden sie für alle anderen Zeichen nur die ↓ Unicode-Funktion ChrW

Umwandlung der CodeNummer 65 in das ASCII-Zeichen 'A'
s = Chr(65)
' ergibt s="A"

Umwandlung UniCodeNummer → Zeichen

VBA bietet schon seit langer Zeit die Funktion ChrW für die wichtigsten → Unicode-Zeichen (CodeNummern 0..65535). In den gleichen Excel-Versionen fehlt allerdings meist die entsprechende Kalkulations-Funktion UNIZEICHEN
Die Funktion des gezeigten Beispiels ersetzt diese Funktion, d.h. man kann sie in MS-Excel als 'Benutzerdefinierte Funktion' verwenden.
In OpenOffice ist das nicht notwendig, da dort die Standard-Funktion UNIZEICHEN geboten wird.
Beispiel: Diese Funktion gibt ein (ASCII- oder) Unicode-Zeichen zurück.
Function pst_unicode_chr(unicodenr As Long) As String
If (unicodenr < 0) Then unicodenr = 0
pst_unicode_chr = ChrW(unicodenr)
End Function
Anwendung in MS-Excel:
=pst_unicode_chr(8721)
ergibt das Summen-Zeichen Σ (Sigma)

Umwandlung Zeichen → CodeNummer

VBA bietet die Funktion Asc zur Umwandlung eines Zeichens in die entsprechende CodeNummer (0..255).

Das ist nur für den → ASCII-Code (CodeNummern 0..127) zuverlässig und eindeutig, ansonsten vom jeweils verwendeten nationalen Zeichencode abhängig !
Verwenden sie für alle anderen Zeichen nur die ↓ Unicode-Funktion AscW
Umwandlung der CodeNummer 65 in das ASCII-Zeichen 'A'
i = Asc("A")
' ergibt i=65

Umwandlung Unicode-Zeichen → CodeNummer

VBA bietet die Funktion AscW zur Umwandlung von → Unicode-Zeichen in die entsprechenden CodeNummern 0..65535
Die von AscW zurückgegebenen Zahlen werden für CodeNummern >32767 als negative Zahlen interpretiert; dieses unerwünschte Verhalten wird durch die Funktion korrigiert.
Die Funktion des Beispiels ersetzt die Standard-Funktion UNICODE in allen Excel-Versionen, welche diese nicht anbieten.
In OpenOffice ist das nicht notwendig, da dort die Standard-Funktion UNICODE geboten wird.
Beispiel: Diese Funktion gibt die (ASCII- oder) Unicode-CodeNummer zurück.
Function pst_unicode_asc(zeichen As String) As Long
Dim uc As Long
uc = AscW(zeichen)
If uc < 0 Then uc = uc& + &H10000
pst_unicode_asc = uc&
End Function
Anwendung in MS-Excel:
=pst_unicode_asc("Σ")
ergibt die DezimalZahl 8721

Non-Standard

Bei allen Produkten des IT-Marktführers muss man besonders auf den → Code-Bereich U+80..U+9F (dezimal 128..159) achten. Dieser Bereich enthält in allen Standard Zeichensätzen nicht druckbare Steuerzeichen, in jenen von Microsoft jedoch einige bunt zusammengewürfelte Zeichen aus unterschiedlichen Bereichen.

Die meisten dieser Zeichen haben kaum Bedeutung, das €-Zeichen kommt jedoch oft vor: Es wird von M$-Programmen meist mit CodeNummer=0x80 (dezimal 128) codiert und nicht mit der Standard CodeNummer=0x20AC (dezimal 8364)

Das führt in vielen Fällen zu Problemen. Man kann das vermeiden, wenn man das Zeichen sauber codiert (ideal, aber mit M$-Programmen nicht durchführbar) oder zumindest nachträglich korrigiert - zum Beispiel mit der rechts gezeigten Funktion.

Function euro_corr(text As String) As String
euro_corr = Replace(text, Chr(&H80), ChrW(&H20AC))
End Function

M$-Programme haben übrigens kein Problem, richtig codierte Texte anzuzeigen, z.B. solche, die mit der gezeigten Funktion korrigiert wurden. Sauber codierte Texte funktionieren eben überall, nicht nur in M$-Umgebung.

Suchen und Ersetzen

Suche

Funktion InStr() sucht nach der ersten gefundenen Position eines Musters und gibt diese als ganze Zahl zurück. Die Zeichen-Position wird ab 1 gezählt.
Argumente: Start-Position (optional, hier nicht verwendet), durchsuchter Text (Haystack), gesuchtes Muster (Needle).
Bei leerem String oder erfolgloser Suche ist das Ergebnis 0

s = "ABCabc"
p = InStr(s, "a")
' ergibt p=4

Ersetzen

VBA kennt leider keine → Regulären Ausdrücke, daher braucht man viele andere Funktionen, z.B.
Replace(Text, gesuchtes_Muster, Ersatz_Text)
Das Beispiel ersetzt in einem Text das nur im deutschen Sprachraum übliche Dezimal-Komma durch den intenational verwendeten Dezimal-Punkt.

s = "123,456"
t = Replace(s, ",", ".")
' ergibt s="123.456"

Teile (Links, Mitte, Rechts)

Teile

Die Funktionen Left(Text,Länge), Mid(Text, Start, Länge) und Right(Text,Länge) geben Teil-Strings zurück, so wie rechts gezeigt.

Achtung: In der modernen Informatik (und in allen ernstzunehmenden Programmiersprachen) beginnt man die Zählung immer mit 0 (Null) - das betrifft auch die Angabe der Zeichen-Position !
In VisualBasic wird die Position von Zeichen in Strings (Text-Variablen) beginnend mit 1 gezählt !

s = "Das ist ein Test"
t = Left(s,3)
' ergibt t="Das"
u = Mid(s,5,3)
' ergibt u="ist"
v = Right(s,4)
' ergibt v="Test"

Groß- und Klein-Buchstaben

Großbuchstaben

Funktion UCase wandelt einen Text in große Buchstaben um.
s = "abcXYZ"
g = UCase(s)
' ergibt g="ABCXYZ"

Kleinbuchstaben

Funktion LCase wandelt einen Text in kleine Buchstaben um.
s = "abcXYZ"
k = LCase(s)
' ergibt k="abcxyz"
Beide Funktionen arbeiten ebenso wie die Funktionen =GROSS, =KLEIN von Kalkulations-Programmen nicht nur im → ASCII-Bereich (CodeNummern 32..127), sondern auch mit → Unicode-Zeichen (128..65535).
Umlaute, griechische Buchstaben, etc. werden so umgewandelt wie erwartet.
Umwandlung von griechischen Buchstaben:
s = ChrW(948)
' ergibt s=δ
t = UCase(s)
' ergibt s=Δ

Zeichen-Wiederholung

Zeichen-Wiederholung

Mit der VBA-Funktion String kann man Text-Strings aus einem beliebig oft wiederholten Zeichen herstellen. Das kann man dazu verwenden, um Texte mit konstanter vorgegebener Länge zu erzeugen.

Das Verhalten der VBA-Funktion ist anders als jenes der Kalkulations-Funktion =WIEDERHOLEN()
Die VBA-Funktion verwendet nur das erste Zeichen des 2. Arguments, auch dann, wenn dieses ein längerer String ist.
Strings aus wiederholten Zeichen
s = String(6,"0")
' ergibt s="000000"
n = 1234
s = Right(s & CStr(n),6)
' ergibt s="001234"

Text fixer Länge (Links)

Diese VBA-Funktion ergänzt einen Text mit vorangestellten Füllzeichen (PadCharacters) auf die gewünschte Länge. Man kann sie z.B. verwenden, um Ziffern-Strings fixer Länge zu erzeugen. In diesem Fall ergänzt man den Text mit Nullen.
Anwendung in einem Kalkulations-Programm:
=pst_string_pad_left("123";"0";5)
ergibt den String "00123"

Sonderfall: Wenn der angegebene Text auch ohne Füllzeichen bereits die gewünschte Länge überschreitet, dann sind mehrere Vaianten möglich. Die Funktion behandelt diesen Fall in der grün markierten Zeile:
(b) In der gezeigten Version wird der Text links auf die gewünschte Länge abgeschnitten.
(a) Wenn sie diese Zeile löschen, dann bleibt der eingegebene Text unverändert.
(c) Wenn sie die Anweisung Left durch Right ersetzen, dann wird der Text rechts abgeschnitten.

Das Ergebnis der vorgestellten Funktion ist ein String, mit dem man nicht rechnen kann - auch dann nicht, wenn er aus Ziffern besteht ! Wenn das gewünscht ist, muss man den String zuerst in eine Zahl umwandeln:

Umkehrung: Die Funktion WERT von Kalkulations-Programmen wandelt einen Ziffern-String (mit oder ohne führende Nullen) in eine Zahl um:
=WERT("00123")
Fixe Länge für (Ziffern)-Strings:
Function pst_string_pad_left( _
text As String, _
padchr As String, _
length As Integer) _
As String
Dim i As Integer
Dim s As String
s = text
i = length - Len(text)
If i > 0 And Len(padchr) > 0 Then
s = String(i, padchr) & s
ElseIf i < 0 Then
If length > 0 Then
s = Right(text, length)
Else
s = ""
End If
End If
pst_string_pad_left = s
End Function

Text fixer Länge (Rechts)

Diese VBA-Funktion ergänzt einen Text mit nachgestellten Füllzeichen (PadCharacters) auf die gewünschte Länge. In diesem Fall verwendet man meistens Leerzeichen (Space, Blank).
Anwendung in einem Kalkulations-Programm:
=pst_string_pad_right("abc";"*";5)
ergibt den String "abc**"

Sonderfall: Wenn der angegebene Text auch ohne Füllzeichen bereits die gewünschte Länge überschreitet, dann wird der Text links auf die gewünschte Länge abgeschnitten.

Umkehrung: Die Funktion GLÄTTEN von Kalkulations-Programmen entfent führende und folgende Tabulatoren oder Leerzeichen:
=GLÄTTEN(" a b c ")
Fixe Länge für (Text)-Strings:
Function pst_string_pad_right( _
text As String, _
padchr As String, _
length As Integer) _
As String
Dim i As Integer
Dim s As String
s = text
i = length - Len(text)
If i > 0 And Len(padchr) > 0 Then
s = s & String(i, padchr)
ElseIf i < 0 Then
If length > 0 Then
s = Left(text, length)
Else
s = ""
End If
End If
pst_string_pad_right = s
End Function