Menu

Tự động hóa việc tạo danh sách lựa chọn phụ thuộc (Dependent Dropdown List) bằng VBA

Đặng Mộng Vọng 10/06/2026 07:27 493 lượt xem 3 trả lời

Chào các anh em, mình là thành viên mới của diễn đàn. Hôm nay mình muốn chia sẻ một đoạn code VBA nhỏ nhưng khá hữu ích để tự động hóa việc tạo danh sách lựa chọn phụ thuộc (Dependent Dropdown List) trong Excel. Cái này thì nhiều anh em chắc cũng biết cách làm thủ công rồi, nhưng với những file có nhiều danh sách hoặc dữ liệu lớn thì làm bằng tay rất mất thời gian.

Ví dụ, mình có một danh sách các Tỉnh/Thành phố và mỗi Tỉnh/Thành phố lại có các Quận/Huyện tương ứng. Mình muốn khi chọn Tỉnh/Thành phố ở ô A1, thì ô B1 sẽ chỉ hiển thị danh sách các Quận/Huyện thuộc Tỉnh/Thành phố đó.

Đây là đoạn code mình hay dùng:

Sub CreateDependentDropdown()

    Dim wsData As Worksheet
    Dim wsReport As Worksheet
    Dim lastRow As Long

    Set wsData = ThisWorkbook.Sheets("Data") ' Sheet chứa dữ liệu gốc (ví dụ: cột A là Tỉnh, cột B là Huyện)
    Set wsReport = ThisWorkbook.Sheets("Report") ' Sheet cần tạo dropdown

    ' Xóa các danh sách cũ (nếu có)
    On Error Resume Next
    wsReport.Range("A1").Validation.Delete
    wsReport.Range("B1").Validation.Delete
    On Error GoTo 0

    ' Tạo danh sách Tỉnh/Thành phố cho ô A1
    lastRow = wsData.Cells(Rows.Count, "A").End(xlUp).Row
    With wsReport.Range("A1").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=Data!$A$2:$A$" & lastRow
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With

    ' Tạo công thức cho danh sách Huyện phụ thuộc vào ô A1 (sử dụng INDIRECT)
    ' Giả định dữ liệu Tỉnh/Huyện trên sheet Data được đặt tên theo Tỉnh, ví dụ: Tên Tỉnh 'Hanoi' sẽ có 1 Name Range là 'Hanoi' chứa danh sách các Quận/Huyện của Hà Nội
    With wsReport.Range("B1").Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=INDIRECT(A1)"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With

End Sub

Lưu ý quan trọng:

  • Để code chạy đúng, bạn cần chuẩn bị dữ liệu trên sheet Data. Cột đầu tiên (ví dụ: cột A) là danh sách các Tỉnh/Thành phố duy nhất.
  • Đối với mỗi Tỉnh/Thành phố, bạn cần tạo một Name Range (Vào Formulas -> Define Name) có tên trùng với tên Tỉnh/Thành phố đó, và phạm vi của Name Range này sẽ là danh sách các Quận/Huyện tương ứng. Ví dụ, nếu bạn có Tỉnh là 'Hà Nội', bạn tạo một Name Range tên là 'Hanoi' và chọn phạm vi là các Quận/Huyện của Hà Nội.
  • Code trên chỉ ví dụ cho 2 ô A1 và B1. Bạn có thể tùy chỉnh phạm vi ô và cách lấy dữ liệu cho phù hợp với nhu cầu của mình.

Code này giúp tiết kiệm rất nhiều thời gian khi làm báo cáo hoặc nhập liệu. Anh em nào có cách làm hay hơn hoặc có thắc mắc gì thì cùng thảo luận nhé!

4

Chào bạn, cảm ơn bạn đã chia sẻ đoạn code VBA rất hay này! Đúng là với những file lớn thì việc tự động hóa danh sách phụ thuộc này tiết kiệm được rất nhiều thời gian.

Mình cũng hay dùng INDEX và MATCH để làm việc này, nhưng cách của bạn có vẻ trực quan và dễ áp dụng hơn. Không biết bạn có thể chia sẻ thêm về cách xử lý trường hợp có nhiều cấp độ phụ thuộc không? Ví dụ như Tỉnh/Thành -> Quận/Huyện -> Phường/Xã chẳng hạn?

1

Đúng là cách của bạn xử lý vụ danh sách phụ thuộc này rất gọn gàng, nhất là khi áp dụng cho file lớn. Mình cũng hay gặp trường hợp này và làm thủ công khá tốn công.

Ngoài cách dùng VBA này, đôi khi mình còn thử kết hợp cả Data Validation với hàm INDIRECT nữa, cũng khá hiệu quả cho các trường hợp đơn giản. Không biết bạn đã thử qua cách đó chưa?

0

Đoạn code VBA của bạn xử lý vụ danh sách phụ thuộc này thực sự rất gọn gàng, nhất là khi áp dụng cho file lớn. Mình cũng hay gặp trường hợp này và làm thủ công khá tốn công.

Ngoài cách dùng VBA này, đôi khi mình còn thử kết hợp cả Data Validation với hàm INDIRECT nữa, cũng khá hiệu quả cho các trường hợp đơn giản. Không biết bạn đã thử qua cách đó chưa?

4

Bạn cần đăng nhập để trả lời chủ đề này.

Đăng nhập Đăng ký