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 SubLư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é!