В VBA, как мне получить список всех файлов с определенным расширением в определенном каталоге?Как получить список всех файлов с расширением ESY в каталоге?
я неспособен сделать Application.FileSearch
, потому что я использую Excel 2007
В VBA, как мне получить список всех файлов с определенным расширением в определенном каталоге?Как получить список всех файлов с расширением ESY в каталоге?
я неспособен сделать Application.FileSearch
, потому что я использую Excel 2007
В ответ на ваш комментарий «так сколько раз я знаю, чтобы запустить его?», этот пример запускается до тех пор, пока в нем не будут указаны все файлы, имена которых соответствуют strPattern. Измените константу strFolder.
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) Возвращает первый файл с расширением Esy. Каждый последующий вызов Dir() возвращает следующий.
так велико, сколько раз я знаю запустить его? –
Проверьте длину результата в цикле WHILE или DO. Когда длина равна 0, все готово. – mohnston
Альтернативный вариант: использовать библиотеку "Microsoft Scripting Runtime" (проверить в Инструментах ... Ссылки) для семьи FileSystemObject объектов. Что-то вроде следующего, возможно:
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
Этот код будет лучше (и заработает +1 от меня), если он использовал позднюю привязку вместо того, чтобы требовать ссылки на FSO. –
@ David-W-Fenton - Я не понимаю, почему поздняя привязка будет лучше, позаботиться о том, чтобы разъяснить? –
Позднее связывание лучше из-за того, что автоматизация FSO может быть заблокирована политикой домена. Позднее привязка * всегда * лучше для любого компонента, который не является частью набора ссылок по умолчанию Access (за очень немногими исключениями). Снижение производительности легко избежать путем кэширования ссылки на него и использования этого вместо повторной инициализации при каждом использовании. –
Следующий код работает примерно в 19 раз быстрее, чем при использовании FileSystemObject. На моей машине поиск 4000 файлов в трех разных точках занимал 1,57 секунды, используя FileSystemObject, но только 0,08 секунды, используя этот код.
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
Пример использования:
Debug.Print CountFilesWithGivenExtension("C:\", ".ex*")
(The "DoEvents" не является необходимым, но позволяет использовать Pause/Break, если это необходимо.)
для тех, кому интересно, что делает Debug.Print', см. Это: http://stackoverflow.com/questions/2916287/where-does-vba-debug-print-log-to – ecoe