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:

  1. 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.
  2. 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 ExcelDanh 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:

  1. Mở file Excel chứa danh sách tên thư mục.
  2. Nhấn tổ hợp phím Alt + F11 để mở cửa sổ Visual Basic Editor (Trình soạn thảo VBA).
  3. 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 EditorThao tác chọn Insert Module trong giao diện Visual Basic Editor

  1. 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ạoDá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:

  1. Chuẩn bị sẵn danh sách tên tại một cột trong Excel.
  2. Nhấn tổ hợp phím Alt + F8 để mở hộp thoại Macro.
  3. Chọn tên Macro là CreateFolders và nhấn nút Run.

Chọn Macro CreateFolders trong danh sách và nhấn RunChọn Macro CreateFolders trong danh sách và nhấn Run

  1. 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ụcHộ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

  1. 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ớiChọn đường dẫn thư mục đích để lưu các folder mới

  1. 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ấtThô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.

  1. Vào thẻ Insert > Illustrations > Shapes.

Chọn công cụ vẽ hình khối Shapes trong thẻ InsertChọn công cụ vẽ hình khối Shapes trong thẻ Insert

  1. 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ấmVẽ một hình chữ nhật lên bảng tính Excel để làm nút bấm

  1. 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 MacroMenu chuột phải với tùy chọn Assign Macro

  1. Chọn CreateFolders từ danh sách và nhấn OK.

Gán Macro CreateFolders cho nút bấm vừa tạoGá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 conCấ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 (CreateNestedFoldersCreateFolderPath) vào Module.

  1. Sắp xếp dữ liệu trong Excel theo cấu trúc phân cấp (Cha – Con – Cháu).
  2. 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 nhauChọn Macro CreateNestedFolders để chạy lệnh tạo thư mục lồng nhau

  1. 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.
  2. 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 nhauThô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 MkDir có 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

  1. Microsoft Learn: MkDir Statement (VBA) – Tài liệu chính thức về lệnh tạo thư mục trong VBA.
  2. Microsoft Support: Create a Macro – Hướng dẫn cơ bản của Microsoft về cách tạo và chạy Macro.
  3. 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.
Share.
Leave A Reply