Как получить список всех файлов с расширением ESY в каталоге? - PullRequest
13 голосов
/ 10 июня 2010

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

Я не могу сделать Application.FileSearch, потому что я использую Excel 2007

Ответы [ 4 ]

12 голосов
/ 10 июня 2010

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

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

2 голосов
/ 11 марта 2014

Следующий код работает примерно в 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*")

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

2 голосов
/ 11 июня 2010

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