W VBA, jak mogę uzyskać listę wszystkich plików o określonym rozszerzeniu w określonym katalogu?Jak uzyskać listę wszystkich plików z rozszerzeniem ESY w katalogu?
jestem w stanie zrobić Application.FileSearch
, ponieważ używam Excel 2007
W VBA, jak mogę uzyskać listę wszystkich plików o określonym rozszerzeniu w określonym katalogu?Jak uzyskać listę wszystkich plików z rozszerzeniem ESY w katalogu?
jestem w stanie zrobić Application.FileSearch
, ponieważ używam Excel 2007
W odpowiedzi na Twój komentarz ", ile razy mam wiedzieć, aby go uruchomić?", ten przykład działa, dopóki nie wyświetli wszystkich plików o nazwach zgodnych z strPattern. Zmień stałą strFolder str..
Public Sub ListESY()
Const strFolder As String = "C:\SomeFolder\"
Const strPattern As String = "*.ESY"
Dim strFile As String
strFile = Dir(strFolder & strPattern, vbNormal)
Do While Len(strFile) > 0
Debug.Print strFile '<- view this in Immediate window; Ctrl+g will take you there
strFile = Dir
Loop
End Sub
Dir ("C:. \ YourPath \ * esy", vbNormal) Zwraca pierwszy plik z rozszerzeniem esy. Każde kolejne wywołanie funkcji Dir() zwraca następną.
wielki, więc ile razy mam wiedzieć uruchomić? –
Sprawdź długość wyniku w pętli WHILE lub DO. Gdy długość wynosi 0, oznacza to, że skończyłeś. – mohnston
opcja alternatywna: użyć "Microsoft Scripting Runtime" biblioteki (sprawdzić w Narzędzia ... referencje) dla rodziny FileSystemObject obiektów. Coś jak poniżej: być może:
Public Function ESYFileCount(dir_path as String) as Long
Dim fil As File
With New FileSystemObject
With .GetFolder(dir_path)
For Each fil In .Files
If LCase(Right(fil.Name, 4)) = ".esy" Then
ESYFileCount = ESYFileCount + 1
End If
Next
End With
End With
End Function
Ten kod byłby lepszy (i zarobić +1 ode mnie), jeśli używał późnego wiązania zamiast wymagać odniesienia do FSO. –
@ David-W-Fenton - Nie rozumiem, dlaczego późniejsze wiązanie byłoby lepsze, staraj się wyjaśnić? –
Późne wiązanie jest lepsze ze względu na to, że automatyzacja FSO może być blokowana przez zasady domeny. Późne wiązanie * zawsze * jest lepsze dla dowolnego komponentu, który nie jest częścią domyślnego zestawu referencji Access (z kilkoma wyjątkami). Uderzenia wydajności można łatwo uniknąć, buforując odniesienie do niego i używając go zamiast go ponownie inicjować za każdym razem, gdy go używasz. –
Poniższy kod działa około 19 razy szybciej niż przy użyciu FileSystemObject. Na moim komputerze znalezienie 4000 plików w trzech różnych drektoriach zajęło 1,57 sekundy przy użyciu FileSystemObject, ale tylko 0,08 sekundy przy użyciu tego kodu.
Public Function CountFilesWithGivenExtension(_
i_strFolderWithTerminalBackslant As String, _
i_strExtensionIncludingPeriod As String _
) As Long
If Len(Dir$(i_strFolderWithTerminalBackslant & "*" _
& i_strExtensionIncludingPeriod)) > 0 Then
CountFilesWithGivenExtension = 1
While Len(Dir$) > 0
CountFilesWithGivenExtension = _
CountFilesWithGivenExtension + 1
DoEvents
Wend
Else
CountFilesWithGivenExtension = 0
End If
End Function
wykorzystanie próbki:
Debug.Print CountFilesWithGivenExtension("C:\", ".ex*")
(dalej "DoEvents" nie jest konieczne, ale pozwala na użycie Pauza/Przerwa w razie potrzeby).
dla ciekawych czym jest 'Debug.Print', zobacz: http://stackoverflow.com/questions/2916287/where-does-vba-debug-print-log-to – ecoe