TL;DR —
Strwandelt eine Zahl in Text um, ist aber eine alte BASIC-Funktion, die zwei Fallen verbirgt. Erstens gibtStr(42)den Wert" 42"mit einem führenden Leerzeichen zurück (es reserviert eine Spalte für das Vorzeichen). Zweitens istStrlocale-blind — es nutzt immer einen.als Dezimaltrennzeichen, selbst auf einer deutschen Maschine, die ein Komma erwartet. Das machtStrgroßartig zum Schreiben locale-unabhängiger Dateien und falsch für alles, was ein Benutzer sieht. Die Standardwahl für „Zahl in Text" istCStr(kein Leerzeichen, respektiert das Locale) oderFormat(volle Kontrolle). Greifen Sie nur zuStr, wenn Sie bewusst ein festes.-Trennzeichen wollen — und selbst dann sollte das in den meisten Codes nicht der Fall sein.
Dies ist das Gegenstück zu VBA CStr, CDate & Val, das die
Umwandlung von Text in Zahlen und Daten behandelt. Dieser Artikel behandelt die
andere Richtung: die Umwandlung einer Zahl in Text — und speziell, warum die
naheliegend wirkende Str-Funktion diejenige ist, die Sie meist meiden sollten.
Was Sie lernen
- Die Leerzeichen-Falle: warum
Str(42)gleich" 42"ist und was das kaputtmacht - Warum
StrIhre Regionseinstellungen ignoriert — und wann das tatsächlich nützlich ist Strvs.CStrvs.Format— welche Sie wann verwenden sollten- Das
Str/Val-Paar gegenüber demCStr/CDbl-Paar
Das mentale Modell: Str ist ein Relikt mit zwei Minen
Stellen Sie sich Str als Werkzeug aus einer älteren BASIC-Ära vor, gebaut, als
Zahlen noch in Spalten fester Breite gedruckt wurden. Es verhält sich immer noch
so: Es lässt Platz für ein Minuszeichen, und es kümmert sich nicht darum, in
welchem Land Sie sind. Beide Verhaltensweisen ergaben 1985 Sinn und überraschen
die Leute 2026.
Sub TheTwoLandmines()
Debug.Print "[" & Str(42) & "]" ' -> "[ 42]" führendes Leerzeichen!
Debug.Print "[" & Str(-42) & "]" ' -> "[-42]" Vorzeichen füllt den Platz
Debug.Print Str(3.14) ' -> "3.14" immer ein Punkt, egal welches Locale
End Sub
Mine 1: das führende Leerzeichen
Str reserviert immer das erste Zeichen für das Vorzeichen. Positive Zahlen
bekommen dort ein Leerzeichen; negative bekommen das -. Str(42) besteht
also aus drei Zeichen: Leerzeichen, 4, 2. Das macht stillschweigend drei Dinge
kaputt:
Sub LeadingSpaceBreaksThings()
' 1) Die Verkettung bekommt ein zusätzliches Leerzeichen
Debug.Print "Total: " & Str(42) ' -> "Total: 42" (zwei Leerzeichen)
' 2) Vergleiche schlagen fehl
Debug.Print (Str(42) = "42") ' -> False (" 42" <> "42")
' 3) In eine Zelle geschrieben ist es Text-mit-Leerzeichen:
' sieht wie eine Zahl aus, aber ISNUMBER ist False und das Sortieren bricht
Range("A1").Value = Str(42)
End Sub
Die Leute „reparieren" das mit Trim(Str(n)), was funktioniert, aber ein Code
Smell ist — Sie überdecken die falsche Funktion. Die echte Lösung ist, eine
Funktion zu nehmen, die das Leerzeichen von vornherein nie hinzufügt.
Mine 2: Str ist locale-blind
Str gibt immer einen . als Dezimaltrennzeichen aus, unabhängig von den
Windows-Regionseinstellungen. Auf einer für Deutsch konfigurierten Maschine (die
, für Dezimalstellen nutzt) ist Str(3.14) immer noch "3.14".
Das ist die eine Stelle, an der Str seinen Nutzen unter Beweis stellt. Wenn Sie
eine CSV, ein SQL-Statement, JSON oder irgendein maschinenlesbares Format
schreiben, wollen Sie ein festes .-Trennzeichen, damit die Datei überall
gleich geparst wird. Str liefert Ihnen das kostenlos — während CStr auf einer
deutschen Kiste 3,14 ausgeben und Ihre Datei beschädigen würde.
Aber für alles, was ein Mensch liest, ist die Locale-Blindheit ein Bug: Ein
deutscher Benutzer erwartet 3,14, und Str zeigt ihm 3.14.
Die Lösung: standardmäßig CStr, Format für Kontrolle
Sub TheRightTools()
' CStr — kein führendes Leerzeichen, respektiert das Locale des Benutzers. Die Standardwahl.
Debug.Print "[" & CStr(42) & "]" ' -> "[42]"
Debug.Print CStr(3.14) ' -> "3,14" auf einer deutschen Maschine
' Format — volle Kontrolle über Ziffern, Auffüllung, Tausendertrennzeichen
Debug.Print Format(42, "0") ' -> "42"
Debug.Print Format(1234.5, "#,##0.00") ' -> "1,234.50" (oder Locale-Entsprechung)
Debug.Print Format(7, "000") ' -> "007"
End Sub
Hier ist die Entscheidung in einer Tabelle, die Sie im Kopf behalten können:
CStr— Zahl → Text für den allgemeinen Gebrauch. Kein Leerzeichen, locale-bewusst. Ihre Standardwahl.Format— wenn Sie Auffüllung, feste Dezimalstellen oder Tausendertrennzeichen brauchen.Str— nur, wenn Sie gezielt ein locale-unabhängiges.für eine Datei oder ein Protokoll brauchen und das führende Leerzeichen akzeptieren (oder es mitTrimentfernen).
Die Abwägung, klar gesagt: 2026 ist ein nacktes Str() in neuem Code fast immer
entweder ein Bug oder ein unkommentierter Sonderfall fürs Dateischreiben. Wenn
Sie „gib mir diese Zahl als Text" meinen, schreiben Sie CStr. Wenn Sie
„formatiere diese Zahl" meinen, schreiben Sie Format. Heben Sie Str für den
engen Fall der locale-unabhängigen Ausgabe auf und setzen Sie einen Kommentar
daneben, der erklärt, warum.
Das Str/Val-Paar gegenüber dem CStr/CDbl-Paar
Diese Funktionen kommen in zusammengehörigen Paaren, locale-bewusst oder nicht — sie zu mischen ist der Weg, auf dem Hin-und-Rück-Umwandlungen stillschweigend beschädigt werden:
Str↔Val— beide locale-blind (immer.).Val("3.14")ist auf jeder Maschine 3.14;Valhört zudem beim ersten nicht-numerischen Zeichen auf. Nutzen Sie dieses Paar für Datei-I/O mit festem Format.CStr↔CDbl— beide locale-bewusst.CDblrespektiert das regionale Komma;CStrgibt es aus. Nutzen Sie dieses Paar für das Hin und Her von Werten, die der Benutzer sieht.
Der Fehler, den es zu vermeiden gilt, ist das Kreuzen der Paare: mit Str (Punkt)
schreiben und mit CDbl auf einer Komma-Locale-Maschine zurücklesen — und die
Zahl ändert sich. Halten Sie jede Hin-und-Rück-Umwandlung innerhalb eines Paares.
Wie ExcelMaster hilft
VBA für die Umwandlung von Zahl zu Text existiert meist, um einen Export oder ein
Etikett zu bauen — ein Preisschild, ein CSV-Feld, eine mit Nullen aufgefüllte
Rechnungsnummer. ExcelMaster erzeugt das aus einer Beschreibung —
„Exportiere diese Beträge als Text mit zwei Dezimalstellen und einer ID mit
führender Null" — und bekommt das Locale und die Auffüllung richtig hin, ohne dass
Sie zwischen Str, CStr und Format wählen und das führende Leerzeichen auf
die harte Tour entdecken müssen.
Sie werden weiterhin Umwandlungen direkt in Makros schreiben. Aber für „erzeuge diesen formatierten Export"-Aufgaben schlägt das Beschreiben des Formats das händische Auswählen der Umwandlungsfunktion.
Häufig gestellte Fragen
Was ist der Unterschied zwischen Str und CStr in VBA?
Str fügt vor positiven Zahlen ein führendes Leerzeichen hinzu und nutzt immer
einen . als Dezimaltrennzeichen, unabhängig vom Locale. CStr fügt kein
Leerzeichen hinzu und respektiert die Regionseinstellungen des Benutzers. Für die
allgemeine Umwandlung „Zahl in Text" nehmen Sie CStr; nutzen Sie Str nur, wenn
Sie ein locale-unabhängiges . für eine Datei oder ein Protokoll brauchen.
Warum setzt VBA Str ein Leerzeichen vor die Zahl?
Str reserviert das erste Zeichen für das Vorzeichen — ein Leerzeichen für
positive Zahlen, ein - für negative. Es ist ein Überbleibsel aus dem numerischen
Drucken in fester Breite. Um es zu entfernen, nutzen Sie entweder CStr (das das
Leerzeichen nie hinzufügt) oder umschließen es als Trim(Str(n)), wobei CStr
die sauberere Lösung ist.
Respektiert VBA Str das regionale Dezimaltrennzeichen?
Nein. Str gibt immer einen . aus, selbst auf Maschinen, die für ein
Komma-Dezimaltrennzeichen konfiguriert sind (Deutsch, Französisch usw.). Das ist
nützlich, um CSV/SQL zu schreiben, das überall gleich geparst werden muss, aber
falsch für Werte, die Benutzern angezeigt werden — nutzen Sie dafür CStr oder
Format.
Wie wandle ich in VBA eine Zahl in einen String um?
Nutzen Sie CStr(number) als Standardwahl — kein führendes Leerzeichen und
locale-bewusst. Nutzen Sie Format(number, "0.00"), wenn Sie bestimmte
Dezimalstellen, Auffüllung oder Tausendertrennzeichen brauchen. Heben Sie
Str(number) ausschließlich für locale-unabhängige Dateiausgaben auf.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 14.06.2026.
Verwandte Anleitungen: VBA CStr · VBA Format · VBA Concatenate · VBA UCase & LCase · VBA Trim
