Kan een mapnaam en het bijbehorende pad niet weergeven in VBA

Hallo

Ik probeer het "pad" van een map van een bepaalde naam te vinden om dingen in ons ontwerpbureau te automatiseren met solidworks.

Ik geef aan dat ik alleen de naam van het bestand heb en niet het pad. 

het zou er ongeveer zo uit moeten zien: F:\Business\??? \Mapnaam\...

Alleen op dit moment kan ik erachter komen of het bestaat, maar niet om zijn pad te hervinden , dat ik nodig heb voor de toekomst. Ik heb alleen de "begrepen" feedback in de console

Heb je ideeën?

Hier is mijn code:

Sub FindFolder()

    Dim searchFolderName As String
    searchFolderName = "F:\Deals"

    Dim FileSystem als object

    Set FileSystem = CreateObject("Scripting.FileSystemObject")

    doFolder FileSystem.GetFolder(searchFolderName)

 

Einde Sub

Sub doFolder(Map)
    Submap dimmen
    Bij fout Hervatten Volgende
    Voor elke submap in map.Submappen
        Als subFolder.Name "FolderName" leuk vindt, dan
            Debug.Print subFolder.Name, subFolder.GetPath
            Debug.Print ("begrepen")
        Einde
        Einde als
        
        doMap subMap
    Volgende submap

Einde Sub

Bedankt en een fijne dag verder!

 

Ewan

 

Hallo

Aan de ene kant moet je de subFolder variabele correct declareren:

Dim subFolder As Scripting.Folder

En dan is de manier om toegang te krijgen tot het pad niet GetPath maar Path:

Debug.Print subFolder.Name & subFolder.Path

 

Hallo Cyril,

 

Bedankt voor je antwoord, ik heb zojuist de code bijgewerkt... Het lijkt inderdaad logischer!

Maar het resultaat blijft helaas hetzelfde...

 

 

Zijn Microsoft Scripting Runtime-referenties ingeschakeld?

Deze code werkt heel goed voor mij:

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

Het geheel is gevoelig voor breuk, dus wees voorzichtig. Als het toch door Got It gaat, is dat omdat de If werkt, dus de fout is ergens anders.

Ja, Microsoft Scripting Runtime-referenties zijn ingeschakeld.

Ik heb net een test gedaan om te proberen het pad van de "test" -map te gaan die ik heb gemaakt onder "C:\folder\test"

Dus ik heb:

 

searchFolderName = "C:\"

en 

Als subFolder.Name van "testen" houdt, dan

 

Ik heb het alleen uit de console "gehaald", niet de naam, noch het pad

Ik heb gelet op de breuk zoals je aangeeft

 

 

Uiteraard werkt het op sommige bestanden, maar niet op alle... terwijl ze allemaal in dezelfde bovenliggende map staan en ik de inspringing respecteer

Eerlijk gezegd grappenmaker, ik zie niet in wat het probleem is. Werkt prima thuis

Het is gek dit verhaal...

Het werkt bijvoorbeeld op F:\Business\ADIDAS, maar niet op F:\Business\ADOPT

 

Misschien de volgorde die problemen veroorzaakt.

U moet nadenken over het legen van het geheugen bij het gebruik van dit soort functies. Ik probeer een Set FileSystem = niets:Set SubFolder = Niets  net voor het einde dat onder "Got It" staat

Het Set FileSystem = Niets spreekt hem duidelijk niet aan.

Ik heb de  SubMap instellen = Niets , het verandert niets

 

 

Cyril

Het lijkt erop dat je gelijk had wel, als ik de code voor de eerste mappen uit te voeren, werkt het perfect. Maar niet voor de volgende... Het moet gezegd worden dat de server is geladen.

Probeer misschien een exit sub in plaats van End. Zet vervolgens de Set FileSystem = Nothing in de hoofdprocedure in principe:

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

 

Het werkt niet beter, de exit sub crasht het voorlopig volledig :/

 

Hallo

Voer de test uit zonder de if-voorwaarde en zie de afdrukken die bij elke lus worden geretourneerd.

Test ook

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

 

Goedenavond allemaal,

