Guten Abend Thomas,
danke für Deine Antwort.
grüezi Thomas
Moin Thomas,
freue mich sehr auch über Dein Interesse an diesem
komplizierten Thema…[…]
Aber immer gerne doch
Die Existenz des kompletten korrekten Pfades habe ich aber
mehrmals vor dem Auftreten des Fehlers überprüft ( immer
parallel zum EinzelSchrittModus mit dem Windows-Explorer ).
Das reicht meiner Ansicht nach so nicht aus - ich würde das im
Code drin protokollieren lassen…
Vielleicht einmal ganz akribisch:
- Löschen des aus vorherigen Versuchen bestehenden
ZielOrdners per Explorer
- Starten des Makros mit Lauf bis zur Stop-Marke
- DurchChecken des Makros im Einzelschritt
- im EinzelSchritt die Verzweigung zum UnterProgramm „Ordner
erzeugen“
- Sichtung des neu angelegten Ordners per Explorer
…denn hier lässt Du dem System genügend Zeit für die
Erstellung des Ordners, da Du ja per F8 die Zeilen durchläufst
und im Explorer kontrollierst.
Eben. Das mache ich ganz bewusst so langsam. Und der Fehler kommt trotzdem ( zudem noch mit 2 verschiedenen Texten ). Deshalb denke ich, dass man die Dynamik zunächst außen vor lassen kann.
Solange der Code langsam nicht läuft muss ich mir doch keine Gedanken über den schnellen DurchLauf machen. Der wird dann erst recht nicht zum gewünschten Ergebnis führen. Da weiß ich dann auch nicht, ob eine Protokollierung weitere Erkenntnisse bringt.
In der Dynamik des Ablaufs ohne die Einzelschritte, liegt das
sehr viel weniger Zeit zwischen Erzeugung und Verwendung des
Ordners.
… Mit dem Makro-Code an sich hat das dann nichts
zu tun.
Sehe ich auch so. Wohl eher ein Bug, wenn MSExcel den Ordner nicht sieht, den es selber angelegt hat und der im MSExplorer angezeigt wird.
Wenn ich Schritt 1 weglasse, klappt es wie geplant.
…und warum lässt Du dann Schritt 1 nicht einfach weg?
@ Reinhard: Darüber hatten wir anfangs schon gesprochen … „Plan B“.
Mit der API-Funtkion würde dies eben geprüft und der Ordner
wird nur angelegt wenn er noch nicht existiert.
So gesehen könnte es auch sein, dass der Server dann ein
Latenz-Propblem hat, wenn Du den Ordner löschst und dann
gleich wieder mit demselben Namen anlegst…
Den Ordner lösche ich manuell, damit der Fehler auftritt. Und ich erwähne es nur, um zu zeigen, dass der Fehler nur bei frisch angelegtem Ordner auftritt.
Ich fürchte, ich muss die Tage an einer kleinen
Beispiel-Ordnerstruktur basteln und als zip-Datei ins Netz
stellen.
Oder hat noch Jemand eine rettende Idee?
Prüfe den momentan bestehenden Code mal noch in einer neu
erstellten und ansonsten leeren Mappe - ev. ist deine Mappe
korrumpiert und reagiert daher seltsam.
API habe ich schon öfters gelesen, aber leider weiß ich nicht
wirklich, was das ist.
Statt MakePath habe ich MkDir benutzt. Ist das ein
Unterschied?
Oh, ja - wie bereits Reinhard erklärt ist MKDIR ‚nur‘ in der
Lage Ordner eine Ebene tiefer als die bislang existierenden
anzulegen, brauchst Du daher 3 Ebenen tiefer musst Du jeden
Ordner einzeln anlegen.
Ich muss in diesem Fall aber nur eine OrdnerEbene neu erstellen und das klappt auch sehr gut. Beim zweiten DurchLauf schreibt sich die Datei ja genau dort hinein.
Des weiteren benötist Du eine andere
Funktion (DIR) um zu prüfen ob ein Ordner bereits exisitert.
Ist im Code vorhanden und funktioniert.
Mit der API-Funktion MakePath hast Du alles in einem:
Ein Order in beliebig tiefer Unterstruktur kann in einem
Rutsch angelegt werden. Und derselbe Befehl prüft ob der
Ordner schon existiert und legt ihn an, falls das nicht der
Fall sein sollte.
Und wenn er schon existiert ist das auch o.k.? Dann ist MakePath wohl tatsächlich komfortabler als MkDir.
Das Ganze sieht dann in der Deklaration in einem Modul der
Mappe wie folgt aus:
Option Explicit
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
Und aufgerufen wird die Funktion als Beispiel dann so
Sub Test()
If CreatePath(„C:\Test\Test1\Test2\Test3\Test4“) = 0 Then
MsgBox „Pfad konnte nicht angelegt werden!“
End If
End Sub
…wobei anstelle der MsgBox eine beliebige Fehler-Behandlung
oder eine Do-Loop Schleife stehen kann (das hat aber den
Nachteil, dass wenn das Ganze mal über längere Zeit nicht
klappt, der Code in einer Endlos-Schleife hängt:
Sub Test()
Do
Loop While (CreatePath(„C:\Test\Test1\Test2\Test3\Test4“) =
0)
MsgBox „Done“
End Sub
Das werde ich morgen im Büro ausprobieren.
Vielen Dank, Thomas
Mit freundlichen Grüssen
Thomas Ramel
Bis dahin gute Nacht
Thomas