2010-06-10 12 views

Odpowiedz

12

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 
+0

dla ciekawych czym jest 'Debug.Print', zobacz: http://stackoverflow.com/questions/2916287/where-does-vba-debug-print-log-to – ecoe

3

Dir ("C:. \ YourPath \ * esy", vbNormal) Zwraca pierwszy plik z rozszerzeniem esy. Każde kolejne wywołanie funkcji Dir() zwraca następną.

+0

wielki, więc ile razy mam wiedzieć uruchomić? –

+1

Sprawdź długość wyniku w pętli WHILE lub DO. Gdy długość wynosi 0, oznacza to, że skończyłeś. – mohnston

2

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 
+1

Ten kod byłby lepszy (i zarobić +1 ode mnie), jeśli używał późnego wiązania zamiast wymagać odniesienia do FSO. –

+0

@ David-W-Fenton - Nie rozumiem, dlaczego późniejsze wiązanie byłoby lepsze, staraj się wyjaśnić? –

+2

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. –

1

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).