2010-06-10 2 views

ответ

12

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

для тех, кому интересно, что делает Debug.Print', см. Это: http://stackoverflow.com/questions/2916287/where-does-vba-debug-print-log-to – ecoe

3

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

+0

так велико, сколько раз я знаю запустить его? –

+1

Проверьте длину результата в цикле WHILE или DO. Когда длина равна 0, все готово. – mohnston

2

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

Этот код будет лучше (и заработает +1 от меня), если он использовал позднюю привязку вместо того, чтобы требовать ссылки на FSO. –

+0

@ David-W-Fenton - Я не понимаю, почему поздняя привязка будет лучше, позаботиться о том, чтобы разъяснить? –

+2

Позднее связывание лучше из-за того, что автоматизация FSO может быть заблокирована политикой домена. Позднее привязка * всегда * лучше для любого компонента, который не является частью набора ссылок по умолчанию Access (за очень немногими исключениями). Снижение производительности легко избежать путем кэширования ссылки на него и использования этого вместо повторной инициализации при каждом использовании. –

1

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

Смежные вопросы