Thời gian đọc ước tính: 8 phút
Những điểm chính
- Tự động hóa quy trình: Loại bỏ thao tác thủ công “Right-click > New Folder” tốn thời gian bằng Macro VBA.
- Hai phương pháp linh hoạt: Hỗ trợ tạo thư mục đơn lẻ (cấp 1) và thư mục lồng nhau (nhiều cấp con) dựa trên cấu trúc dữ liệu.
- Code mẫu kiểm chứng: Cung cấp đoạn mã VBA hoàn chỉnh, xử lý lỗi trùng lặp và báo cáo kết quả chính xác.
- Không cần kiến thức lập trình sâu: Hướng dẫn từng bước từ việc mở trình soạn thảo đến khi chạy lệnh thành công.
Việc phải tạo thủ công hàng chục, thậm chí hàng trăm thư mục trên máy tính là một công việc nhàm chán và dễ gây nhầm lẫn. Bạn phải liên tục lặp lại quy trình: nhấp chuột phải, chọn New Folder, gõ tên, và nhấn Enter. Nếu bạn là kế toán cần tạo thư mục lưu trữ hóa đơn theo tháng, hay nhân viên nhân sự cần hồ sơ cho hàng nghìn nhân viên mới, cách làm thủ công này hoàn toàn không khả thi về mặt thời gian.
Giải pháp tối ưu nhất là sử dụng VBA (Visual Basic for Applications) ngay trong Excel. Chỉ cần liệt kê danh sách tên thư mục trong bảng tính, chạy một đoạn mã Macro đơn giản, và Excel sẽ xử lý toàn bộ công việc chỉ trong vài giây. Dù số lượng là 20 hay 2.000 thư mục, tốc độ xử lý vẫn nhanh chóng như nhau.
Bài viết này hướng dẫn chi tiết hai phương pháp:
- Tạo thư mục hàng loạt (Không có thư mục con): Dành cho danh sách đơn giản.
- Tạo thư mục kèm thư mục con (Cấu trúc phân cấp): Dành cho hệ thống lưu trữ phức tạp.
Tạo Thư Mục Hàng Loạt (Không Có Thư Mục Con)
Phương pháp này phù hợp khi bạn có một danh sách tên đơn giản và muốn tạo tất cả chúng tại cùng một vị trí thư mục cha. Ví dụ: Bạn có danh sách mã nhân viên và muốn tạo cho mỗi người một thư mục riêng biệt.
Dưới đây là ví dụ về danh sách tên thư mục nằm trong một cột Excel. Mục tiêu là tạo các thư mục này tại một đường dẫn cụ thể trên hệ thống máy tính.
Danh sách các tên thư mục cần tạo nằm trong cột A của Excel
Để thực hiện, chúng ta sẽ nhúng đoạn mã VBA vào “hậu trường” (backend) của file Excel này.
Đoạn Mã VBA Cần Sử Dụng
Bạn hãy sao chép chính xác đoạn mã dưới đây. Mã này đã được tối ưu hóa để xử lý các tình huống như người dùng hủy chọn, thư mục đã tồn tại, hoặc ô trống.
Sub CreateFolders()
Dim selectedRange As Range
Dim folderPath As String
Dim folderName As String
Dim cell As Range
Dim foldersCreated As Long
Dim foldersExisted As Long
Dim fd As FileDialog
Dim summaryMsg As String
' Bước 1: Yêu cầu người dùng chọn vùng chứa tên thư mục
On Error Resume Next
Set selectedRange = Application.InputBox( _
Prompt:="Chọn các ô chứa tên thư mục:", _
Title:="Chọn Tên Thư Mục", _
Type:=8) ' Type 8 = Chọn vùng dữ liệu
On Error GoTo 0
' Kiểm tra nếu người dùng nhấn Cancel
If selectedRange Is Nothing Then
MsgBox "Chưa chọn vùng dữ liệu. Hủy thao tác.", vbExclamation
Exit Sub
End If
' Bước 2: Mở hộp thoại chọn thư mục lưu trữ
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
fd.Title = "Chọn thư mục nơi bạn muốn lưu các thư mục mới"
If fd.Show = -1 Then
folderPath = fd.SelectedItems(1)
Else
MsgBox "Chưa chọn thư mục đích. Hủy thao tác.", vbExclamation
Exit Sub
End If
' Thêm dấu gạch chéo ngược nếu chưa có
If Right(folderPath, 1) <> "" Then
folderPath = folderPath & ""
End If
' Bước 3: Duyệt qua từng ô đã chọn và tạo thư mục
foldersCreated = 0
foldersExisted = 0
For Each cell In selectedRange
folderName = Trim(cell.Value)
' Bỏ qua ô trống
If folderName <> "" Then
On Error Resume Next
MkDir folderPath & folderName
If Err.Number = 0 Then
foldersCreated = foldersCreated + 1
ElseIf Err.Number = 75 Then
foldersExisted = foldersExisted + 1
Else
MsgBox "Lỗi khi tạo thư mục: " & folderName & vbCrLf & Err.Description, vbExclamation
End If
On Error GoTo 0
End If
Next cell
' Bước 4: Hiển thị thông báo tổng kết
summaryMsg = foldersCreated & " thư mục đã được tạo thành công."
If foldersExisted > 0 Then
summaryMsg = summaryMsg & vbCrLf & foldersExisted & " thư mục đã tồn tại trước đó."
End If
summaryMsg = summaryMsg & vbCrLf & vbCrLf & "Vị trí: " & folderPath
MsgBox summaryMsg, vbInformation
End Sub
Cách Thiết Lập Môi Trường VBA
Để đoạn mã trên hoạt động, bạn cần thực hiện các bước sau trong Excel:
- Mở file Excel chứa danh sách tên thư mục.
- Nhấn tổ hợp phím Alt + F11 để mở cửa sổ Visual Basic Editor (Trình soạn thảo VBA).
- Tại giao diện VBA, chọn menu Insert > Module. Thao tác này sẽ tạo ra một trang trắng (Module) để bạn dán mã lệnh.
Thao tác chọn Insert Module trong giao diện Visual Basic Editor
- Sao chép đoạn code ở phần trên và dán vào cửa sổ Module vừa xuất hiện.
Dán đoạn mã VBA vào cửa sổ module vừa tạo
Lưu ý quan trọng: Để lưu đoạn mã này vĩnh viễn trong file để sử dụng cho lần sau, bạn bắt buộc phải lưu file Excel dưới định dạng Excel Macro-Enabled Workbook (.xlsm). Nếu lưu ở dạng .xlsx thông thường, toàn bộ mã VBA sẽ bị xóa khi bạn đóng file.
Quy Trình Thực Thi Tạo Thư Mục
Sau khi thiết lập xong, bạn tiến hành chạy Macro theo các bước sau:
- Chuẩn bị sẵn danh sách tên tại một cột trong Excel.
- Nhấn tổ hợp phím Alt + F8 để mở hộp thoại Macro.
- Chọn tên Macro là CreateFolders và nhấn nút Run.
Chọn Macro CreateFolders trong danh sách và nhấn Run
- Một hộp thoại (Input Box) sẽ xuất hiện. Hãy dùng chuột quét chọn vùng ô chứa tên các thư mục bạn muốn tạo, sau đó nhấn OK.
Hộp thoại yêu cầu người dùng quét chọn vùng dữ liệu tên thư mục
- Tiếp theo, cửa sổ duyệt thư mục (Folder Browser) hiện ra. Bạn trỏ đến vị trí muốn đặt các thư mục mới này (ví dụ: ổ D hoặc Desktop) và nhấn OK.
Chọn đường dẫn thư mục đích để lưu các folder mới
- Excel sẽ xử lý ngay lập tức. Sau khi hoàn tất, một thông báo tổng kết sẽ hiện ra, cho biết bao nhiêu thư mục đã được tạo mới và bao nhiêu thư mục đã tồn tại từ trước.
Thông báo kết quả sau khi quá trình tạo thư mục hoàn tất
Cơ chế xử lý lỗi của đoạn mã này rất an toàn: Nếu thư mục trùng tên đã tồn tại, mã sẽ tự động bỏ qua và chuyển sang thư mục tiếp theo, không gây gián đoạn quy trình.
Tùy Chọn: Tạo Nút Bấm Để Chạy Macro Nhanh
Nếu bạn cần thực hiện công việc này thường xuyên, việc nhấn Alt + F8 mỗi lần có thể hơi bất tiện. Bạn có thể tạo một nút bấm (Button) ngay trên trang tính.
- Vào thẻ Insert > Illustrations > Shapes.
Chọn công cụ vẽ hình khối Shapes trong thẻ Insert
- Vẽ một hình chữ nhật (hoặc bất kỳ hình nào bạn thích) lên bảng tính.
Vẽ một hình chữ nhật lên bảng tính Excel để làm nút bấm
- Nhấp chuột phải vào hình vừa vẽ, chọn Assign Macro.
Menu chuột phải với tùy chọn Assign Macro
- Chọn CreateFolders từ danh sách và nhấn OK.
Gán Macro CreateFolders cho nút bấm vừa tạo
Bây giờ, mỗi khi cần tạo thư mục, bạn chỉ cần click vào nút này.
Tạo Thư Mục Và Thư Mục Con (Cấu Trúc Lồng Nhau)
Nhu cầu thực tế thường phức tạp hơn. Ví dụ: Bạn cần tạo thư mục chính là “Dự Án A”, bên trong có các thư mục con “Hợp Đồng”, “Hóa Đơn”, và trong “Hợp Đồng” lại chia thành “2024”, “2025”.
Để làm được điều này, chúng ta cần thay đổi cả cấu trúc dữ liệu đầu vào và đoạn mã VBA.
Cấu Trúc Dữ Liệu Excel
Thay vì một cột đơn lẻ, bạn sẽ dàn trải cấu trúc thư mục ra nhiều cột theo thứ tự phân cấp:
- Cột 1: Thư mục cha (Cấp 1).
- Cột 2: Thư mục con (Cấp 2).
- Cột 3: Thư mục cháu (Cấp 3).
- …và tiếp tục như vậy.
Cấu trúc dữ liệu phân cấp nhiều cột để tạo thư mục con
Nguyên tắc quan trọng: Mỗi hàng đại diện cho một đường dẫn đầy đủ. Nếu bạn muốn tạo thư mục sâu 3 cấp, bạn phải điền đầy đủ thông tin vào cả 3 cột của hàng đó.
Đoạn Mã VBA Nâng Cao
Đoạn mã này bao gồm hai phần: Sub chính (CreateNestedFolders) để chạy và Sub phụ (CreateFolderPath) hoạt động như một hàm hỗ trợ để xử lý việc tạo từng lớp thư mục.
Sub CreateNestedFolders()
Dim selectedRange As Range
Dim folderPath As String
Dim fullPath As String
Dim cell As Range
Dim row As Range
Dim fd As FileDialog
Dim foldersCreated As Long
Dim foldersExisted As Long
Dim summaryMsg As String
Dim i As Long
Dim pathPart As String
' Bước 1: Chọn vùng dữ liệu chứa cấu trúc thư mục
On Error Resume Next
Set selectedRange = Application.InputBox( _
Prompt:="Chọn vùng chứa cấu trúc thư mục (bao gồm tất cả các cột):", _
Title:="Chọn Cấu Trúc Thư Mục", _
Type:=8)
On Error GoTo 0
If selectedRange Is Nothing Then
MsgBox "Chưa chọn vùng dữ liệu. Hủy thao tác.", vbExclamation
Exit Sub
End If
' Bước 2: Chọn thư mục gốc
Set fd = Application.FileDialog(msoFileDialogFolderPicker)
fd.Title = "Chọn thư mục gốc để bắt đầu tạo"
If fd.Show = -1 Then
folderPath = fd.SelectedItems(1)
Else
MsgBox "Chưa chọn thư mục. Hủy thao tác.", vbExclamation
Exit Sub
End If
If Right(folderPath, 1) <> "" Then
folderPath = folderPath & ""
End If
' Bước 3: Duyệt từng dòng và tạo đường dẫn đầy đủ
foldersCreated = 0
foldersExisted = 0
For Each row In selectedRange.Rows
fullPath = folderPath
' Ghép nối các cột để thành đường dẫn
For i = 1 To row.Cells.Count
pathPart = Trim(row.Cells(1, i).Value)
If pathPart <> "" Then
fullPath = fullPath & pathPart & ""
End If
Next i
' Xử lý dấu gạch chéo thừa ở cuối
If Right(fullPath, 1) = "" And Len(fullPath) > Len(folderPath) Then
fullPath = Left(fullPath, Len(fullPath) - 1)
End If
' Chỉ tạo nếu đường dẫn hợp lệ
If fullPath <> folderPath And fullPath <> Left(folderPath, Len(folderPath) - 1) Then
If Dir(fullPath, vbDirectory) <> "" Then
foldersExisted = foldersExisted + 1
Else
On Error Resume Next
CreateFolderPath fullPath ' Gọi hàm phụ
If Err.Number = 0 Then
foldersCreated = foldersCreated + 1
Else
MsgBox "Lỗi khi tạo: " & fullPath & vbCrLf & Err.Description, vbExclamation
End If
On Error GoTo 0
End If
End If
Next row
' Bước 4: Thông báo
summaryMsg = foldersCreated & " thư mục (đường dẫn) được tạo mới."
If foldersExisted > 0 Then
summaryMsg = summaryMsg & vbCrLf & foldersExisted & " đường dẫn đã tồn tại."
End If
summaryMsg = summaryMsg & vbCrLf & vbCrLf & "Tại vị trí: " & folderPath
MsgBox summaryMsg, vbInformation
End Sub
Sub CreateFolderPath(ByVal fullPath As String)
' Hàm phụ: Tạo thư mục cha nếu chưa tồn tại
Dim parts() As String
Dim currentPath As String
Dim i As Long
parts = Split(fullPath, "")
currentPath = parts(0) ' Bắt đầu từ ổ đĩa
For i = 1 To UBound(parts)
If parts(i) <> "" Then
currentPath = currentPath & "" & parts(i)
If Dir(currentPath, vbDirectory) = "" Then
MkDir currentPath
End If
End If
Next i
End Sub
Cách Thực Hiện
Quy trình thiết lập tương tự phương pháp 1. Bạn hãy dán cả hai Sub (CreateNestedFolders và CreateFolderPath) vào Module.
- Sắp xếp dữ liệu trong Excel theo cấu trúc phân cấp (Cha – Con – Cháu).
- Nhấn Alt + F8, chọn CreateNestedFolders và nhấn Run.
Chọn Macro CreateNestedFolders để chạy lệnh tạo thư mục lồng nhau
- Quét chọn toàn bộ vùng dữ liệu bao gồm tất cả các cột chứa tên thư mục.
- Chọn thư mục đích trên máy tính.
Kết quả sẽ được hiển thị ngay lập tức. Bạn có thể kiểm tra thư mục đích để thấy toàn bộ cây thư mục đã được tạo chính xác theo cấu trúc bạn mong muốn.
Thông báo thành công sau khi tạo cấu trúc thư mục lồng nhau
Phương pháp này cực kỳ hữu ích cho việc thiết lập hệ thống lưu trữ dự án mới, tổ chức hồ sơ nhân sự theo phòng ban/năm, hoặc quản lý tài liệu kế toán theo niên độ.
Lưu Ý Quan Trọng Khi Sử Dụng
- Bật Macro: Khi mở lại file .xlsm, Excel thường hiện thanh cảnh báo màu vàng “Security Warning”. Bạn cần nhấn Enable Content để code có thể chạy.
- Định dạng file: Luôn lưu file dưới dạng .xlsm (Excel Macro-Enabled Workbook). Định dạng .xlsx không hỗ trợ lưu mã VBA.
- Ký tự đặc biệt: Tránh sử dụng các ký tự bị cấm trong tên thư mục của Windows như
/ : * ? " < > |trong các ô Excel. Code sẽ báo lỗi nếu gặp các ký tự này. - Độ dài đường dẫn: Windows có giới hạn về độ dài đường dẫn tệp (thường là 260 ký tự). Nếu cấu trúc lồng nhau quá sâu cộng với tên thư mục quá dài, lệnh
MkDircó thể thất bại.
FAQ: Câu Hỏi Thường Gặp
Tôi có thể dùng code này trên máy Mac không?
Code VBA trên Mac có một số khác biệt về cách xử lý đường dẫn file (sử dụng dấu / thay vì ) và đối tượng FileDialog. Code trên được viết tối ưu cho Windows. Để chạy trên Mac, bạn cần điều chỉnh lại phần xử lý đường dẫn và bộ chọn thư mục.
Làm sao để xóa hàng loạt thư mục nếu tôi tạo nhầm?
VBA cũng có thể xóa thư mục (lệnh RmDir), nhưng rất nguy hiểm vì nó xóa vĩnh viễn không qua Thùng rác (Recycle Bin). Tốt nhất bạn nên vào File Explorer, chọn các thư mục vừa tạo và xóa thủ công để an toàn.
Tại sao tôi gặp lỗi “Path not found” (Lỗi 76)?
Lỗi này thường xảy ra ở phương pháp 1 nếu bạn cố tạo một thư mục con trong một thư mục cha chưa tồn tại. Ví dụ: Bạn muốn tạo D:Data2024Thang1 nhưng thư mục D:Data chưa có. Hãy sử dụng Phương pháp 2 (Nested Folders) để giải quyết vấn đề này, vì nó tự động tạo thư mục cha nếu thiếu.
Tôi có thể tạo thư mục dựa trên danh sách từ một file Excel khác đang đóng không?
Có thể, nhưng phức tạp hơn. Cách đơn giản nhất là mở file đó lên, copy danh sách sang file có chứa Macro (hoặc copy code Macro sang file đó) để thực hiện.
Nguồn tham khảo
- Microsoft Learn: MkDir Statement (VBA) – Tài liệu chính thức về lệnh tạo thư mục trong VBA.
- Microsoft Support: Create a Macro – Hướng dẫn cơ bản của Microsoft về cách tạo và chạy Macro.
- Excel VBA FileDialog Object – Giải thích chi tiết về đối tượng hộp thoại chọn file/thư mục được sử dụng trong bài.