RaoVat24h
Office Word

Hàm VBA DIR – Giải thích dễ dàng với các ví dụ

Advertisement

VBA có một số chức năng hữu ích có thể tự động hóa của bạn trong Excel ở cấp độ tiếp theo.

Một hàm như vậy là hàm DIR của VBA .

Trong khi bản thân nó, nó có vẻ giống như một chức năng đơn giản mà làm một điều cụ thể.
Nhưng khi bạn kết hợp nó với một số yếu tố hữu ích khác của ngôn ngữ mã hóa VBA , bạn có thể tạo ra những thứ mạnh mẽ (được trình bày trong các ví dụ sau trong hướng dẫn này).

Chức năng VBA Dir làm gì?

Sử dụng hàm VBA DIR khi bạn muốn lấy tên của tệp hoặc thư mục, sử dụng tên đường dẫn của chúng.
Để cung cấp cho bạn một ví dụ, nếu bạn có một tệp Excel trong một thư mục, bạn có thể sử dụng hàm VBA DIR để lấy tên của tệp Excel đó (hoặc bất kỳ loại tệp nào khác).
Nếu tôi muốn lấy tên của tất cả các tệp Excel trong thư mục (hoặc tất cả các tệp – có thể là tệp Excel hay không)?
Bạn cũng có thể làm điều đó mà!
Khi bạn sử dụng hàm DIR một lần, nó sẽ trả về tên tệp đầu tiên  trong một thư mục. Bây giờ nếu bạn muốn lấy tên của các tệp thứ hai, thứ ba, thứ tư, bạn có thể sử dụng lại hàm DIR (được trình bày sau này làm ví dụ).
Dir  trả về tên tệp đầu tiên khớp với tên đường dẫn. Để nhận được bất kỳ tên tệp bổ sung nào khớp với tên đường dẫn, hãy gọi   lại Dir với không có đối số. Khi không có tên tệp nào khớp,  Dir  sẽ trả về một chuỗi có độ dài bằng không (“”). Được trình bày trong Ví dụ 3 và 4 ở phần sau của hướng dẫn này.

Cú pháp của hàm VBA DIR

Dir [(tên đường dẫn [, thuộc tính])]
  • pathname : Đây là một đối số tùy chọn. Đây có thể là tên tệp, tên thư mục hoặc tên thư mục. Nếu không tìm thấy tên đường dẫn, hàm VBA DIR trả về một chuỗi có độ dài bằng không (“”)
  • thuộc tính : Đây là một đối số tùy chọn. Bạn có thể sử dụng đối số này để chỉ định một số thuộc tính và hàm DIR sẽ trả về tên tệp dựa trên các thuộc tính đó. Ví dụ, nếu bạn muốn một danh sách tất cả các tệp ẩn hoặc các tệp chỉ đọc (cùng với các tệp không có thuộc tính), bạn cần xác định rằng trong đối số này.
Các thuộc tính có sẵn để sử dụng trong hàm VBA DIR (bạn có thể sử dụng một hoặc nhiều trong số này):
Không thay đổi Giá trị Sự miêu tả
vbNormal 0 (Mặc định) Chỉ định các tệp không có thuộc tính.
vbReadOnly 1 Chỉ định tệp chỉ đọc ngoài các tệp không có thuộc tính.
vbHidden 2 Chỉ định các tệp ẩn ngoài các tệp không có thuộc tính.
VbSystem 4 Chỉ định tệp hệ thống ngoài các tệp không có thuộc tính. Không có trên Macintosh.
vbVolume số 8 Chỉ định nhãn âm lượng; nếu bất kỳ quy định nào khác được chỉ định, vbVolume bị bỏ qua. Không có trên Macintosh.
vbDirectory 16 Chỉ định thư mục hoặc thư mục ngoài các tệp không có thuộc tính.
vbAlias 64 Tên tệp được chỉ định là bí danh. Chỉ có trên Macintosh.

Sử dụng ký tự đại diện với hàm DIR

Nếu bạn đang làm việc với Windows, bạn cũng có thể sử dụng các ký tự đại diện trong hàm DIR.
Lưu ý rằng bạn không thể sử dụng chúng khi làm việc với VBA trong Macintosh.
Sử dụng ký tự đại diện có thể hữu ích khi:
  • Bạn muốn lấy tên tệp của một loại tệp cụ thể (chẳng hạn như .XLSX hoặc .PPTX)
  • Khi bạn có hậu tố / tiền tố cụ thể trong tên tệp và bạn muốn lấy tên của các tệp / thư mục / thư mục này. Ví dụ: nếu bạn muốn tên của tất cả các tệp có tiền tố 2019 trong đó, bạn có thể làm điều đó bằng ký tự đại diện.
