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
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.
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
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.
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
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
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.
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.
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.
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!