August 15, 2020, 07:40:49

Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!


Eigenartiges mkDir-Problem

Begonnen von VIE81, Juni 18, 2020, 23:06:20

⏪ vorheriges - nächstes ⏩

VIE81

Hallo!

Ich beobachte ein merkwürdiges Phänomen bzw. habe ein mkDir-Problem...

Über einen Clickbutton "OpenFiles" prüfe ich mit dem untenstehenden Code, ob ein Ordner existiert oder nicht. Wenn er nicht existiert, dann soll er angelegt werden.

Private Sub OpenFiles_Click()

Dim fso, objShell, strPath
Dim dGZ As String
Dim dJAHR As String
Dim dVKT As String
Dim dKurztext As String
Dim ATPfad As String
Dim dZNr As String

ATPfad = Forms!frmMainMenue![PathSrvAT]
dGZ = Me.E_GZ_ZAHL
dJAHR = Me.E_GZ_JAHR & "\"
dVKT = Format(Me.E_BTG, "yyyy-mm-dd")
dZNr = Me.E_ZNR
dKurztext = Me.E_SCHLAGZEILE
strPath = ATPfad & dJAHR & dGZ & "_" & dVKT & "_" & dZNr & "_" & dKurztext
Set objShell = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FilesystemObject")
If Not fso.FolderExists(strPath) Then
    fso.CreateFolder strPath
End If
objShell.Run "explorer.exe /e," & strPath
Set fso = Nothing
Set objShell = Nothing

End Sub


Nach dem Definieren des Codes im VBA-Editor rufe ich das Formular auf (das Formular "frmMainMenue" ist dabei ebenfalls geöffnet) und klicke auf die Schaltfläche. Der Ordner wird - wenn er nicht existiert - erzeugt und geöffnet. Soweit so gut.

Sobald ich aber die DB beende und neu öffne, die Schaltfläche betätige, erhalte ich den Laufzeitfehler 76 -> Der Pfad existiert nicht.  ??? ??? ???

Hat jemand von Euch eine Idee?
Habe ich etwas vergessen oder mache ich etwas falsch?

DANKE für Eure Hilfe!

LG,
VIE81

DF6GL

Hallo,

ZitatSobald ich aber die DB beende und neu öffne, die Schaltfläche betätige


Hats Du denn mal getestet, was in den einzelnen Textfeldern zu diesem Zeitpunkt drinsteht?  (Haltepunkt setzen und mit F8 Code durchlaufen)

Zudem: Gibt den Inhalt von strPath mal im Direktfenster aus....

VIE81

Zitat von: DF6GL am Juni 19, 2020, 07:53:54
Hallo,

ZitatSobald ich aber die DB beende und neu öffne, die Schaltfläche betätige


Hats Du denn mal getestet, was in den einzelnen Textfeldern zu diesem Zeitpunkt drinsteht?  (Haltepunkt setzen und mit F8 Code durchlaufen)

Zudem: Gibt den Inhalt von strPath mal im Direktfenster aus....


Hallo!

Also die Daten scheinen eigentlich korrekt zu sein (siehe Anhang)...

Ich habe jetzt auch versucht, mittels DLookup den Wert aus der Tabelle direkt in VBA herauszulesen - bringt aber leider genauso wenig  :-\

LG,
VIE81

VIE81

ZUSATZINFORMATION

Ich dürfte zwischenzeitlich eine Art Workaround gefunden haben, wenngleich sich mir bis jetzt nicht erschließt, welcher Fehler dafür wirklich verantwortlich ist...

Wenn ich - wie in meinem Fall - einen Ordner mit der Jahreszahl manuell im Zielverzeichnis (ATPfad) anlege und dann die Schaltfläche anklicke, dann funktioniert es ohne Probleme; das ist aber nicht der Weisheit letzter Schluss, nachdem ich das Anlegen eines neuen Ordners ja eigentlich automatisieren wollte.

