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

VBA CurDir & ChDir in Excel — warum ein relativer Pfad im falschen Ordner landet

|

VBA CurDir & ChDir in Excel — warum ein relativer Pfad im falschen Ordner landet

TL;DR — Ein relativer Pfad (ein Name ohne Laufwerk, wie "Reports") wird gegen CurDir aufgelöst, Excels aktuelles Arbeitsverzeichnis — das nicht der Ordner Ihrer Arbeitsmappe ist und sich ändert, sobald ein Datei-Öffnen-Dialog irgendwo neu hinzeigt. So können MkDir "Reports" oder Open "data.csv" bei jedem Lauf an einem anderen Ort landen. Verankern Sie jeden Pfad an ThisWorkbook.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 CurDir aufgelöst wird
  • Warum CurDir nicht ThisWorkbook.Path ist und wohin es tatsächlich zeigt
  • Wie ein Datei-Öffnen-Dialog CurDir mitten im Makro still ändert
  • Warum ChDir das Laufwerk nicht wechseln kann und warum ChDrive eine separate Anweisung ist
  • Warum ThisWorkbook.Path bei 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 aus CurDir auf.

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 → und CurDir ist 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.
  • ChDir wechselt keine Laufwerke → Sie brauchen zuerst ChDrive; beide sind ein Zeichen, dass Sie Zustand verwalten, den Sie nicht verwalten müssten.
  • An ThisWorkbook.Path verankern → bauen Sie absolute Pfade mit Application.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.PathThisWorkbook.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