🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Environ in Excel — Windows-Pfade lesen, ohne einen Benutzerordner fest zu verdrahten

|

VBA Environ in Excel — Windows-Pfade lesen, ohne einen Benutzerordner fest zu verdrahten

TL;DREnviron("USERPROFILE"), Environ("TEMP"), Environ("USERNAME") lesen die Variablen, die Windows jedem Programm gibt, sodass Sie nie C:\Users\John\... fest verdrahten — ein Pfad, der auf jedem anderen Rechner bricht. Der Haken ist lautlos: Ein fehlender oder falsch geschriebener Name liefert eine leere Zeichenkette, keinen Fehler, also wird Environ("TMEP") & "\out.txt" zu "\out.txt" und landet im Wurzelverzeichnis des Laufwerks. Behandeln Sie jedes Environ-Ergebnis als möglicherweise leer.

Sub EnvironDemo()
    Debug.Print Environ("USERPROFILE")   ' C:\Users\Ann
    Debug.Print Environ("TEMP")          ' C:\Users\Ann\AppData\Local\Temp
    Debug.Print Environ("USERNAME")      ' Ann
    Debug.Print Environ("TMEP")          ' "" - falsch geschrieben, kein Fehler, nur leer
End Sub

Jedem Windows-Programm wird eine kleine Tabelle aus NAME=WERT-Zeichenketten mitgegeben — der Umgebungsblock —, die festhält, wo das Profil des Nutzers liegt, wohin temporäre Dateien gehen, wer angemeldet ist und mehr. Environ ist VBAs Fenster auf diese Tabelle. Es ist der korrekte, portable Weg, maschinenspezifische Ordner zu finden, und es hat genau eine Angewohnheit, die Sie respektieren müssen: Fragen Sie nach einem Namen, den es nicht hat, antwortet es mit Leere, statt sich zu beschweren.

Was Sie lernen

  • Das mentale Modell — Environ liest Windows' lebende NAME=WERT-Tabelle für dieses Programm
  • Der ganze Sinn: portable Pfade statt hartcodiertem C:\Users\<name>\...
  • Warum eine fehlende oder falsch geschriebene Variable "" liefert — der lautlose Bug — und wie Sie ihn absichern
  • Die zwei Aufrufformen: Environ("NAME") nach Name gegenüber Environ(n) nach numerischem Index
  • Warum der Block ein Snapshot ist, der beim Start von Excel genommen wurde, und was „veraltet" hier bedeutet
  • Was Environ nicht kann — Variablen schreiben oder eine nach dem Start geänderte lesen

Das mentale Modell: Environ liest die Name=Wert-Tabelle von Windows

Wenn Windows ein Programm startet, kopiert es einen Satz von NAME=WERT-Paaren in den Speicher dieses Programms — die Prozessumgebung. Sie enthält Einträge wie USERPROFILE=C:\Users\Ann, TEMP=C:\Users\Ann\AppData\Local\Temp, COMPUTERNAME=DESK-01 und Dutzende mehr. Environ schlägt einen Namen einfach in dieser Tabelle nach und liefert seinen Wert als Text zurück:

Dim tempDir As String
tempDir = Environ("TEMP")     ' fragt die Tabelle nach dem unter "TEMP" gespeicherten Wert

Das ist das ganze Modell. Environ ist ein Lesen einer Nachschlagetabelle, die Windows füllte, bevor Excel öffnete. Es ist keine Live-Abfrage der Windows-Einstellungen, nicht die Registry und nicht das aktuelle Arbeitsverzeichnis — das sind verschiedene Dinge. Sobald Sie es als „einen Namen in einer Tabelle nachschlagen" sehen, folgen die Regeln weiter unten.

Hartcodierte Benutzerpfade ersetzen — der ganze Sinn

Der Grund, Environ überhaupt zu benutzen: hören Sie auf, Pfade zu schreiben, die nur auf Ihrer Maschine funktionieren. Diese Zeile ist ein klassisches Makro, das in dem Moment bricht, in dem jemand anderes es ausführt:

Open "C:\Users\John\AppData\Roaming\MyApp\log.txt" For Append As #1   ' funktioniert nur fuer John

Es gibt keinen Nutzer namens John auf dem PC eines anderen. Bauen Sie den Pfad aus der Umgebung neu, und er funktioniert überall:

Dim p As String
p = Environ("APPDATA") & "\MyApp\log.txt"      ' C:\Users\<beliebig>\AppData\Roaming\MyApp\log.txt
Open p For Append As #1

Die Variablen, nach denen Sie am häufigsten greifen: USERPROFILE (der persönliche Ordner des Nutzers), APPDATA und LOCALAPPDATA (Anwendungsdaten pro Nutzer), TEMP (Ablagedateien), USERNAME (wer angemeldet ist), COMPUTERNAME und PUBLIC. Reichen Sie das Ergebnis an Open, Dir oder einen Shell-Befehl weiter, und Ihr Makro reist ohne Änderungen auf jede Maschine.

Eine fehlende Variable liefert Leere, keinen Fehler

Hier die Falle, die die verwirrendsten Fehlschläge erzeugt, und sie ist eine direkte Folge davon, dass Environ ein Tabellen-Nachschlagen ist: Fragen Sie nach einem Namen, der nicht da ist, und Sie bekommen eine leere Zeichenkette — kein Fehler, keine Warnung. Ein Tippfehler von einem einzigen Zeichen genügt:

Dim p As String
p = Environ("TMEP") & "\out.txt"   ' TMEP existiert nicht -> "" & "\out.txt" = "\out.txt"
Open p For Output As #1            ' erstellt C:\out.txt im Wurzelverzeichnis - nicht das, was Sie meinten

Nichts beschwert sich in der Environ-Zeile, denn „nicht gefunden" ist für sie eine legitime Antwort. Der Schaden zeigt sich später und anderswo — eine Datei im Wurzelverzeichnis, ein Pfad, der sich nicht öffnen lässt, ein Ordner am falschen Ort — weit weg von dem Tippfehler, der ihn verursacht hat. Sichern Sie die ab, auf die es ankommt:

Dim tempDir As String
tempDir = Environ("TEMP")
If tempDir = "" Then
    MsgBox "TEMP is not set - cannot continue.": Exit Sub
End If

Die Regel zum Mitnehmen: Ein leeres Environ-Ergebnis ist normal, nicht die Ausnahme — prüfen Sie darauf, wann immer ein fehlender Wert eine Datei an den falschen Ort schicken würde. Das ist das Echo im Umgebungsblock desselben lautlosen Fehlschlags, der so viele Aufrufe außerhalb von Excel gefährlich macht: Die Antwort auf einen Fehler ist stille Leere, kein lauter Halt.

Zwei Aufrufformen: nach Name und nach Index

Environ hat zwei Gestalten, und sie liefern Verschiedenes. Übergeben Sie eine Zeichenkette, bekommen Sie den Wert dieser Variablen. Übergeben Sie eine Zahl, bekommen Sie das ganze rohe NAME=WERT-Paar an dieser Position, was Ihnen erlaubt, den gesamten Block aufzuzählen:

Debug.Print Environ("PATH")     ' nach Name  -> nur der Wert: C:\Windows;C:\Windows\System32;...

Dim i As Integer, entry As String
i = 1
Do
    entry = Environ(i)          ' nach Index -> das rohe Paar: "USERPROFILE=C:\Users\Ann"
    If entry = "" Then Exit Do  ' leere Zeichenkette markiert das Ende der Liste
    Debug.Print entry
    i = i + 1
Loop

Die Form nach Index ist der Weg, welche Variablen existieren auf einer Maschine zu entdecken — nützlich für Diagnosen. Beachten Sie, dass dasselbe Leere-Zeichenkette-Signal doppelte Arbeit leistet: Bei einem Namen bedeutet es „nicht gefunden", bei einem Index „hinter dem Ende der Liste". Sowohl Schleifen als auch Nachschlagevorgänge stützen sich auf diese eine Konvention.

Die Snapshot-Falle, und was Environ nicht kann

Zwei Grenzen erwischen Leute, die von Environ eine Live-Sicht auf Windows erwarten.

Es ist ein Snapshot vom Start. Excel kopierte den Umgebungsblock, als es startete. Wenn Sie danach eine Variable ändern — über die Systemeigenschaften, einen setx-Befehl oder ein anderes Werkzeug —, sieht Environ in derselben Excel-Sitzung den neuen Wert nicht. Es spiegelt die Welt so wider, wie sie war, als Excel öffnete; erst ein Neustart frischt ihn auf.

Es liest nur; es kann nicht schreiben. Es gibt kein Environ("X") = "Y". Um eine Variable zu setzen oder eine nach dem Start geänderte zu lesen, brauchen Sie die Environment-Auflistung des WScript.Shell-Objekts über CreateObject:

Dim sh As Object
Set sh = CreateObject("WScript.Shell")
Debug.Print sh.Environment("Process")("TEMP")   ' der Live-Prozesswert
' sh.Environment("User")("MYVAR") = "hello"      ' diese Form KANN eine Benutzervariable schreiben

Environ kann Ihnen auch nicht sagen, aus welchem Geltungsbereich ein Wert stammt — Nutzer, System oder Prozess. Windows verschmilzt sie zu dem einen Block, den Sie sehen, und Environ meldet nur das verschmolzene Ergebnis. Für alltägliche portable Pfade ist das genau genug; greifen Sie nur dann zu WScript.Shell.Environment, wenn Sie eine Variable schreiben oder eine frisch geänderte lesen müssen.

Das ehrliche Fazit: das Werkzeug für portable Pfade, als möglicherweise leer behandelt

Environ verdient seinen Platz für eine Aufgabe und macht sie gut: maschinenspezifische Ordner in Pfade zu verwandeln, die reisen. Die Fehler führen alle darauf zurück, dass man vergisst, dass ein Nachschlagen lautlos danebengreifen kann. Vier Regeln decken es ab:

  • Nehmen Sie es für portable PfadeEnviron("APPDATA") & "\MyApp\...", nie ein hartcodiertes C:\Users\<name>\....
  • Behandeln Sie jedes Ergebnis als möglicherweise leer → ein fehlender oder falsch geschriebener Name liefert "", keinen Fehler. Sichern Sie die Werte ab, deren Fehlen eine Datei an den falschen Ort schicken würde.
  • Kennen Sie die zwei FormenEnviron("NAME") liefert den Wert; Environ(n) liefert das rohe NAME=WERT-Paar und lässt Sie den Block aufzählen.
  • Es ist ein Start-Snapshot und schreibgeschützt → es sieht keine Variable, die nach dem Start von Excel geändert wurde, und kann keine setzen. Dafür nehmen Sie WScript.Shell.Environment.

Bekommen Sie das richtig hin, und eine ganze Familie von „läuft auf meinem PC, bricht auf ihrem"-Pfad-Bugs verschwindet — Sie hören auf, einen bestimmten Nutzer zu benennen, und fangen an, die Maschine zu fragen, wo ihre Ordner tatsächlich liegen.

Wie ExcelMaster hilft

Die Environ-Bugs, die echte Zeit verschwenden, sind die mit den stillen Pfaden: ein Makro, fest auf C:\Users\John verdrahtet, das für alle anderen scheitert, ein vertippter Variablenname, der eine Datei ohne Fehler im Wurzelverzeichnis ablegt, ein Pfad, gebaut aus TEMP, der annahm, die Variable sei gesetzt. Jeder davon kommt entweder daher, dass man die Umgebung nicht nutzt oder ihr ohne Prüfung vertraut.

