2010-06-10 11 views

Antwort

12

Als Antwort auf Ihren Kommentar "so wie oft weiß ich, um es auszuführen?", dieses Beispiel wird ausgeführt, bis es alle Dateien auflistet, deren Namen strPattern entsprechen. Ändern Sie die Konstante 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

für diejenigen, die neugierig sind, was 'Debug.Print' tut, siehe: http://stackoverflow.com/questions/2916287/where-does-vba-debug-print-log-to – ecoe

3

Dir ("C:. \ Yourpath \ * ESY", vbNormal) die erste Datei Kosten mit esy Erweiterung. Jeder nachfolgende Aufruf von Dir() gibt den nächsten zurück.

+0

groß, so wie oft tun, ich weiß um es zu betreiben? –

+1

Testen Sie die Länge des Ergebnisses in einer WHILE- oder DO-Schleife. Wenn die Länge 0 ist, sind Sie fertig. – mohnston

2

Alternative Option: Verwenden Sie die "Microsoft Scripting Runtime" Bibliothek (überprüfen Sie es in Tools ... Referenzen) für die Filesystemfamilie von Objekten. So etwas wie das Folgende, vielleicht:

+1

Dieser Code wäre besser (und verdienen ein +1 von mir), wenn es eine späte Bindung verwendet, anstatt einen Verweis auf das BFS zu verlangen. –

+0

@ David-W-Fenton - Ich verstehe nicht, warum eine späte Bindung wäre besser, kümmern sich um aufzuklären? –

+2

Späte Bindung ist besser, weil die Automatisierung des FSO durch Domänenrichtlinien blockiert werden kann. Late Binding ist * immer * besser für jede Komponente, die nicht zum Standard-Referenzsatz von Access gehört (mit sehr wenigen Ausnahmen). Der Leistungshit wird leicht vermieden, indem ein Verweis darauf zwischengespeichert und verwendet wird, anstatt ihn jedes Mal neu zu initialisieren, wenn Sie ihn verwenden. –

1

Der folgende Code läuft etwa 19 mal schneller als mit FileSystemObject. Auf meinem Computer dauerte die Suche nach 4000 Dateien in drei verschiedenen Datenbanken 1,57 Sekunden mit FileSystemObject, aber nur 0,08 Sekunden mit diesem Code.

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 

Verwendungsbeispiel:

Debug.Print CountFilesWithGivenExtension("C:\", ".ex*") 

(Die "DoEvents" ist nicht notwendig, aber können Sie Pause verwenden/Pause, wenn nötig.)

Verwandte Themen