Làm việc với tập tin và thư mục - Work with files and folders

Liên hệ QC

levanduyet

Hãy để gió cuốn đi.
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,798
Được thích
4,699
Giới tính
Nam
Đếm số tập tin trong một thư mục - Count Files (with a specific extension or not) in a folder dùng Scripting.FileSystemObject

Chúng ta gặp rất nhiều câu hỏi dạng như:
  • Làm sao liệt kê các tập tin trong một thư mục.
  • Làm sao tổng hợp các dữ liệu của các tập tin (cùng một định dạng) trong một thư mục.

Ví dụ này đã được kiểm tra với phiên bản Excel 2007. Do việc sử dụng hàm InStrRev nên hàm sau sẽ không được áp dụng cho Excel 97 (nhưng bây giờ tôi nghĩ chẳng ai dùng Excel 97 nhỉ)

Mã:
Private Function [COLOR="Red"][B]CountFiles[/B][/COLOR](strDirectory As String, Optional strExt As String = "*.*") As Double
'Tác giả          : Ken Puls (www.excelguru.ca)
'Mục đích        : để đếm số tập tin trong một thư mục. Nếu có cung cấp phần mở rộng của tập tin 
'                       thì hàm chỉ đếm những tập tin có phần mở rộng này thôi.

    Dim objFso As Object
    Dim objFiles As Object
    Dim objFile As Object

    'Set Error Handling
    On Error GoTo EarlyExit

    'Tạo đối tượng [COLOR="Blue"]Scripting.FileSystemObject[/COLOR]
    Set objFso = CreateObject("Scripting.FileSystemObject")
    Set objFiles = objFso.GetFolder(strDirectory).Files

    'Đếm các tập tin có thành phần mở rộng được cung cấp
    'Nếu không cung cấp thì xem như đếm tất cả các tập tin.
    If strExt = "*.*" Then
        CountFiles = objFiles.Count
    Else
        For Each objFile In objFiles
       [COLOR="Blue"] ' Sau này từ đây ta có thể xử lý các tập tin
        ' theo ý mình từ đây. 
        ' Ví dụ như ta kiểm tra tên tập tin, rồi lấy nội dung tập tin...vv...[/COLOR]
            If UCase(Right(objFile.Path, (Len(objFile.Path) - InStrRev(objFile.Path, ".")))) = UCase(strExt) Then
                CountFiles = CountFiles + 1
            End If
        Next objFile
    End If

EarlyExit:
    'Giải phóng bộ nhớ
    On Error Resume Next
    Set objFile = Nothing
    Set objFiles = Nothing
    Set objFso = Nothing
    On Error GoTo 0

End Function

Để sử dụng hàm ở trên:
  1. Gọi hàm này từ thủ tục khác như ví dụ Test sau đây sử dụng FileDialog (FileDialogFolderPicker không được dùng trong Excel 2000.)
  2. Xin chú ý rằng bạn phải cung cấp đường dẫn đầy đủ của thư mục.
  3. Các bạn phải vào cửa sổ VBE, chọn Tools ~~> References và chọn Microsoft Scripting Runtime (thông thường C:\Windows\System32\scrrun.dll)
Mã:
Sub Test()
'Tác giả       : Ken Puls (www.excelguru.ca)
'Mục đích     : Thử hàm CountFiles

    Dim flDlg As FileDialog
    Dim dblCount As Double

    Set flDlg = Application.FileDialog(msoFileDialogFolderPicker)
    flDlg.Show
    dblCount = CountFiles(flDlg.SelectedItems(1))
    Debug.Print dblCount
End Sub

Nguồn từ đây.

Tham khảo thêm tại:

Lê Văn Duyệt
 
Lần chỉnh sửa cuối:
(Tiếp theo)

Đếm số tập tin (tất cả hoặc tùy theo phần mở rộng của tập tin) in một thư mục và thư mục con - Count Files (with a specific extension or not) in a folder and subfolders

Tương tự hàm ở trên nhưng hàm sau sẽ đếm luôn các tập tin của thư mục con.

Ví dụ này đã được kiểm tra với phiên bản Excel 2007. Do việc sử dụng hàm InStrRev nên hàm sau sẽ không được áp dụng cho Excel 97 (nhưng bây giờ tôi nghĩ chẳng ai dùng Excel 97 nhỉ)

Mã:
Private Function [COLOR="Red"][B]CountFiles_FolderAndSubFolders[/B][/COLOR](strFolder As String, Optional strExt As String = "*.*") As Double
'Tác giả          : Ken Puls (www.excelguru.ca)

    Dim objFso As Object
    Dim objFiles As Object
    Dim objSubFolder As Object
    Dim objSubFolders As Object
    Dim objFile As Object

    'Set Error Handling
    On Error GoTo EarlyExit

    'Tạo đối tượng Scripting.FileSystemObject
    Set objFso = CreateObject("Scripting.FileSystemObject")
    Set objFiles = objFso.getfolder(strFolder).Files
    Set objSubFolders = objFso.getfolder(strFolder).subFolders

    'Đếm số tập tin trong thư mục
    'Nếu không đưa yêu cầu về thành phần mở rộng của tập tin
    'Thì sẽ đếm tất cả.
    If strExt = "*.*" Then
        CountFiles_FolderAndSubFolders = objFiles.Count
    Else
        For Each objFile In objFiles
            If UCase(Right(objFile.Path, (Len(objFile.Path) - InStrRev(objFile.Path, ".")))) = UCase(strExt) Then
                CountFiles_FolderAndSubFolders = CountFiles_FolderAndSubFolders + 1
            End If
        Next objFile
    End If

    'Yêu cầu đếm số tập tin trong các thư mục con - Request count of files in subfolders
    For Each objSubFolder In objSubFolders
        CountFiles_FolderAndSubFolders = CountFiles_FolderAndSubFolders + _
        CountFiles_FolderAndSubFolders(objSubFolder.Path, strExt)
    Next objSubFolder

EarlyExit:
    'Giải phóng bộ nhớ
    On Error Resume Next
    Set objFile = Nothing
    Set objFiles = Nothing
    Set objFso = Nothing
    On Error GoTo 0

End Function

Ví dụ về sử dụng hàm ở trên:
Mã:
Sub Test()
'Tác giả       : Ken Puls (www.excelguru.ca)
'Mục đích     : Thử hàm CountFiles

    Dim flDlg As FileDialog
    Dim dblCount As Double

    Set flDlg = Application.FileDialog(msoFileDialogFolderPicker)
    flDlg.Show
    dblCount = CountFiles_FolderAndSubFolders(flDlg.SelectedItems(1))
    Debug.Print dblCount
End Sub

Nguồn tại đây.
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom