TL;DR — Ein relativer Pfad (ein Name ohne Laufwerk, wie
"Reports") wird gegenCurDiraufgelöst, Excels aktuelles Arbeitsverzeichnis — das nicht der Ordner Ihrer Arbeitsmappe ist und sich ändert, sobald ein Datei-Öffnen-Dialog irgendwo neu hinzeigt. So könnenMkDir"Reports"oderOpen "data.csv"bei jedem Lauf an einem anderen Ort landen. Verankern Sie jeden Pfad anThisWorkbook.Path.
Sub WhereDoesThisGo()
MkDir "Reports" ' unter CurDir erstellt - oft NICHT neben der Arbeitsmappe
MkDir ThisWorkbook.Path & "\Reports" ' neben DIESER Arbeitsmappe erstellt, jedes Mal
End Sub
Das ist der Bug hinter einer ganzen Familie verwirrter Meldungen: „mein Makro hat den Ordner am falschen Ort
erstellt“, „es hat die Datei in Dokumente gespeichert“, „gestern ging es und heute nicht“. Keine davon ist
zufällig. Sie alle führen auf eine Tatsache zurück, die zu hinterfragen niemandem einfällt — dass ein
relativer Pfad in VBA gegen ein Arbeitsverzeichnis aufgelöst wird, das Excel für Sie verwaltet, und dass
dieses Verzeichnis nicht dort ist, wo Sie es annehmen. Verstehen Sie CurDir, und jeder dieser Bugs wird mit
einer einzigen Gewohnheit vermeidbar.
Was Sie lernen
- Das mentale Modell — ein relativer Pfad bedeutet nichts, bis er gegen
CurDiraufgelöst wird - Warum
CurDirnichtThisWorkbook.Pathist und wohin es tatsächlich zeigt - Wie ein Datei-Öffnen-Dialog
CurDirmitten im Makro still ändert - Warum
ChDirdas Laufwerk nicht wechseln kann und warumChDriveeine separate Anweisung ist - Warum
ThisWorkbook.Pathbei einer nie gespeicherten Arbeitsmappe leer ist - Die eine Gewohnheit, die die ganze Klasse von Falscher-Ordner-Bugs beseitigt
Das mentale Modell: ein relativer Pfad wird gegen CurDir aufgelöst
Die zentrale Einsicht ist, dass VBA zwei Arten von Pfad kennt, und sie verhalten sich völlig verschieden:
- Absolut — beginnt mit einem Laufwerk oder Stammverzeichnis:
"C:\Reports\March.xlsx". Es meint genau einen Ort. - Relativ — kein Laufwerk, kein führender
\:"Reports"oder"data\in.csv". Es meint „relativ zum aktuellen Verzeichnis“, und VBA füllt den Rest ausCurDirauf.
CurDir ist eine Funktion, die dieses Arbeitsverzeichnis liefert — CurDir für das aktuelle Laufwerk oder
CurDir("D") für ein bestimmtes. Jede Anweisung, die einen Pfad nimmt — MkDir,
RmDir, Open, Kill, Name, Dir —, löst einen relativen Pfad
gegen CurDir auf. Die Frage „wo ist mein Ordner hin?“ ist also in Wahrheit „was war CurDir in dem Moment,
als die Anweisung lief?“ — und das ist eine viel weniger offensichtliche Frage, als sie klingt.
CurDir ist nicht ThisWorkbook.Path
Hier ist das Missverständnis, das der ganzen Sache zugrunde liegt: Die Leute nehmen an, das „aktuelle Verzeichnis“ sei der Ordner, in dem die Arbeitsmappe liegt. Ist es nicht. Es sind zwei voneinander unabhängige Werte:
Debug.Print CurDir ' Excels Arbeitsverzeichnis - oft C:\Users\You\Documents
Debug.Print ThisWorkbook.Path ' wo DIESE Arbeitsmappe gespeichert ist - z. B. D:\Projects\2026
CurDir beginnt als das, was Windows Excel beim Start übergeben hat (häufig Ihr Ordner Dokumente), und hat
keine Verbindung dazu, von wo aus Sie Ihre Arbeitsmappe geöffnet haben. So erstellt MkDir "Reports"
keinen Ordner neben Ihrer Datei — es erstellt einen unter CurDir, das überall sein könnte. ThisWorkbook.Path
hingegen zeigt immer auf den Ordner, der die Arbeitsmappe enthält, die den Code ausführt. Wann immer Sie
„neben meiner Arbeitsmappe“ meinen, ist das die Eigenschaft, die Sie wollen — niemals CurDir.
Ein Datei-Öffnen-Dialog ändert CurDir still
Der Grund, warum Falscher-Ordner-Bugs sporadisch sind — gestern in Ordnung, heute kaputt —, ist, dass
CurDir nicht stillhält. Windows aktualisiert es, sobald der Benutzer (oder Ihr eigener Code) in einem
Dateidialog einen Ordner durchsucht:
Dim f As Variant
f = Application.GetOpenFilename ' Benutzer wechselt zu D:\Client\Inbox und waehlt eine Datei
' CurDir ist jetzt D:\Client\Inbox - es hat sich unsichtbar verschoben
MkDir "Reports" ' erstellt D:\Client\Inbox\Reports, nicht wo Sie es meinten
Nichts in Ihrem Code sagte „wechsle das Verzeichnis“, und doch verschob sich CurDir, weil der Dialog es
setzte. Jeder relative Pfad ab diesem Punkt löst sich gegen den neuen Ort auf. Deshalb schreibt dasselbe
Makro in einen anderen Ordner, je nachdem, was der Benutzer fünf Minuten zuvor angeklickt hat — eine wahrhaft
unsichtbare Abhängigkeit und ein unbeantwortbares Support-Ticket, sofern Sie nicht wissen, dass CurDir das
bewegliche Teil ist.
ChDir ändert den Ordner — aber nicht das Laufwerk
Wenn Sie das Arbeitsverzeichnis doch bewusst setzen wollen, ist ChDir die Anweisung — aber sie hat eine
Falle, die fast jeden erwischt: ChDir ändert den aktuellen Ordner, nicht das aktuelle Laufwerk.
ChDir "D:\Data" ' setzt D:s Standardordner auf \Data - aber Sie sind IMMER NOCH auf Laufwerk C:
CurDir ' liefert weiterhin C:\... - das Laufwerk hat nie gewechselt
Um tatsächlich auf ein anderes Laufwerk zu wechseln, brauchen Sie zuerst ChDrive, und es ist eine
separate Anweisung:
ChDrive "D" ' das aktuelle Laufwerk auf D: umschalten
ChDir "D:\Data" ' jetzt den Ordner auf D: setzen
Diese Aufteilung — eine Anweisung für das Laufwerk, eine andere für den Ordner — ist ein Überbleibsel aus DOS, wo jedes Laufwerk sein eigenes aktuelles Verzeichnis merkte. Es ist genau die Art von Überraschung, die „setze einfach das Arbeitsverzeichnis“ brüchig macht. Was auf die eigentliche Abhilfe verweist: Verwalten Sie gar kein Arbeitsverzeichnis.
Die Gewohnheit, die die ganze Klasse von Bugs beseitigt
Jeder Falscher-Ordner-Bug von oben verschwindet, wenn Sie nie einen relativen Pfad verwenden. Bauen Sie einen
absoluten Pfad aus ThisWorkbook.Path und übergeben Sie diesen an jede Dateianweisung:
Dim base As String
base = ThisWorkbook.Path & Application.PathSeparator ' z. B. "D:\Projects\2026\"
MkDir base & "Reports" ' immer neben der Arbeitsmappe
Open base & "data.csv" For Output As #1 ' derselbe Anker, keine CurDir-Abhaengigkeit
Zwei Details machen das robust. Verwenden Sie Application.PathSeparator statt eines hartcodierten "\",
damit der Code kein Trennzeichen voraussetzt, und achten Sie auf das abschließende Trennzeichen, damit Sie
nie versehentlich ...2026Reports erzeugen. Mit jedem Pfad an ThisWorkbook.Path verankert wird CurDir
belanglos — es kann wandern, wohin die Dialoge es schieben, und Ihre Ordner landen dennoch genau dort, wo Sie
es meinten.
Ein Grenzfall zum Absichern: ThisWorkbook.Path ist eine leere Zeichenfolge bei einer Arbeitsmappe, die
nie gespeichert wurde. Kann ein Makro vor seiner ersten Speicherung laufen, prüfen Sie
If ThisWorkbook.Path = "" Then und fragen Sie nach einem Ort, statt aus dem Nichts einen kaputten Pfad zu
bauen.
Das ehrliche Fazit: an ThisWorkbook.Path verankern, nie an CurDir
CurDir zu verstehen lohnt sich gerade deshalb, damit Sie aufhören können, sich darauf zu verlassen. Vier
Regeln:
- Ein relativer Pfad folgt
CurDir→ undCurDirist Excels wanderndes Arbeitsverzeichnis, nicht der Ordner Ihrer Arbeitsmappe. - Ein Datei-Öffnen-Dialog verschiebt
CurDir→ sodass relative Pfade sporadisch falsch sind; vertrauen Sie nie darauf, dass das Arbeitsverzeichnis dort ist, wo Sie es verlassen haben. ChDirwechselt keine Laufwerke → Sie brauchen zuerstChDrive; beide sind ein Zeichen, dass Sie Zustand verwalten, den Sie nicht verwalten müssten.- An
ThisWorkbook.Pathverankern → bauen Sie absolute Pfade mitApplication.PathSeparator, sichern Sie den Fall der ungespeicherten Arbeitsmappe ab, und der Falscher-Ordner-Bug ist endgültig verschwunden.
Das ist der Faden, der die Ordnerwerkzeuge zusammenhält: MkDir und
RmDir sind nur so verlässlich wie der Pfad, den Sie ihnen geben, und ein relativer
Pfad übergibt Ihr Schicksal an CurDir. Geben Sie ihnen einen absoluten Pfad, aufgebaut aus
ThisWorkbook.Path, und beide Anweisungen tun genau das, was Sie erwarten, bei jedem Lauf.
Wie ExcelMaster hilft
Einen Pfad richtig hinzubekommen heißt zu wissen, dass CurDir nicht der Ordner Ihrer Arbeitsmappe ist,
dass ein Datei-Öffnen-Dialog es ohne Warnung verschiebt, dass ChDir keine Laufwerke wechseln kann und dass
ThisWorkbook.Path leer ist, bis die Arbeitsmappe gespeichert ist — vier Fallen hinter jeder Meldung „es hat
den Ordner am falschen Ort erstellt“.
ExcelMaster schreibt Pfade, die dort
landen, wo Sie es meinen. Beschreiben Sie den Job — „speichere den Export neben dieser Arbeitsmappe“ oder
„baue den Ausgabeordner im Projektverzeichnis“ — und es erzeugt einen absoluten Pfad, verankert an
ThisWorkbook.Path mit Application.PathSeparator, nie einen relativen Pfad, der von CurDir abhängt, und
es sichert den ungespeicherten Fall ab. Sie beschreiben, wohin die Datei soll; es schreibt den Pfad, der sie
bei jedem Lauf dorthin legt.
Häufig gestellte Fragen
Was liefert CurDir in VBA?
CurDir liefert Excels aktuelles Arbeitsverzeichnis — den Ordner, gegen den relative Pfade aufgelöst
werden. CurDir gibt das Verzeichnis auf dem aktuellen Laufwerk; CurDir("D") gibt es für Laufwerk D. Es ist
gewöhnlich das, was Windows beim Start von Excel gesetzt hat (oft Ihr Ordner Dokumente), und hat keine
Verbindung dazu, wo Ihre Arbeitsmappe gespeichert ist, verwenden Sie es also nicht im Sinne von „neben meiner
Datei“.
Warum erstellt mein VBA-Makro den Ordner oder speichert die Datei am falschen Ort?
Weil Sie einen relativen Pfad verwendet haben, und VBA hat ihn gegen CurDir aufgelöst statt gegen den
Ordner Ihrer Arbeitsmappe. CurDir ist Excels Arbeitsverzeichnis, und ein Datei-Öffnen-Dialog ändert es
still, sodass derselbe relative Pfad bei verschiedenen Läufen in verschiedenen Ordnern landet. Bauen Sie einen
absoluten Pfad aus ThisWorkbook.Path — ThisWorkbook.Path & "\" & "Reports" —, und der Ort hängt nicht mehr
von CurDir ab.
Was ist der Unterschied zwischen CurDir und ThisWorkbook.Path?
CurDir ist Excels wanderndes Arbeitsverzeichnis — wo relative Pfade sich auflösen, veränderbar durch jeden
Dateidialog. ThisWorkbook.Path ist der Ordner, in dem die Arbeitsmappe gespeichert ist, die den Code
ausführt, und er bewegt sich nicht. Wenn Sie „neben dieser Arbeitsmappe“ meinen, verwenden Sie immer
ThisWorkbook.Path; verwenden Sie CurDir nur, wenn Sie wirklich das Arbeitsverzeichnis wollen, was selten
ist.
Warum wechselt ChDir in VBA das Laufwerk nicht?
Weil ChDir nur den aktuellen Ordner ändert, nicht das aktuelle Laufwerk — ein Überbleibsel aus DOS,
wo jedes Laufwerk sein eigenes aktuelles Verzeichnis behielt. ChDir "D:\Data", während Sie auf C: sind,
setzt D:s Standardordner, lässt Sie aber auf C:. Um Laufwerke zu wechseln, rufen Sie zuerst ChDrive "D" auf,
dann ChDir "D:\Data". In der Praxis ist es einfacher, das Arbeitsverzeichnis ganz zu vermeiden und absolute
Pfade zu verwenden.
Warum ist ThisWorkbook.Path leer?
ThisWorkbook.Path liefert eine leere Zeichenfolge, wenn die Arbeitsmappe nie gespeichert wurde — eine
ungespeicherte Arbeitsmappe hat noch keinen Ordner. Kann ein Makro vor der ersten Speicherung laufen, prüfen
Sie If ThisWorkbook.Path = "" Then und fragen Sie den Benutzer nach einem Ort (mit
Application.GetSaveAsFilename), statt aus einer leeren Zeichenfolge einen Pfad zu bauen, was einen relativen
Pfad ergäbe, der gegen CurDir aufgelöst wird.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 23.08.2026.
Verwandte Anleitungen: VBA MkDir · VBA RmDir · VBA Dir · VBA Open Workbook · VBA Check If File Exists
