Avatar billede mrkr Juniormester
27. november 2009 - 16:43 Der er 7 kommentarer og
1 løsning

Lave en liste over alle excel filer over 500 kb

Jeg har brug for en kodestump der kan hjælpe mig med at finde alle excel filer i en bestemt mappe der er større end 500 kb

Jeg har mappen c:\dokumenter\ som har en hulens masse undermapper.

Det vil være super hvis koden render hele min mappe igennem og lister dem op, med følgende oplysninger:

Kolonne A: Filnavn på den enkelte fil
Kolonne B: Dato på hvornår den er rettet
Kolonne C: Navn på den "nederste" mappe filen ligger i. Feks 110 - Jensen
Kolonne D: Navn på den komplette sti filen ligger i. Feks c:\dokumenter\100-199\110 - Jensen

Hvis det kan lade sig gøre at indsætte et "hyperlink" til den enkelte fil i en af kolonnerne, så man kan åbne filen ved at dobbeltklikke vil det være helt perfekt, men ikke en nødvendighed.
Avatar billede tjacob Juniormester
27. november 2009 - 17:47 #1
Her er et bud:

Jeg har lavet det med parametre, så du kan ændre både mappen, og størrelse og filtyper.
Disse funktioner kræver at man kan bruge FileSystemObject.
Så i Visual Basic skal du gå ind i Tools>References... og sikre dig at "Microsoft Scripting Runtime" er vinget af.

Jeg har indsat hyperlinks i kolonne E.
Du skal køre makroen "FindFiler"