ExcelMaster schreibt die Logik für portable Pfade richtig. Beschreiben Sie das Ziel — „speichere ein Protokoll im AppData-Ordner des Nutzers" oder „schreibe Ablagedateien in sein Temp-Verzeichnis" — und es baut den Pfad aus der richtigen Environ-Variablen, prüft, dass der Wert nicht leer zurückkam, und öffnet oder erstellt erst dann die Datei. Sie beschreiben, welcher Ordner, nicht welcher Nutzer, und es erzeugt Code, der auf jeder Maschine unverändert läuft.

Häufig gestellte Fragen

Wie bekomme ich in VBA den aktuellen Windows-Benutzernamen?

Nehmen Sie Environ("USERNAME") — es liefert den Anmeldenamen des aktuellen Nutzers, zum Beispiel Ann. Das ist der leichtgewichtige Weg, ohne Windows-API-Aufruf festzustellen, wer das Makro ausführt. Wenn Sie statt des Anmeldenamens den vollständigen Anzeigenamen oder die Domäne brauchen, erfordert das eine API wie GetUserNameEx, aber um ein Protokoll zu stempeln oder einen Pfad pro Nutzer zu bauen, ist Environ("USERNAME") die Standardantwort.

Wie bekomme ich in VBA den Pfad zum Temp- oder AppData-Ordner des Nutzers?

Environ("TEMP") liefert den temporären Ordner pro Nutzer (typischerweise C:\Users\<name>\AppData\Local\Temp), und Environ("APPDATA") liefert den Roaming-Ordner für Anwendungsdaten. Beide sind benutzerspezifisch, also vermeidet der Bau von Pfaden daraus das Hartcodieren von C:\Users\<name>. Prüfen Sie das Ergebnis vor der Verwendung immer auf Leere: t = Environ("TEMP") : If t = "" Then Exit Sub, denn eine fehlende Variable liefert eine leere Zeichenkette, statt einen Fehler auszulösen.

Warum liefert Environ in VBA eine leere Zeichenkette?

Weil der Variablenname, nach dem Sie gefragt haben, in der Prozessumgebung nicht vorhanden ist — meist ein Tippfehler (TMEP statt TEMP), eine Variable, die nur in einem anderen Geltungsbereich existiert, oder eine, die nach dem Start von Excel angelegt wurde. Environ behandelt „nicht gefunden" als normale Antwort und liefert "" ohne Fehler. Fügen Sie eine Absicherung hinzu: If Environ("NAME") = "" Then .... Wenn die Variable nach dem Start von Excel gesetzt wurde, starten Sie Excel neu oder lesen Sie sie live über CreateObject("WScript.Shell").Environment("Process")("NAME").

Kann VBA Environ eine Umgebungsvariable setzen oder ändern?

Nein. Environ ist schreibgeschützt — es gibt keine Zuweisungsform. Um eine Variable zu erstellen oder zu ändern, nehmen Sie das WScript.Shell-Objekt: CreateObject("WScript.Shell").Environment("User")("MYVAR") = "value" setzt eine dauerhafte Benutzervariable. Beachten Sie, dass jede Änderung, die Sie vornehmen, in Environ für die aktuelle Excel-Sitzung nicht erscheint, denn Environ liest einen Snapshot, der beim Start von Excel genommen wurde; ein Neustart ist nötig, damit es neue Werte sieht.

Wie liste ich in VBA alle Umgebungsvariablen auf?

Rufen Sie Environ mit einer Zahl statt eines Namens auf — Environ(1), Environ(2) und so weiter —, und jeder liefert das rohe NAME=WERT-Paar an dieser Position. Schleifen Sie, bis es eine leere Zeichenkette liefert, die das Ende der Liste markiert: i = 1 : Do : e = Environ(i) : If e = "" Then Exit Do : Debug.Print e : i = i + 1 : Loop. Das zählt den gesamten Umgebungsblock auf, was praktisch für Diagnosen ist, wenn sich ein Pfad nicht wie erwartet auflöst.

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 30.08.2026.

Verwandte Anleitungen: VBA Shell · VBA CreateObject & GetObject · VBA FreeFile & Open · VBA Dir · VBA CurDir & ChDir