23. september 2014 - 19:18Der 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.
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
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.