Hat jemand eine Idee, warum das so ist bzw. sein soll?

DANKE und viele Grüße,
VIE81

PhilS

Zitat von: VIE81 am Juni 19, 2020, 12:27:11
Wenn ich - wie in meinem Fall - einen Ordner mit der Jahreszahl manuell im Zielverzeichnis (ATPfad) anlege und dann die Schaltfläche anklicke, dann funktioniert es ohne Probleme; das ist aber nicht der Weisheit letzter Schluss, nachdem ich das Anlegen eines neuen Ordners ja eigentlich automatisieren wollte.
Ich glaube, du kannst immer nur einen einzelnen Ordner neu erstellen, nicht eine ganze Hierarchie auf einen Schlag.
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!

DF6GL

Hallo,


wenn es sich um das direkte Anlegen einer hierarchischen Verzeichnis-Struktur handelt, dann könnte dies helfen:

(In einem Standard-Modul)


Option Compare Database
Option Explicit

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

'------------------------------

Public Function CreatePath(NewPath As String) As Boolean
  Dim nNewPath As String
 
    nNewPath = Trim(NewPath)
    If Right(nNewPath, 1) <> "\" Then nNewPath = nNewPath & "\"
    CreatePath = CBool(MakeSureDirectoryPathExists(nNewPath))
End Function


VIE81

DANKE für Eure Hilfe - der ausschlaggebende Punkt war, dass es mit dem von mir verwendeten Code ein Anlegen von mehreren Ordnern gleichzeitig nicht möglich war.

Der Workaround mit dem manuellen Anlegen eines "Jahres"-Ordners wäre zwar nicht der Megaaufwand gewesen, aber dennoch ärgerlich.

Ich habe daher Folgendes - getestet - gemacht:

Private Sub OpenFiles_Click()
Dim fso, objShell, strPath
Dim dGZ As String
Dim dJAHR As String
Dim dVKT As String
Dim dKurztext As String
Dim ATPfad As String
Dim dZNr As String

ATPfad = DLookup("[SYS_SRV_AT]", "[tblSysParam]")
dGZ = Me.E_GZ_ZAHL
dJAHR = Me.E_GZ_JAHR
dVKT = Format(Me.E_BTG, "yyyy-mm-dd")
dZNr = Me.E_ZNR
dKurztext = Me.E_SCHLAGZEILE
strPath1 = ATPfad & dJAHR
strPath2 = ATPfad & dJAHR & "\" & dGZ & "_" & dVKT & "_" & dZNr & "_" & dKurztext
Set objShell = CreateObject("WScript.Shell")
Set fso = CreateObject("Scripting.FilesystemObject")
If Not fso.FolderExists(strPath1) Then
    fso.CreateFolder strPath1
End If
If Not fso.FolderExists(strPath2) Then
    fso.CreateFolder strPath2
End If
objShell.Run "explorer.exe /e," & strPath2
Set fso = Nothing
Set objShell = Nothing
End Sub


Die Routine prüft zweistufig, ob

  • der Ordner für das Jahr existiert,

  • legt ihn - falls erforderlich - an,

  • prüft im zweiten Schritt, ob der tatsächliche Ordner existiert und

  • legt diesen - falls erforderlich an - und öffnet den Ordner im Explorer



DANKE für Eure Denkanstöße!!

Viele Grüße,
VIE81


crystal

Hallo,
hier noch ein Link zum Thema:
https://www.devhut.net/2011/09/15/vba-create-directory-structurecreate-multiple-directories/

Die Function MakeSureDirectoryPathExists Lib "imagehlp.dll" macht alles - wie der Name schon sagt... und
Franz DF6GL
Wer Fehler in meinen Antworten findet, darf sie behalten, muss sie aber kommentieren. ;-)
Dies ist keineswegs arrogant gemeint, sondern soll nur unterstreichen, dass meine Antworten - natürlich - nicht immer fehlerfrei sind und sein können.
Devise: bitte immer erst selbst probieren!