Ein Ordnername und sein Pfad können in VBA nicht angezeigt werden

Hallo

Ich versuche, den "Pfad" eines Ordners aus einem bestimmten Namen zu finden, um Dinge in unserem Konstruktionsbüro mit SOLIDWORKS zu automatisieren.

Ich gebe an, dass ich nur den Namen der Datei und nicht den Pfad habe. 

Es sollte in etwa wie folgt aussehen: F:\Business\??? \Ordnername\...

Nur im Moment kann ich herausfinden, ob es existiert, aber nicht, um seinen Weg wiederzufinden , den ich für die Zukunft brauche. Ich habe nur das "Verstanden"-Feedback in der Konsole

Hast du irgendwelche Ideen?

Hier ist mein Code:

Unter: FindFolder()

    Dim searchFolderName als Zeichenfolge
    searchFolderName = "F:\Deals"

    Dateisystem als Objekt dimmen

    Set FileSystem = CreateObject("Scripting.FileSystemObject")

    doFolder FileSystem.GetFolder(searchFolderName)

 

Ende Sub

Sub doFolder(Ordner)
    Dim-Unterordner
    Bei Fehler: Weiter fortsetzen
    Für jeden Unterordner In Folder.SubFolders
        Wenn subFolder.Name "FolderName" mögen, dann
            Debug.Print subFolder.Name, subFolder.GetPath
            Debug.Print ("verstanden")
        Ende
        Ende, wenn
        
        doFolder Unterordner
    Nächster Unterordner

Ende Sub

Vielen Dank und einen schönen Tag!

 

Ewan

 

Hallo

Zum einen müssen Sie die Variable subFolder korrekt deklarieren:

Dim subFolder As Scripting.Folder

Und dann ist der Weg zum Zugriff auf den Pfad nicht GetPath, sondern Path:

Debug.Print subFolder.Name & subFolder.Path

 

Hallo Cyril,

 

Vielen Dank für Ihre Antwort, ich habe gerade den Code aktualisiert... In der Tat scheint es logischer zu sein!

Aber das Ergebnis bleibt leider das gleiche...

 

 

Sind die Anmeldeinformationen für die Microsoft Scripting Runtime aktiviert?

Dieser Code funktioniert für mich sehr gut:

Sub FindFolder()

    Dim searchFolderName As String
    searchFolderName = "C:\test"

    Dim FileSystem As Object

    Set FileSystem = CreateObject("Scripting.FileSystemObject")

    doFolder FileSystem.GetFolder(searchFolderName)

End Sub

Sub doFolder(Folder)
    Dim subFolder As Scripting.Folder
    On Error Resume Next
    For Each subFolder In Folder.SubFolders
        If subFolder.Name Like "SW2020" Then
            Debug.Print subFolder.Name, subFolder.Path
            Debug.Print ("got it")
        End
        End If
        
        doFolder subFolder
    Next subFolder

End Sub

Das Ganze ist bruchempfindlich, also seien Sie vorsichtig. Wenn es trotzdem über Got It geht, liegt das daran, dass das If funktioniert und der Fehler also an einer anderen Stelle liegt.

Ja, die Anmeldeinformationen für die Microsoft Scripting Runtime sind aktiviert.

Ich habe gerade einen Test gemacht, um zu versuchen, den Pfad des Ordners "test" aufzurufen, den ich unter "C:\folder\test" erstellt habe

Also habe ich:

 

searchFolderName = "C:\"

und 

Wenn subFolder.Name "Test" mögen, dann

 

Ich habe es nur aus der Konsole "herausgeholt", weder den Namen noch den Pfad

Ich habe auf den Bruch geachtet, wie Sie angeben

 

 

Offensichtlich funktioniert es bei einigen Dateien, aber nicht bei allen... obwohl sie sich alle im selben übergeordneten Ordner befinden und ich die Einrückung respektiere

Ehrlich gesagt, ich verstehe nicht, was das Problem ist. Funktioniert hervorragend zu Hause

Es ist verrückt, diese Geschichte...

Zum Beispiel funktioniert es auf F:\Business\DIDAS, aber nicht auf F:\Business\ADOPT

 

Vielleicht die Sequenz, die Probleme verursacht.

Sie müssen darüber nachdenken, den Speicher zu leeren, wenn Sie Funktionen dieser Art verwenden. Ich werde ein Set FileSystem = nothing:Set SubFolder = Nothing  kurz vor dem Ende versuchen, das unter "Got It" steht.

Das Set FileSystem = Nothing gefällt ihm offensichtlich nicht.

Ich habe den  Set subFolder = Nothing hinzugefügt, es ändert sich nichts.

 

 

Cyril

