Verzeichniss erstellen

Hallo Leute

Ich möchte ein Verzeichnis erstellen und falls es bereits schon da ist, das Verzeichnis eben nicht erstellen. Bei meinem Ansatz erkennt
das Makro nicht, dass das Verz. bereits vorhanden ist. Und will es wieder kreieren. Laufzeitfehler 75, Fehler beim Zugriff auf Pfad/Datei

Irgendwie habe ich wiedereinmal einen Knoten und komme nicht weiter.

Hier wäre mein Ansatz:

Sub tt()
Pfad = "C:\Temp\"
Monat = Format(Now, "mmmm")
Jahr = Format(Now, "yyyy")

If Dir(Pfad & Jahr & " " & Monat) = "" Then
 MkDir (Pfad & Jahr & " " & Monat)
End If

End Sub

Vielen Dank für Ideen
Snetto

Grüezi Snetto

Ich möchte ein Verzeichnis erstellen und falls es bereits
schon da ist, das Verzeichnis eben nicht erstellen. Bei meinem
Ansatz erkennt das Makro nicht, dass das Verz. bereits vorhanden ist.

Hier ein etwas anderer Ansatz, der auch Unterordner ohne bereits existierende Überordner sauber erstellt - alles in ein Modul kopieren und dann wie in der Sub ‚TEST‘ die Ordner anlegen lassen:

Declare Function MakePath Lib "imagehlp.dll" Alias \_
 "MakeSureDirectoryPathExists" (ByVal lpPath As String) As Long

Function CreatePath(ByVal strPath As String) As Long
 'Sicherstellen, dass ein abschliessender Backslash vorhanden ist
 If Right(strPath, 1) "\" Then strPath = strPath & "\"
 CreatePath = MakePath(strPath)
End Function

Sub Test()
 Pfad = "C:\Temp\"
 Monat = Format(Now, "mmmm")
 Jahr = Format(Now, "yyyy")

 Do
 Loop While (CreatePath(Pfad & Jahr & " " & Monat) = 0)
 MsgBox "Done"
End Sub

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Hallo Thomas

Vielen Dank für den etwas anderen Ansatz, da ich so einfach wie möglich bleiben möchte und 100%ig wissen will was da läuft… werde ich die Sache mit denn DLL’s auslassen.

Danke
Snetto

Ich möchte ein Verzeichnis erstellen und falls es bereits
schon da ist, das Verzeichnis eben nicht erstellen. Bei meinem
Ansatz erkennt
das Makro nicht, dass das Verz. bereits vorhanden ist. Und
will es wieder kreieren. Laufzeitfehler 75, Fehler beim
Zugriff auf Pfad/Datei

Hallo Snetto,

Sub tt()
Dim Pfad As String
Pfad = „C:\Test“ & Format(Now, „MMMM YYYY“)
If Dir(Pfad, vbDirectory) = „“ Then MkDir Pfad
End Sub

Gruß
Reinhard

Grüezi Snetto

Vielen Dank für den etwas anderen Ansatz, da ich so einfach
wie möglich bleiben möchte und 100%ig wissen will was da
läuft… werde ich die Sache mit denn DLL’s auslassen.

Das ist in diesem Falle keine Hexerei - der Vorteil ist, wie schon gesagt, dass Pfade und Ordner beliebiger Verschachterlungstiefe in einem Rutsch erstellt werden können ohne dass jede Stufe einzeln angelegt werden muss.

Auch ist nur ein einzelner Befehl für das Anlegen/Prüfen notwendig, was die Sache auch nochmal einfacher macht.

Mit freundlichen Grüssen

Thomas Ramel

  • MVP für MS-Excel -

Vielen Dank für den etwas anderen Ansatz, da ich so einfach
wie möglich bleiben möchte und 100%ig wissen will was da
läuft… werde ich die Sache mit denn DLL’s auslassen.

Hallo Snetto,

für die „Benutzung“ ist es doch Banane ob du nun schreibst:
Makepath …
oder
MkDir …

Die Vorteile von MakePath hat dir ja Thomas genannt und auch einen Ansatz codiert.

Was weißt du von MkDir mehr als von MakePath?

MkDir ruft die in Excel eingebaute Funktion MkDir auf die irgendwo in Excel auch in einer dll o.ä. steht.
Makepath ruft die API-Funktion Makepath (oder MakeSureDirectoryPathExists) auf, die in imagehlp.dll enthalten ist.

Wo issen da der Unterschied?

Wenn dich das Declare in dem Modul stört, kein Problem, leg dir ein Modul an, nenne es mdlDeklarationen o.ä. und schreib die da rein, ohne das „Private“.
Dann kannst du in allen Modulen Makepath benutzen, genauso easy wie MkDir.

Angenommen, du brauchst mal eine kurze Wartezeit, dann kannst du in Vba „Wait“ nehmen. Da ist die kleinste einstellbare Wartezeit eine Sekunde.
Nimmst du aber die API Funktion „Sleep“ so ist dort die kleinste zeiteinheit eine Millisekunde und es ist einfacher anzuwenden.

Sleep 5000

wartet 5 Sekunden, m.E. viel einfacher zu handeln als Wait.

Naja, in gewisser Weise hast auch du Recht. Wenn ich GENAU weiß die übergeordneten Ordner existieren nehme ich auch MkDir. Warum auch nicht.
Wenn ich aber z.B. meine Mappe an FremdPcs verschicke mache ich mir doch nicht den Stress bei vielen Ordnern im Pfad die alle durchzuprüfen ob sie existieren. Machbar aber uneffektiv, da nehme ich makePath und fertig.

Da kann dann noch dazwischenfunken daß der Fremduser an seinem PC in dem Ordnerbereich keine Schreiberlaubnis hat, dann hat dir Thomas eine schöne Endlosschleife gebastelt *lächel*
Abhilfe ist möglicherweise Fehlerauswertung oder aber schlicht in die Do Loop Schleife eine Zeitüberwachung einbauen.

Gruß
Reinhard

Lieber Reinhard

Vielen Dank für Dein ausführliche Erklärung. So wird mir einiges klar. Wenn ich API höre… werde ich einfach vorsichtig.

für die „Benutzung“ ist es doch Banane ob du nun schreibst:
Makepath …
oder
MkDir …

Das stimmt, aber ich will genau wissen… was abgeht, jetzt weiss ich es ja :wink:

Danke.

Super Sache,

mit der Erklärung wird das Ganze klar… und man weiss was da läuft.

Vielen Dank.
Snetto

Reinhard ich Danke Dir.

Sub tt()
Dim Pfad As String
Pfad = „C:\Test“ & Format(Now, „MMMM YYYY“)
If Dir(Pfad, vbDirectory) = „“ Then MkDir Pfad
End Sub

Gruss
Snetto