Có ba ký tự đại diện trong Excel:
  1. * (dấu hoa thị)  – Nó đại diện cho bất kỳ số ký tự nào. Ví dụ: 2019 * sẽ cung cấp cho bạn tên của tất cả các tệp có tiền tố 2019 trong đó.
  2. (dấu chấm hỏi)  – Nó đại diện cho một ký tự đơn. Ví dụ: 2019? sẽ cung cấp cho bạn tên của tất cả các tệp bắt đầu với năm 2019 và có thêm một ký tự trong tên (chẳng hạn như 2019A, 2019B, 2019C, v.v.)
Lưu ý: Có thêm một ký tự đại diện – dấu ngã (~). Vì nó không được sử dụng nhiều, tôi đã bỏ qua lời giải thích của nó. Bạn có thể đọc thêm về nó ở đây nếu thích .

Hàm VBA DIR – Ví dụ

Bây giờ chúng ta hãy đi sâu vào và xem một số ví dụ về cách sử dụng hàm VBA DIR.

Ví dụ 1 – Lấy tên tệp từ đường dẫn của nó

Khi bạn có đường dẫn của một tệp, bạn có thể sử dụng hàm DIR để lấy tên của tệp từ nó.
Ví dụ, mã bên dưới trả về tên của tệp và hiển thị nó trong một hộp thư .
Sub GetFileNames()
Dim FileName As String
FileName = Dir("C:UserssumitDesktopTestExcel File A.xlsx")
MsgBox FileName
End Sub
Đoạn mã trên sử dụng một biến ‘FileName’ để lưu tên tập tin được trả về bởi hàm DIR. Sau đó nó sử dụng một hộp thông báo để hiển thị tên tệp (như được hiển thị bên dưới).
Tên tệp sử dụng hàm VBA DIR
Và điều gì xảy ra khi tệp không tồn tại?
Trong trường hợp đó, hàm DIR sẽ trả về một chuỗi rỗng.
Đoạn mã dưới đây sử dụng câu lệnh If Then Else để kiểm tra xem tệp có tồn tại hay không. Nếu tập tin không tồn tại, nó sẽ hiển thị một hộp thông báo với một văn bản “Tập tin không tồn tại”, nếu không nó sẽ hiển thị tên tập tin.
Sub CheckFileExistence()
Dim FileName As String
FileName = Dir("C:UserssumitDesktopTestExcel File A.xlsx")

If FileName <> "" Then
MsgBox FileName
Else
MsgBox "File Doesn't Exist"
End If

End Sub

Ví dụ 2 – Kiểm tra xem một thư mục có tồn tại hay không (và tạo ra nếu nó không có)

Mã dưới đây kiểm tra xem thư mục ‘Kiểm tra’ có tồn tại hay không.
Một hộp thông điệp được sử dụng để hiển thị một thông báo trong trường hợp thư mục tồn tại hoặc khi nó không tồn tại.
Sub CheckDirectory()
Dim PathName As String
Dim CheckDir As String

PathName = "C:UserssumitDesktopTest"
CheckDir = Dir(PathName, vbDirectory)

If CheckDir <> "" Then
MsgBox CheckDir & " exists"
Else
MsgBox "The directory doesn't exist"
End If

End Sub
Bạn có thể tinh chỉnh thêm mã này để kiểm tra xem thư mục có tồn tại hay không, và nếu không, bạn có thể sử dụng VBA để tạo thư mục đó.
Dưới đây là mã sử dụng hàm MkDir để tạo thư mục trong trường hợp nó không tồn tại.
Sub CreateDirectory()
Dim PathName As String
Dim CheckDir As String

PathName = "C:UserssumitDesktopTest"
CheckDir = Dir(PathName, vbDirectory)

If CheckDir <> "" Then
MsgBox CheckDir & " folder exists"
Else
MkDir PathName
MsgBox "A folder has been created with the name" & CheckDir
End If

End Sub

Ví dụ 3 – Lấy tên của tất cả các tệp và thư mục trong một thư mục

Nếu bạn muốn nhận danh sách tất cả tên tệp và thư mục trong một thư mục, bạn có thể sử dụng hàm DIR.
Đoạn mã dưới đây liệt kê tất cả các tệp và tên thư mục trong thư mục Test (được đặt tại đường dẫn sau – C: Users sumit Desktop Test ).
Tôi đang sử dụng Debug.Print để hiển thị tên trong cửa sổ ngay lập tức. Bạn cũng có thể sử dụng điều này để liệt kê các tên trong một hộp thư hoặc trong một cột trong Excel.
Sub GetAllFile&FolderNames()
Dim FileName As String
FileName = Dir("C:UserssumitDesktopTest", vbDirectory)

Do While FileName <> ""
Debug.Print FileName
FileName = Dir()
Loop
End Sub
Vòng lặp Do While trong đoạn mã trên tiếp tục cho đến khi tất cả các tệp và thư mục trong đường dẫn đã cho đã được bảo vệ. Khi không có tệp / thư mục nào để trang trải, FileName sẽ trở thành một chuỗi rỗng và vòng lặp dừng lại.