Es scheint, als hätten Sie Recht gehabt, wenn ich den Code für die ersten Ordner ausführe, funktioniert er perfekt. Aber nicht für die nächsten... Es muss gesagt werden, dass der Server geladen ist.

Vielleicht versuchen Sie es mit einem Exit-Sub anstelle von End. Fügen Sie dann im Grunde genommen das Set FileSystem = Nothing in die Hauptprozedur ein:

Sub FindFolder()
    
    Dim searchFolderName As String
    searchFolderName = "C:\test"

    Dim FileSystem As Scripting.FileSystemObject

    Set FileSystem = CreateObject("Scripting.FileSystemObject")

    doFolder FileSystem.GetFolder(searchFolderName)

    Set FileSystem = Nothing

End Sub

Sub doFolder(Folder)
    Dim subFolder As Scripting.Folder
    On Error Resume Next
    For Each subFolder In Folder.SubFolders
        If subFolder.Name Like "SW2020" Then
            Debug.Print subFolder.Name, subFolder.Path
            Debug.Print ("got it")
            Set subFolder = Nothing
        exit sub
        End If
        
        doFolder subFolder
    Next subFolder

End Sub

 

Es funktioniert nicht besser, das Ausgangs-Sub bringt es vorerst komplett zum Absturz :/

 

Hallo

Führen Sie den Test ohne die if-Bedingung durch, und sehen Sie sich die Drucke an, die bei jeder Schleife zurückgegeben werden.

Testen Sie auch

Debug.Print subFolder.Name
Debug.Print subFolder.Path
Debug.Print ("got it")

 

Guten Abend allerseits,

