Trong bài viết Hàm DIR trong VBA (Phần 2) dưới đây, Mytour sẽ chia sẻ thêm ví dụ về cách sử dụng hàm DIR trong VBA. Đồng thời, bạn cũng có thể tìm hiểu thêm về FileSystemObject (FSO) trong VBA thông qua các bài viết khác trên Mytour.
1. Ví dụ cụ thể về hàm DIR trong VBA
Dưới đây là một số ví dụ về hàm DIR trong VBA:
Ví dụ 1: Lấy tên file từ đường dẫn
Nếu có đường dẫn file, ta có thể sử dụng hàm DIR để trích xuất tên file từ đó.
Ví dụ, đoạn mã sau đây trả về tên file và hiển thị trong hộp thoại thông báo:
Sub lấyTênFile()
Dim TênFile As String
TênFile = Dir('C:\Users\sumit\Desktop\Test\Excel File A.xlsx')
MsgBox TênFile
End Sub
Đoạn mã trên sử dụng biến 'TênFile' để lưu tên file mà hàm DIR trả về. Sau đó sử dụng hộp thông báo để hiển thị tên file như hình dưới đây:
Trong trường hợp nếu file không tồn tại, hàm DIR sẽ trả về chuỗi rỗng.
Ví dụ, trong đoạn mã dưới đây chúng ta sử dụng lệnh If Then Else để kiểm tra xem file có tồn tại hay không. Nếu file không tồn tại, nó sẽ hiển thị hộp thông báo kèm theo nội dung thông báo file không tồn tại.
Sub kiemtrafiletontai()
Dim TênFile As String
TênFile = Dir('C:\Users\sumit\Desktop\Test\Excel File A.xlsx')
If TênFile <> '' Then
MsgBox TênFile
Else
MsgBox 'File không tồn tại'
End If
End Sub
Ví dụ 2: Kiểm tra thư mục có tồn tại và tạo thư mục mới
Đoạn mã dưới đây kiểm tra xem thư mục Test có tồn tại hay không.
Hộp thoại được sử dụng để hiển thị thông báo về sự tồn tại của thư mục:
Sub KiemTraThuMuc()
Dim DuongDan As String
Dim CheckDir As String
DuongDan = 'C:\Users\sumit\Desktop\Test'
CheckDir = Dir(DuongDan, vbDirectory)
If CheckDir <> '' Then
MsgBox CheckDir & ' tồn tại'
Else
MsgBox 'thư mục không tồn tại'
End If
End Sub
Nếu cần, có thể điều chỉnh đoạn mã trên để kiểm tra xem thư mục có tồn tại hay không. Nếu thư mục không tồn tại, có thể sử dụng VBA để tạo thư mục đó.
Đoạn mã sau sử dụng hàm MkDir để tự động tạo thư mục khi nó không tồn tại:
Sub TaoThuMucTuDong()
Dim DuongDan As String
Dim KiemTraThuMuc As String
ĐườngDẫn = 'C:\Users\sumit\Desktop\Test'
KiểmTraThưMục = Dir(DườngDẫn, vbDirectory)
If KiểmTraThưMục <> '' Then
MsgBox KiểmTraThưMục & ' thư mục tồn tại'
Else
MkDir ĐườngDẫn
MsgBox 'Tạo thư mục mới cùng tên' & KiểmTraThưMục
End If
End Sub
Ví dụ 3: Lấy tên tất cả các file và thư mục trong một thư mục
Để có danh sách tên tất cả các file và thư mục trong một thư mục, chúng ta có thể sử dụng hàm DIR.
Mã dưới đây liệt kê danh sách tên tất cả các file và thư mục trong thư mục Test (tại đường dẫn - C:\Users\sumit\Desktop\Test\).
Sử dụng Debug.Print để hiển thị tên file và thư mục trong cửa sổ Immediate. Bạn cũng có thể sử dụng nó để liệt kê tên trong hộp thông báo hoặc cột Excel:
Sub laytatcatenfilevathumuc()
Dim tenfile As String
tenfile = Dir('C:\Users\sumit\Desktop\Test\', vbDirectory)
Trong khi tenfile <> ''
Debug.Print tenfile
tenfile = Dir()
End Loop
End Sub
Vòng lặp Do While trong đoạn mã trên được sử dụng để hiển thị tên của tất cả các file và thư mục trong đường dẫn. Khi không còn file hoặc thư mục nào nữa, biến tenfile sẽ trở thành chuỗi rỗng và vòng lặp sẽ kết thúc.
Ví dụ 4: Lấy tên tất cả các file trong một thư mục
Sử dụng đoạn mã dưới đây để lấy tên của tất cả các file trong một thư mục (không bao gồm tên của các thư mục con):
Sub laytatcatenfile()
Dim tenfile As String
tenfile = Dir('C:\Users\sumit\Desktop\Test\')
Vòng lặp Do While được sử dụng để hiển thị tên của tất cả các file trong đường dẫn. Khi không còn file nào nữa, biến tenfile trở thành chuỗi rỗng và vòng lặp kết thúc.
Debug.Print tenfile
tenfile = Dir()
Loop
End Sub
Đoạn mã này có sự tương đồng với ví dụ 3, nhưng được điều chỉnh một chút.
Trong đoạn mã này, chúng ta không chỉ định vbDirectory trong hàm DIR. Nếu sử dụng vbDirectory, hàm sẽ trả về tên của cả file và thư mục. Ngược lại, không chỉ định vbDirectory sẽ chỉ trả về tên của các file.
Lưu ý: Để lấy tên của tất cả các file trong thư mục chính và các thư mục con, chúng ta không thể sử dụng hàm DIR vì nó không hỗ trợ đệ quy. Để thực hiện điều này, chúng ta có thể sử dụng Power Query (không cần mã) hoặc sử dụng đối tượng File System trong VBA (hỗ trợ đệ quy).
Ví dụ 5: Lấy tên tất cả các thư mục con trong một thư mục
Đoạn mã sau đây sẽ thu thập tên của tất cả các thư mục con trong thư mục đã được chỉ định.
Bằng cách sử dụng hàm GetAttr trong VBA, chúng ta có thể kiểm tra xem tên được trả về bởi hàm DIR là tên của file hay thư mục:
Sub laytenthumuccon ()
Dim tenfile As String
Dim duongdan As String
PathName = 'C:\Users\sumit\Desktop\Test\'
Tenfile = Dir(duongdan, vbDirectory)
Do While tenfile<> ''
If GetAttr(duongdan & tenfile) = vbDirectory Then
Debug.Print tenfile
End If
FileName = Dir()
Loop
End Sub
Chúng ta lại sử dụng Debug.Print để lấy tên trong cửa sổ Immediate. Ngoài ra chúng ta có thể lấy tên trong hộp thông báo hoặc trong Excel bằng cách sửa đổi mã cho phù hợp.
Ví dụ 6: Lấy tên file Excel đầu tiên trong thư mục
Với hàm DIR, chúng ta có thể chỉ định phần mở rộng file hoặc tiền tố / hậu tố bất kỳ mà chúng ta muốn trong tên file được trả về.
Đoạn mã dưới đây hiển thị tên của file Excel đầu tiên trong thư mục Test:
Sub laytenfiledautien()
Dim tenfile As String
Dim tenduongdan As String
Tenduongdan = 'C:\Users\sumit\Desktop\Test\'
Tenfile= Dir(tenduongdan & '*.xls*')
MsgBox tenfile
End Sub
Lưu ý: Trong đoạn mã trên, ta sử dụng *.xls* (đặt hoa thị ở cả hai bên). Điều này đảm bảo kiểm tra tất cả các phiên bản file Excel (.xls, xlsx, .xlsm, .xlsb).
Ví dụ 7: Lấy tên của tất cả các file Excel trong một thư mục
Sử dụng đoạn mã sau để lấy tên của tất cả các file Excel trong thư mục Test:
Sub laytatcatenfile()
Dim tenthumuc As String
Dim tenfile As String
Tenthumuc = 'C:\Users\sumit\Desktop\Test\'
Tenfile = Dir(Tenthumuc & '*.xls*')
Do While tenfile <> ''
Debug.Print tenfile
Tenfile = Dir()
Loop
End Sub
Mặc dù hàm DIR chỉ trả về tên của file Excel đầu tiên, vì chúng ta gọi lại hàm trong vòng lặp, hàm sẽ đi qua tất cả các file và trả về tên tất cả các file Excel.
Như vậy bài viết trên đây giới thiệu một số ví dụ về hàm DIR trong VBA, tiếp theo bài Hàm DIR trong VBA phần 1. Nếu có bất kỳ thắc mắc nào cần giải đáp, bạn đọc có thể để lại ý kiến của mình trong phần bình luận bên dưới bài viết nhé.