2010-06-10 13 views

cevap

12

Yoruma cevaben "kaç kere kaçacağını biliyorum?", bu örnek, adları strPattern ile eşleşen tüm dosyaları listeleyene kadar çalışır. strFolder sabitini değiştirin.

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

, bakınız: http://stackoverflow.com/questions/2916287/where-does-vba-debug-print-log-to – ecoe

3

Dir kullanıyorum çünkü

i Application.FileSearch yapamadığını duyuyorum. Her bir sonraki Dir() çağrısı sonraki çağrıyı döndürür.

+0

harika, bu yüzden kaç kez ben biliyorum onu çalıştırmak için? –

+1

Sonuç uzunluğunu bir WHILE veya DO döngüsünde sınayın. Uzunluk 0 olduğunda bitirdiniz. Debug.Print'in ne yaptığını merak edenler için – mohnston

2

Alternatif seçenek: Nesnelerin FileSystemObject ailesi için "Microsoft Scripting çalışma zamanı" kitaplığı (Araçlar kontrol ... Kaynaklar) kullanın. Aşağıdaki gibi bir şey olabilir:

+1

Bu kod daha iyi olurdu (ve FSB'ye bir başvuru gerektirmek yerine geç bağlama kullandıysa +1 benden). –

+0

@ David-W-Fenton - Geç bağlama neden daha iyi olacağını anlamıyorum, açıklığa kavuşturmak için? –

+2

Geç bağlama, FSO'nun otomasyonunun etki alanı ilkeleri tarafından engellenebilmesi nedeniyle daha iyidir. Geç bağlama, * her zaman * varsayılan Access set referansının parçası olmayan herhangi bir bileşen için daha iyidir (çok az istisna hariç). Performans isabeti, bir referansı önbelleğe alarak ve bunu her kullandığınızda yeniden başlatmak yerine bunu kullanarak kolayca önlenebilir. –

1

Aşağıdaki kod, FileSystemObject öğesini kullanmaktan yaklaşık 19 kat daha hızlı çalışır. Makinemde, üç farklı dilde 4000 dosya bulmak FileSystemObject kullanarak 1,57 saniye sürdü, ancak bu kodu kullanarak sadece 0.08 saniye sürdü.

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 

Örnek kullanım:

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

("DoEvents" gerekli değildir, ancak gerekirse kırın/Pause kullanmasını sağlar.)