Ví dụ 4 – Lấy tên của tất cả các tệp trong một thư mục

Bạn có thể sử dụng mã bên dưới để lấy tên của tất cả các tệp trong thư mục / thư mục (chứ không phải tên của các thư mục con).
Sub GetAllFileNames()
Dim FileName As String
FileName = Dir("C:UserssumitDesktopTest")

Do While FileName <> ""
Debug.Print FileName
FileName = Dir()
Loop
End Sub
Mã này giống như mã được sử dụng trong Ví dụ 3, với một khác biệt nhỏ.
Trong mã này, tôi đã không chỉ định vbDirectory trong hàm DIR. Khi bạn chỉ định vbDirectory, nó sẽ cung cấp cho bạn tên của tất cả các tệp cũng như các thư mục.
Khi bạn không chỉ định vbDirectory, hàm DIR sẽ chỉ cung cấp cho bạn tên của các tệp.
Ghi chú : Nếu bạn muốn lấy tên của tất cả các tệp trong thư mục chính và các thư mục con, bạn không thể sử dụng hàm DIR (vì nó không đệ quy). Để thực hiện điều này, bạn có thể sử dụng Power Query (không cần mã hóa) hoặc sử dụng Đối tượng Hệ thống Tệp trong VBA (với đệ quy).

Ví dụ 5 – Lấy tên của tất cả các thư mục con trong một thư mục

Mã dưới đây sẽ cung cấp cho bạn tên của tất cả các thư mục con trong thư mục được chỉ định.
Nó sử dụng hàm GetAtr trong VBA, cho phép chúng ta kiểm tra xem tên được trả về bởi hàm DIR có phải là tên của một tệp hoặc một thư mục / thư mục hay không.
Sub GetSubFolderNames()
Dim FileName As String
Dim PathName As String

PathName = "C:UserssumitDesktopTest"
FileName = Dir(PathName, vbDirectory)

Do While FileName <> ""
If GetAttr(PathName & FileName) = vbDirectory Then
Debug.Print FileName
End If
FileName = Dir()
Loop
End Sub

Một lần nữa, tôi đang sử dụng Debug.Print để lấy tên trong cửa sổ ngay lập tức. Bạn có thể lấy chúng trong hộp thư hoặc trong Excel (bằng cách sửa đổi mã cho phù hợp).

Ví dụ 6 – Lấy tệp Excel đầu tiên từ một thư mục

Với chức năng DIR, bạn có thể chỉ định phần mở rộng tập tin hoặc bất kỳ hậu tố / tiền tố nào bạn muốn trong tên tệp được trả về.
Đoạn mã dưới đây sẽ hiển thị tên của tệp Excel đầu tiên trong thư mục Test.
Sub GetFirstExcelFileName()
Dim FileName As String
Dim PathName As String

PathName = "C:UserssumitDesktopTest"
FileName = Dir(PathName & "*.xls*")
MsgBox FileName
End Sub
Lưu ý rằng tôi đã sử dụng * .xls * (dấu hoa thị trên cả hai mặt). Điều này sẽ đảm bảo rằng tất cả các phiên bản của tệp Excel được chọn (.xls, xlsx, .xlsm, .xlsb).

Ví dụ 7 – Lấy tên của tất cả tệp Excel trong một thư mục

Sử dụng mã bên dưới để lấy tên của tất cả các tệp Excel trong thư mục Test.
Sub GetAllFileNames()
Dim FolderName As String
Dim FileName As String
FolderName = "C:UserssumitDesktopTest"
FileName = Dir(FolderName & "*.xls*")

Do While FileName <> ""
Debug.Print FileName
FileName = Dir()
Loop

End Sub
Trong khi hàm DIR chỉ trả về tên của tệp Excel đầu tiên, vì chúng ta gọi lại nó trong vòng lặp, nó đi qua tất cả các tệp và cung cấp cho chúng ta tên của tất cả các tệp Excel.
Hy vọng bạn tìm thấy hướng dẫn này và các ví dụ hữu ích.
Hãy cho tôi biết suy nghĩ của bạn trong phần bình luận.

Rate this post

DienDan.Edu.Vn

DienDan.Edu.Vn Cám ơn bạn đã quan tâm và rất vui vì bài viết đã đem lại thông tin hữu ích cho bạn.
DienDan.Edu.Vn! là một website với tiêu chí chia sẻ thông tin,... Bạn có thể nhận xét, bổ sung hay yêu cầu hướng dẫn liên quan đến bài viết. Vậy nên đề nghị các bạn cũng không quảng cáo trong comment này ngoại trừ trong chính phần tên của bạn.
Cám ơn.

Đăng bình luận

(+84) (901) 369.468