Die neueste Version des Codes funktioniert einwandfrei. Bis zu dem Moment, in dem Sie nach einem Ordner suchen, der sich sehr weit im Baum befindet...
Wenn Sie während der Suche auf einen Systemordner stoßen (z. B. Systemvolume-Informationen), gerät die Suchprozedur aus den Fugen: Sie gibt undefinierte Unterordner ohne Namen zurück, gibt aber den Wert "True" zurück, wenn sie auf Übereinstimmung mit dem Suchnamen getestet wird. Daher ein leerer String und ein falsches Ergebnis.
Die Attribute des übergeordneten Systemordners geben keinen bestimmten Status an: Wert 22, d.h. Verzeichnis, versteckt und System, nichts Ungewöhnliches.
Beachten Sie, dass dies die gleichen Attribute wie für das Stammverzeichnis der Festplatte ("D:\") sind, was kein Problem darstellt.

Um die PB zu umgehen, habe ich keine andere Lösung gefunden, als die Anzahl der Unterordner (nb = Folder.SubFolders.Count) vor der Suchschleife zu testen und die Prozedur zu beenden, wenn sie einen Fehler (70) verursacht. Im ursprünglichen Code wird der Fehler durch On Error Resume Next ausgeblendet.

Ich habe auch einen booleschen Wert hinzugefügt, der es Ihnen ermöglicht, die Suche zu stoppen, sobald der Ordner gefunden wurde. Test, der gelöscht werden muss, wenn es mehrere Ordner mit dem gleichen Namen in der Suche geben kann...

Option Explicit

Dim bFindFldr As Boolean

'==============================================================='
Sub FindFolder()
    
            Dim searchFolderName As String
            Dim FileSystem As Scripting.FileSystemObject
    
    searchFolderName = "D:\"
    Set FileSystem = CreateObject("Scripting.FileSystemObject")
    bFindFldr = False
    
    If Not bFindFldr Then doFolder FileSystem.GetFolder(searchFolderName)

    Set FileSystem = Nothing
    Debug.Print ("Fin de la recherche")

End Sub

'==============================================================='
Sub doFolder(Folder As Object)
            Dim subFolder As Scripting.Folder
            Dim nb As Integer

    On Error GoTo erreur
    nb = Folder.SubFolders.Count
    For Each subFolder In Folder.SubFolders
        If Not (subFolder.Attributes And System) Then

            If Not bFindFldr Then                         ' Si le dossier n'a pas encore été trouvé...
                If subFolder.Name Like "ACER" Then
                    Debug.Print subFolder.Name, subFolder.Path
                    Debug.Print ("got it")
                    bFindFldr = True
                End If
                If Not bFindFldr Then doFolder subFolder      ' Poursuite récursive de la recherche si le dossier n'est pas trouvé
            Else
                Debug.Print ("     - Dépilage:   " & subFolder.Path)   ' Permet d'afficher le "dépilage" des fonctions toujours activées après avoir trouvé le dossier
            End If
        End If
    Next subFolder
    Exit Sub
erreur: Debug.Print ("     *** Dossier système ***  " & Folder.Path)
End Sub

Herzliche Grüße.

1 „Gefällt mir“

Hallo m.blt,

 

Vielen Dank für Ihre ausführliche Antwort, es ist sehr interessant! Ich konnte Ihren Code testen und er funktioniert gut auf meinem Laufwerk C.

Ich habe jedoch die gleiche Art von Problem auf dem Server, wenn ich nach einem entfernten Ordner im Baum suche.

Ich denke, das Gedächtnis ist gesättigt...

Vielleicht könnte ich die Suche auf einen bestimmten Ordnertyp beschränken?

Zum Beispiel weiß ich, dass, wenn mein Firmenname AD006 ist, der übergeordnete Ordner der Name des Kunden ist und daher mit A beginnt.

So etwas wie:

Wenn subFolder.Name "A*" mögen, dann

Was denkst du?

Es kann nützlich sein, die Anzahl der Zeichen in der Pfadkette zu überprüfen, um zu wissen, ob die Begrenzung der Pfadlänge der Zeichenfolge das Problem ist oder etwas ganz anderes.

Noch etwas, das man ausprobieren kann; Zulassen, dass Windows längere Pfadlängen verarbeitet:

Wechseln Sie im Registrierungs-Editor zu HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled , ändern Sie den Wert in 1, und starten Sie den Computer neu.

1 „Gefällt mir“

Guten Abend

Das Risiko eines Überlaufs des VBA-Ausführungsstapels ist ein Aspekt, der bei einer rekursiven Prozedur wie dem doFolder des Makros zu berücksichtigen ist.
Wenn ich mich nicht irre, entspricht in diesem Fall der Suche nach einem Ordner auf einer Festplatte die Anzahl der gleichzeitigen Aufrufe höchstens der Anzahl der Ordner des längsten Pfads, der im Verzeichnisbaum vorhanden ist. Das heißt, ein paar Einheiten oder sogar ein paar Dutzend, wahrscheinlich nicht mehr. In jedem Fall ist es unwahrscheinlich, dass es zu einem Überlauf kommt, einem Überlauf, der durch einen Fehler signalisiert wird.

Apropos Fehler: Während der Entwicklung des Makros muss die Anweisung On Error Resume Next gelöscht werden , was zur Folge hat, dass die Fehler ausgeblendet werden, indem die Ausführung stillschweigend in der auf den Fehler folgenden Zeile fortgesetzt wird. Sie können dies in der allerersten Version Ihres Makros überprüfen: Es tritt ein Fehler auf (70: Berechtigung verweigert), und wenn Sie sich die Eigenschaft Folder.path an dieser Stelle ansehen, erhalten Sie den Schuldigen: Informationen zum Systemvolume.

Wenn das Problem auf Ihrem Server von der gleichen Art ist wie auf der Festplatte C:, d.h. einem Ordner, auf den nicht zugegriffen werden kann, können Sie es möglicherweise auf diese einfache Weise identifizieren, indem Sie den Fehler zur Laufzeit auftreten lassen...

Was die Recherche nur über einen Teil des Namens betrifft, so scheint es mir keinen signifikanten Gewinn zu bringen.
Dies könnte eine Verbesserung der Verarbeitungsgeschwindigkeit sein, sobald das Makro in allen Fällen funktionsfähig ist.

Herzliche Grüße.


explorateurdd.png

m.blt, Sylk,

Danke, dass Sie sich die Zeit genommen haben, mir zu helfen.

Herr BLT, das scheint in der Tat logisch. Ich habe die On Error Resume Next-Anweisung  nicht , da ich den Code verwende, den Sie oben gepostet haben.

Leider kann ich den Ordner , der ein Problem verursacht, nicht bekommen, da VBA beim Ausführen auf F:\ vollständig abstürzt, wenn ich die ersten 4 oder 5 Ordner überschreite...

Was die Filterung nach Buchstaben betrifft, eine andere Option: Beschränken Sie die Suche auf den ersten Unterordner?  Ich muss nicht weiter gehen und es würde mich daran hindern, auf Ordner zu stoßen, bei denen die Berechtigung verweigert wurde? Was das F:\Business angeht, das ich suche, habe ich normalerweise alle Rechte.

Sylk, ich werde den Registrierungsschlüssel ändern und es erneut versuchen.

 

Ewan

Herr BLT, nach mehreren Versuchen schaffe ich es endlich, eine Rückmeldung im Terminal zu bekommen! In der Tat gibt es Systemordner oder Ordner, für die ich keine Rechte habe!! Sobald der Code auf einen trifft, stürzt er vollständig ab.

Sylk, der Registrierungsschlüssel war bereits in True!