Sub FindFiler()

    Dim FilTyper() As String
    FilTyper = Split("xls,xlsx,xlsm,xltx,xltm,xlt,csv,xla,xlam", ",", , vbTextCompare)
    Call ListFiler("c:\dokumenter\", 500, FilTyper)

End Sub

Private Sub ListFiler(ByVal sDir As String, ByVal KBSize As Long, ByRef FilTyper() As String)

    Dim ByteSize As Long
    ByteSize = KBSize * 1024
    Dim FSO As New FileSystemObject
    Dim TopFolderObj As Folder
    Dim pRange As Range
    Set pRange = Range("A1")
    Set TopFolderObj = FSO.GetFolder(sDir)
    Set pRange = Range("A1")
    Call HentFiler(TopFolderObj, ByteSize, pRange, FilTyper)

End Sub

Private Sub HentFiler(ByVal OfFolder As Folder, ByVal fSize As Long, _
    ByRef dstRange As Range, ByRef FTypes() As String)

    Dim SubFolder As Folder, sFile As File
    Dim i As Long, j As Long, sTmp As String
    For Each sFile In OfFolder.Files
        j = InStrRev(sFile.Name, ".", , vbTextCompare)
        sTmp = Right(sFile.Name, Len(sFile.Name) - j)
        For i = 0 To UBound(FTypes)
            If sTmp = FTypes(i) Then Exit For
        Next i
        If i < UBound(FTypes) + 1 Then
            If sFile.Size >= fSize Then
                dstRange.Value = sFile.Name
                Set dstRange = dstRange.Offset(0, 1)
                dstRange.Value = sFile.DateLastModified
                Set dstRange = dstRange.Offset(0, 1)
                j = InStrRev(sFile.ParentFolder, "\", , vbTextCompare)
                sTmp = Right(sFile.ParentFolder, Len(sFile.ParentFolder) - j)
                dstRange.Value = sTmp
                Set dstRange = dstRange.Offset(0, 1)
                dstRange.Value = sFile.Path
                Set dstRange = dstRange.Offset(0, 1)
                dstRange.Value = sFile.Path
                dstRange.Select
                ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:= _
                sFile.Path, TextToDisplay:="Åben fil"
                Set dstRange = dstRange.Offset(1, -4)
            End If
        End If
    Next sFile
    For Each SubFolder In OfFolder.SubFolders
        Call HentFiler(SubFolder, fSize, dstRange, FTypes)
    Next SubFolder

End Sub
Avatar billede tjacob Juniormester
27. november 2009 - 18:11 #2
Har du sat kryds i "Microsoft Scripting Runtime" i Tools>References...?
Avatar billede mrkr Juniormester
27. november 2009 - 18:00 #3
Den melder fejl i denne linje:

Private Sub HentFiler(ByVal OfFolder As Folder, ByVal fSize As Long, ByRef dstRange As Range, ByRef FTypes() As String)

Fejl:
user-defined type not defined
Avatar billede mrkr Juniormester
27. november 2009 - 19:40 #4
Efter jeg fik sat kryds i ....Scripting Runtime" i Tools>References..... virkede det.

Den virker som jeg ønskede, men da den skal løbe igennem mange mapper tager det også en rum tid for koden at blive afviklet.

Kan det lade sig gøre at få noget tekst skrevet i statuslinjen
Jeg tænkte på noget ala.... 
Application.StatusBar = "Navn på den mappe den undersøger"

På den måde kan man se hvor langt den er kommet i søgningen og derved ikke være nervøs for om excel er gået "kold"
Avatar billede tjacob Juniormester
28. november 2009 - 10:48 #5
Ja, det kan godt laves, og desuden har jeg slået skærmopdatering fra, hvilket vil speede processen op. Desuden har jeg indsat en DoEvents, så din PC ikke fryser i denne proces.

Der er ændret i FindFiler og HentFiler:

Sub FindFiler()

    Application.ScreenUpdating = False
    Dim FilTyper() As String
    FilTyper = Split("xls,xlsx,xlsm,xltx,xltm,xlt,csv,xla,xlam", ",", , vbTextCompare)
    Call ListFiler("c:\dokumenter\", 500, FilTyper)
    Application.StatusBar = "Færdig"
    Application.ScreenUpdating = True

End Sub

Private Sub ListFiler(ByVal sDir As String, ByVal KBSize As Long, ByRef FilTyper() As String)

    Dim ByteSize As Long
    ByteSize = KBSize * 1024
    Dim FSO As New FileSystemObject
    Dim TopFolderObj As Folder
    Dim pRange As Range
    Set pRange = Range("A1")
    Set TopFolderObj = FSO.GetFolder(sDir)
    Set pRange = Range("A1")
    Call HentFiler(TopFolderObj, ByteSize, pRange, FilTyper)

End Sub

Private Sub HentFiler(ByVal OfFolder As Folder, ByVal fSize As Long, _
    ByRef dstRange As Range, ByRef FTypes() As String)

    DoEvents
    Application.StatusBar = "Henter: " & OfFolder.Name
    Dim SubFolder As Folder, sFile As File
    Dim i As Long, j As Long, sTmp As String
    For Each sFile In OfFolder.Files
        j = InStrRev(sFile.Name, ".", , vbTextCompare)
        sTmp = Right(sFile.Name, Len(sFile.Name) - j)
        For i = 0 To UBound(FTypes)
            If sTmp = FTypes(i) Then Exit For
        Next i
        If i < UBound(FTypes) + 1 Then
            If sFile.Size >= fSize Then
                dstRange.Value = sFile.Name
                Set dstRange = dstRange.Offset(0, 1)
                dstRange.Value = sFile.DateLastModified
                Set dstRange = dstRange.Offset(0, 1)
                j = InStrRev(sFile.ParentFolder, "\", , vbTextCompare)
                sTmp = Right(sFile.ParentFolder, Len(sFile.ParentFolder) - j)
                dstRange.Value = sTmp
                Set dstRange = dstRange.Offset(0, 1)
                dstRange.Value = sFile.Path
                Set dstRange = dstRange.Offset(0, 1)
                dstRange.Value = sFile.Path
                dstRange.Select
                ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:= _
                sFile.Path, TextToDisplay:="Åben fil"
                Set dstRange = dstRange.Offset(1, -4)
            End If
        End If
    Next sFile
    For Each SubFolder In OfFolder.SubFolders
        Call HentFiler(SubFolder, fSize, dstRange, FTypes)
    Next SubFolder

End Sub
Avatar billede mrkr Juniormester
28. november 2009 - 15:24 #6
Hey

Det er super.
Der erdog lige en lille rettelse.
I kolonne D lister den Hele stien op incl. filnavnet.
Den skal helst "kun" liste stien op UDEN filnavn.

Det giver nemlig et bedre overblik, når jeg skal se hvor filen ligger.

Jeg har også en anden udfordring på søgning af filer i min mappestruktur.
Jeg har 3 forskellige excel slags excel mapper som har et indhold i cellen sheets("stam").range("type")

Hvis jeg opretter et nyt spørgsmål, vil du så hjælpe med det også. :-)
Avatar billede tjacob Juniormester
29. november 2009 - 13:36 #7
Det er meget nemt at rette:

I sub HentFiler rettes en linie:

dstRange.Value = sFile.Path  << Hvor den nævnes FØRSTE gang

rettes til:

dstRange.Value = sFile.ParentFolder

Og jeg hjælper selvfølgelig gerne med yderligere spørgsmål.....
Avatar billede mrkr Juniormester
29. november 2009 - 14:17 #8
Så var den den der.
Mange tak for hjælpen :-)
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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