Đánh giá lequocthai.com:
Để lấy các tên tệp hoặc thư mục khác trong cùng đường dẫn mà vẫn đáp ứng các thuộc tính đã chỉ định, bạn cần gọi lại hàm DIR mà không truyền bất kỳ đối số nào. Tính năng này của hàm DIR rất hữu ích khi cần duyệt hoặc liệt kê các tệp và thư mục có trong một vị trí.
Lưu ý rằng hàm DIR chỉ cung cấp tên của tệp. Nếu bạn cần các thuộc tính của tệp (như ngày sửa đổi cuối cùng, kích thước, v.v.) thì nên dùng FileObjectSystem.

Cú pháp của hàm VBA DIR:
DIR(pathname, attributes)
Trong đó, `pathname` chỉ định đường dẫn của tệp, thư mục hoặc thư mục con. Nếu không tìm thấy `pathname`, DIR sẽ trả về một chuỗi rỗng (độ dài = 0).
`attributes` là đối số tùy chọn. Nó có thể là một trong các giá trị sau hoặc tổng hợp của chúng:
| Tên Thuộc Tính | Mô Tả |
|---|---|
| vbNormal (Normal – Mặc định) | Chỉ các tệp không có thuộc tính nào. |
| vbReadOnly (Read‑Only) | Các tệp chỉ đọc. |
| vbHidden (Hidden) | Các tệp ẩn. |
| vbSystem (System) | Các tệp hệ thống. |
| vbVolume (Volume) | Nhãn ổ đĩa; nếu kết hợp với bất kỳ thuộc tính nào khác, nhãn ổ đĩa sẽ bị bỏ qua. |
| vbDirectory (Directory) | Thư mục. |
| vbArchive (Archive) | Các tệp lưu trữ (backup). |
| vbAlias (Alias) | Các tệp có bí danh (alias). |
Một số điểm quan trọng về hàm VBA DIR
- Cả hai đối số trong hàm DIR đều là tùy chọn.
- Bạn có thể sử dụng ký tự đại diện (wildcard) (như `?` hoặc `*`) với DIR để chỉ định nhiều tệp.
- `*` cho phép khớp bất kỳ chuỗi nào, bất kỳ độ dài nào (kể cả độ dài 0).
- `?` cho phép khớp một ký tự duy nhất.
- Lần đầu tiên, bạn phải gọi DIR kèm tham số `pathname`. Các lần gọi sau, chỉ cần gọi DIR mà không truyền đối số để lấy mục tiếp theo.
5 Ví Dụ Cơ Bản Về Hàm DIR trong VBA
Ví dụ 1: Cung cấp đường dẫn tệp cho hàm DIR
Dir("C:\SomeFile.txt")
trả về `SomeFile.txt`
Dir("C:\Some*.txt")
trả về `SomeFile.txt` (giả sử không có tệp nào khác bắt đầu bằng “Some”)
Dir("C:\SomeFil?.txt")
trả về `SomeFile.txt`
Ví dụ 2: Lấy tệp .exe đầu tiên trong thư mục Windows
Sub RetrieveFile()
File = Dir("C:\Windows\*.exe")
MsgBox File
End Sub
Giải thích: Đoạn mã này lấy tệp .exe đầu tiên trong thư mục Windows và hiển thị tên tệp trong hộp thoại. Nếu có nhiều tệp .exe, chỉ tệp đầu tiên sẽ được trả về.
Ví dụ 3: Kiểm tra một tệp có tồn tại hay không
Sub RetrieveFile()
File = Dir("C:\Windows\CSUP.txt")
If Len(File) > 0 Then
MsgBox File & " Exists"
Else
MsgBox "File Doesn't Exist"
End If
End Sub
Giải thích: Nếu hàm DIR trả về chuỗi có độ dài lớn hơn 0, nghĩa là tệp tồn tại.
Ví dụ 4: Kiểm tra một thư mục có tồn tại hay không; nếu không, tạo thư mục đó
Sub RetrieveFolder()
MyFolder = "C:\TestDirectory"
Fldr = Dir(MyFolder, vbDirectory)
If Len(Fldr) > 0 Then
MsgBox Fldr & " Already Exists"
Else
MkDir MyFolder
MsgBox "Folder Created"
End If
End Sub
Giải thích: Nếu DIR trả về chuỗi có độ dài > 0, thư mục đã tồn tại; nếu không, hàm `MkDir` sẽ tạo thư mục mới.
Ví dụ 5: Thư mục “C:\Test\” chứa toàn các tệp ẩn. Lấy tên tệp ẩn đầu tiên.
Sub RetrieveFile()
MyFile = Dir("C:\Test\*.*", vbHidden)
MsgBox MyFile
End Sub
Giải thích: Hàm DIR sẽ tìm các tệp có thuộc tính ẩn trong thư mục “C:\Test\” và trả về tệp ẩn đầu tiên.
3 Ví Dụ Nâng Cao Về Hàm DIR trong Excel
Ví dụ 6: Duyệt qua tất cả các thư mục con cấp con trực tiếp trong một đường dẫn
Sub Iterate_Folders()
Dim ctr As Integer
ctr = 1
Path = "C:\Windows\" ' Đường dẫn luôn phải kết thúc bằng "\"
FirstDir = Dir(Path, vbDirectory) ' Lấy mục đầu tiên
Do Until FirstDir = ""
If (GetAttr(Path & FirstDir) And vbDirectory) = vbDirectory Then
ActiveSheet.Cells(ctr, 1).Value = Path & FirstDir
ctr = ctr + 1
End If
FirstDir = Dir() ' Lấy mục tiếp theo
Loop
End Sub
Giải thích: Sử dụng vòng lặp `Do Until` kết hợp với hàm DIR để liệt kê các thư mục con trong một đường dẫn và ghi kết quả vào cột A của sheet hiện hành.
Ví dụ 7: Duyệt qua tất cả các tệp trong một đường dẫn (không bao gồm các tệp trong thư mục con)
Sub Iterate_Files()
Dim ctr As Integer
ctr = 1
Path = "C:\Windows\" ' Đường dẫn luôn phải kết thúc bằng "\"
File = Dir(Path) ' Lấy tệp đầu tiên
Do Until File = ""
ActiveSheet.Cells(ctr, 1).Value = Path & File
ctr = ctr + 1
File = Dir() ' Lấy tệp tiếp theo
Loop
End Sub
Giải thích: Tương tự ví dụ trước, nhưng chỉ duyệt các tệp, không xét thư mục con.
Ví dụ 8: Liệt kê tất cả các tệp trong một đường dẫn và các thư mục con của nó
Sub Retrieve_File_listing()
Worksheets(1).Cells(2, 1).Activate
Call Enlist_Directories("C:\Users\Ankit\Desktop\ExcelTrick\", 1)
End Sub
Public Sub Enlist_Directories(strPath As String, lngSheet As Long)
Dim strFldrList() As String
Dim lngArrayMax As Long, x As Long
lngArrayMax = 0
strFn = Dir(strPath & "*.*", 23)
While strFn <> ""
If strFn <> "." And strFn <> ".." Then
If (GetAttr(strPath & strFn) And vbDirectory) = vbDirectory Then
lngArrayMax = lngArrayMax + 1
ReDim Preserve strFldrList(lngArrayMax)
strFldrList(lngArrayMax) = strPath & strFn & "\"
Else
ActiveCell.Value = strPath & strFn
Worksheets(lngSheet).Cells(ActiveCell.Row + 1, 1).Activate
End If
End If
strFn = Dir()
Wend
If lngArrayMax <> 0 Then
For x = 1 To lngArrayMax
Call Enlist_Directories(strFldrList(x), lngSheet)
Next
End If
End Sub
Giải thích: Đầu tiên hàm duyệt qua tất cả các thư mục trong một đường dẫn và lưu chúng vào mảng. Sau đó, hàm gọi đệ quy `Enlist_Directories` để lấy tên các tệp trong từng thư mục con, cuối cùng ghi toàn bộ danh sách vào sheet.
Kết luận: Đó là toàn bộ nội dung về hàm VBA DIR trong Microsoft Excel.







