2010-06-10 42 views

Trả lời

12

Để trả lời nhận xét của bạn "vậy tôi đã biết bao nhiêu lần để chạy nó?", ví dụ này chạy cho đến khi danh sách tất cả các tệp có tên khớp với strPattern. Thay đổi hằng số 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

cho những người tò mò những gì 'Debug.Print' nào, hãy xem điều này: http://stackoverflow.com/questions/2916287/where-does-vba-debug-print-log-to – ecoe

3

Dir ("C:. \ YourPath \ * ESY", vbNormal) Trả về tập đầu tiên với phần mở rộng ESY. Mỗi lần gọi tiếp theo đến Dir() sẽ trả về lần tiếp theo.

+0

lớn, vì vậy bao nhiêu lần làm tôi biết để chạy nó? –

+1

Kiểm tra độ dài của kết quả trong vòng lặp WHILE hoặc DO. Khi chiều dài bằng 0, bạn đã hoàn tất. – mohnston

2

Tùy chọn thay thế: sử dụng thư viện "Microsoft Scripting Runtime" (kiểm tra trong Công cụ ... Tham khảo) cho họ đối tượng FileSystemObject. Một cái gì đó như sau, có lẽ:

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

Mã này sẽ tốt hơn (và kiếm được 1 từ tôi) nếu nó được sử dụng cuối ràng buộc thay vì đòi hỏi một tham chiếu đến FSO. –

+0

@ David-W-Fenton - Tôi không hiểu tại sao việc ràng buộc trễ sẽ tốt hơn, quan tâm để làm sáng tỏ? –

+2

Kết buộc trễ là tốt hơn vì thực tế là tự động hóa FSO có thể bị chặn bởi chính sách miền. Ràng buộc trễ là * luôn luôn * tốt hơn cho bất kỳ thành phần nào không phải là một phần của bộ truy cập tham chiếu mặc định (với rất ít ngoại lệ). Hiệu suất hit dễ dàng tránh được bằng cách lưu vào bộ nhớ đệm một tham chiếu đến nó, và sử dụng nó thay vì khởi tạo lại nó mỗi khi bạn sử dụng nó. –

1

Mã sau chạy nhanh hơn khoảng 19 lần so với sử dụng FileSystemObject. Trên máy tính của tôi, việc tìm kiếm 4000 tệp trong ba drectories khác nhau mất 1,57 giây bằng FileSystemObject, nhưng chỉ 0,08 giây sử dụng mã này.

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 

mẫu sử dụng:

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

(Các "DoEvents" là không cần thiết, nhưng cho phép bạn sử dụng Pause/Break nếu cần thiết.)

Các vấn đề liên quan