Avatar billede fajens Mester
23. september 2014 - 19:18 Der er 5 kommentarer og
2 løsninger

Finde folder i under folder

Hej
Hvem kan hjælpe med dette problem,(for mig)

Jeg har et bibliotek med mange foldere, der igen indeholder mange foldere som igen indeholder foldere.

Jeg vil gerne kunne lave en VBA code der finder en bestemt folder i denne struktur.
For eksempel findes denne folder H:\top\test2\test3\test3\dennefolder
hvor jeg starter søgningen i folderen 'top' og skal finde 'dennefolder'.
Det drejer sig om jeg skal søge igennem alle foldere i H:\top og når den finder den ønskede folder skal den vis stien til folderen.

Jeg kan lave koden så den søger igennem H:\top men kan ikke finde ud af at komme igennem alle folderen.

/fajens
Avatar billede terry Ekspert
23. september 2014 - 19:33 #1
Avatar billede bvirk Guru
23. september 2014 - 23:24 #2
Hvis du blot skal afgøre om  "H:\top\test2\test3\test3\dennefolder" eksisterer, er det givet ved udtrykket:
  Len(Dir("H:\top\test2\test3\test3\dennefolder", vbDirectory)) > 0

Men ellers ...

Måden at arbejde sig gennem en mappestruktur vha dir(), er en mappe af gangen - det er nødvendigt pga dir() virkemåde med at finde næste indtil der ikke er flere i mappen.
Følgende funktion: tree(...) returnere mappenavne som et array af strings.
Den skal kaldes med backslash afsluttet mappenavn - f.eks

mapper = tree("h:\top\")

Det besvarer ikke dit spørgsmål - hvordan findes en mappe med et bestemt navn - men er til inspiration om hvordan man kan grave sig gennem undermapper.


Function tree(dirNameSlash)
    Dim dirName, subDir, treeCopy
    dirName = dirN(dirNameSlash, True)
    While Len(dirName)
        addS2list tree, dirNameSlash & dirName
        dirName = dirN(dirNameSlash): Wend
    If Not IsEmpty(tree) Then
        treeCopy = tree
        For Each dirName In treeCopy
            subDir = tree(dirName & "\")
            If Not IsEmpty(subDir) Then addS2list tree, subDir
        Next: End If
End Function


'Hjælpefunktioner:

Function dirN(containedInS, Optional isFirst = False)
    If isFirst Then
        dirN = Dir(containedInS, vbDirectory)
    Else
        dirN = Dir(): End If
    While (Len(dirN) > 0) And (((GetAttr(containedInS & dirN) And vbDirectory) = 0) Or dirN = "." Or dirN = "..")
        dirN = Dir()
    Wend
End Function

Sub addS2list(V, i)
    Dim ai
    On Error Resume Next
    If IsArray(i) Then
        For Each ai In i
            addS2list V, ai: Next
    Else
        ReDim Preserve V(UBound(V) + 1)
        If err.Number = 13 Then ReDim V(0)
        If IsObject(i) Then Set V(UBound(V)) = i Else V(UBound(V)) = i
    End If
End Sub
Avatar billede fajens Mester
25. september 2014 - 08:44 #3
Hej

Tak for din løsning, men den går ikke ned gennem alle alle lag.
Den tager kun foldere i top.

/fajens
Avatar billede fajens Mester
25. september 2014 - 08:47 #4
Hej terry

Tak for dit link, det er noget jeg kan bruge, det virker efter lidt ændringer til mit brug.

Smid et svar så du kan få point.
Avatar billede fajens Mester
25. september 2014 - 08:48 #5
Hej bvirk

Smid et svar så du også kan få point for din løsning som kan være lærerig for mig.

/fajens
Avatar billede bvirk Guru
25. september 2014 - 11:25 #6
Hermed et svar
Avatar billede terry Ekspert
25. september 2014 - 18:37 #7
Tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester