Как получить список всех файлов с расширением ESY в каталоге?

В VBA, как мне получить список всех файлов с определенным расширением в определенном каталоге?

Я не могу выполнить Application.FileSearch, потому что я использую excel 2007

Ответы

Ответ 1

В ответ на ваш комментарий "так сколько раз я знаю, чтобы запустить его?", этот пример запускается до тех пор, пока он не отобразит все файлы, имена которых соответствуют 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

Ответ 2

Dir ( "C:\yourPath\*. ESY", vbNormal) Возвращает первый файл с расширением esy. Каждый последующий вызов Dir() возвращает следующий.

Ответ 3

Альтернативный вариант: используйте библиотеку 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

Ответ 4

Следующий код работает примерно в 19 раз быстрее, чем при использовании FileSystemObject. На моей машине поиск 4000 файлов в трех разных drectories занял 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*")

( "DoEvents" не требуется, но позволяет использовать Pause/Break, если это необходимо.)