De laatste versie van de code werkt prima. Tot het moment dat je op zoek gaat naar een map die heel ver in de boom staat...
Als u tijdens het zoeken een systeemmap tegenkomt (zoals System Volume Information), ontspoort de zoekprocedure: het retourneert niet-gedefinieerde submappen zonder namen, maar retourneert een waarde van "True" wanneer wordt getest op naleving van de zoeknaam. Vandaar een lege string en een vals resultaat.
De attributen van de bovenliggende systeemmap geven geen bepaalde status aan: waarde van 22, d.w.z. directory, verborgen en systeem, niets ongewoons.
Merk op dat dit dezelfde attributen zijn als voor de root van de schijf ("D:\"), wat geen probleem is.

Om de pb te omzeilen, vond ik geen andere oplossing dan het aantal submappen (nb = Folder.SubFolders.Count) te testen vóór de zoeklus, en de procedure te verlaten als het een fout veroorzaakt (70). In de originele code verbergt On Error Resume Next de fout.

Ik heb ook een boolean toegevoegd waarmee je het zoeken kunt stoppen zodra de map is gevonden. Test die moet worden verwijderd als er meerdere mappen met dezelfde naam in de zoekopdracht kunnen staan...

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

Vriendelijke groeten.

1 like

Hallo m.blt,

 

Bedankt voor je gedetailleerde antwoord, het is erg interessant! Ik heb je code kunnen testen en het werkt prima op mijn C-schijf.

Ik heb echter hetzelfde soort probleem op de server als ik op zoek ben naar een verre map in de boomstructuur.

Ik denk dat het geheugen verzadigt...

Misschien kan ik het zoeken in een bepaald type map beperken?

Ik weet bijvoorbeeld dat als mijn bedrijfsnaam AD006 is, de bovenliggende map de naam van de klant is en dus met A begint.

Zoiets als:

Als subFolder.Name "A*" leuk vindt, dan

Wat denk je?

Het kan handig zijn om het aantal tekens in de padketen te controleren, gewoon om te weten of het de limiet voor de lengte van het tekenreekspad is die het probleem is of iets heel anders.

Nog iets om te proberen; Sta Windows toe om langere padlengtes te verwerken:

Ga in de register-editor naar HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem\LongPathsEnabled, verander de waarde in 1 en start opnieuw op.

1 like

Goedenavond

Het risico van een overloop van de VBA-uitvoeringsstack is een aspect waarmee rekening moet worden gehouden in het geval van een recursieve procedure zoals de doFolder van de macro.
Als ik me niet vergis, is in dit geval van het zoeken naar een map op een schijf het aantal gelijktijdige aanroepen hoogstens gelijk aan het aantal mappen van het langste pad dat in de mappenstructuur bestaat. Dat wil zeggen een paar eenheden, of zelfs een paar tientallen, waarschijnlijk niet meer. In ieder geval is het niet waarschijnlijk dat het een overloop veroorzaakt, een overloop die zou worden gesignaleerd door een fout.

Over fouten gesproken: tijdens de ontwikkeling van de macro moet de On Error Resume Next-instructie worden verwijderd , wat tot gevolg heeft dat de fouten worden verborgen door de uitvoering geruisloos voort te zetten op de regel die volgt op de fout. U kunt dit controleren op de allereerste versie van uw macro: er treedt een fout op (70: toestemming geweigerd), en als u op dit moment naar de eigenschap Folder.path kijkt, krijgt u de boosdoener: System Volume Information.

Als het probleem op uw server van dezelfde aard is als op de C:-schijf, d.w.z. een map die niet toegankelijk is, kan het zijn dat u op deze eenvoudige manier het kunt identificeren, door de fout tijdens runtime te laten optreden...

Wat betreft het doen van onderzoek naar slechts een deel van de naam, het lijkt mij geen significante winst op te leveren.
Dit kan een verbetering van de verwerkingssnelheid zijn, zodra de macro in alle gevallen functioneel is.

Vriendelijke groeten.


explorateurdd.png

m.blt, Sylk,

Bedankt dat je de tijd hebt genomen om me te helpen.

Meneer BLT, het lijkt inderdaad logisch. Ik heb de On Error Resume Next-verklaring  niet omdat ik de code gebruik die je hierboven hebt gepost.

Helaas kan ik de map die een probleem veroorzaakt niet krijgen omdat VBA volledig crasht wanneer het op F:\ draait wanneer ik de eerste 4 of 5 mappen overschrijd...

Wat betreft het filteren op letter, een andere optie: beperk het zoeken tot de eerste submap?  Ik hoef niet verder te gaan en het zou voorkomen dat ik mappen tegenkom met toestemming geweigerd? Wat betreft de F:\Business waar ik naar op zoek ben, normaal gesproken heb ik alle rechten.

Sylk, ik ga de registersleutel wijzigen en het opnieuw proberen.

 

Ewan

Meneer BLT, na verschillende pogingen lukt het me eindelijk om feedback te krijgen in de terminal! Er zijn inderdaad systeemmappen of mappen waarvoor ik de rechten niet heb!! Zodra de code er een tegenkomt, crasht deze volledig.

Sylk, de registersleutel was al in True!