VBA'da, belirli bir dizinde belirli bir uzantıya sahip tüm dosyaların listesini nasıl alabilirim? esy uzantılı ilk dosyayı döndürür : ("\ yourPath \ * esy C" vbNormal) i excel 2007Bir dizinde ESY uzantılı tüm dosyaların listesi nasıl alınır?
cevap
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
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.
harika, bu yüzden kaç kez ben biliyorum onu çalıştırmak için? –
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
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:
Bu kod daha iyi olurdu (ve FSB'ye bir başvuru gerektirmek yerine geç bağlama kullandıysa +1 benden). –
@ David-W-Fenton - Geç bağlama neden daha iyi olacağını anlamıyorum, açıklığa kavuşturmak için? –
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. –
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.)
, bakınız: http://stackoverflow.com/questions/2916287/where-does-vba-debug-print-log-to – ecoe