Dù dùng code VBA hay công thức thì cũng chỉ có 1 cách duy nhất: Phải tạo 1 cột phụ chứa list duy nhất. Validation sẽ tham chiếu đến phụ này
Đương nhiên VBA cũng có 1 cách hơi "tà đạo" là nạp trực tiếp vào Validation theo dạng chuổi (không cần cột phụ). Có điều cách này cũng có giới hạn, sẽ không làm được với những list dài
Function UniqueList(ParamArray sArray())
Dim Item, tmpArr, SubArr, tmp
On Error Resume Next
With CreateObject("Scripting.Dictionary")
For Each SubArr In sArray
tmpArr = SubArr
If Not IsArray(tmpArr) Then tmpArr = Array(tmpArr)
For Each Item In tmpArr
tmp = CStr(Item)
If Len(tmp) Then
If Not .Exists(tmp) Then .Add tmp, ""
End If
Next
Next
If .Count Then UniqueList = .Keys
End With
End Function
2> Code sự kiện SelectionChange
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "[COLOR=#ff0000]$G$9[/COLOR]" Then
Dim arr, rng As Range
Set rng = [COLOR=#0000cd]Range("D5:D1000")[/COLOR]
arr = UniqueList(rng)
If IsArray(arr) Then
With Target
.Validation.Delete
.Validation.Add 3, , , Join(arr, ",")
End With
End If
End If
End Sub
Bạn nhập liệu gì cứ thây kệ, hể chọn vào cell G9 là list sẽ tự cập nhất
Lưu ý:
- Chổ màu đỏ là cell chứa Validaiton
- Chổ màu xanh là vùng dữ liệu cần lấy list duy nhất
Cứ tùy biến 2 chổ đỏ xanh ấy thoải mái, những chổ khác cứ để nguyên
Function UniqueList(ParamArray sArray())
Dim Item, tmpArr, SubArr, tmp
On Error Resume Next
With CreateObject("Scripting.Dictionary")
For Each SubArr In sArray
tmpArr = SubArr
If Not IsArray(tmpArr) Then tmpArr = Array(tmpArr)
For Each Item In tmpArr
tmp = CStr(Item)
If Len(tmp) Then
If Not .Exists(tmp) Then .Add tmp, ""
End If
Next
Next
If .Count Then UniqueList = .Keys
End With
End Function
2> Code sự kiện SelectionChange
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "[COLOR=#ff0000]$G$9[/COLOR]" Then
Dim arr, rng As Range
Set rng = [COLOR=#0000cd]Range("D5:D1000")[/COLOR]
arr = UniqueList(rng)
If IsArray(arr) Then
With Target
.Validation.Delete
.Validation.Add 3, , , Join(arr, ",")
End With
End If
End If
End Sub
Bạn nhập liệu gì cứ thây kệ, hể chọn vào cell G9 là list sẽ tự cập nhất
Lưu ý:
- Chổ màu đỏ là cell chứa Validaiton
- Chổ màu xanh là vùng dữ liệu cần lấy list duy nhất
Cứ tùy biến 2 chổ đỏ xanh ấy thoải mái, những chổ khác cứ để nguyên
Thày ơi, e có thử nghiệm code với file đính kèm, nhưng không chạy được... e ko hiểu cơ chế nên chỉ copy code và thay đổi tham chiếu.. hjk
Mong thầy và mng chị dẫn!!!
Excel 2007: Chọn ô trả ra kết quả trước > Data > Consolidate > Chọn hàm cần tính (nếu chỉ lấy list thì hàm nào cũng được) > Chọn vùng dữ liệu (List dữ liệu nằm bền trái, tối thiểu 2 cột) > Add > Check Left column > OK.
Thày ơi, e có thử nghiệm code với file đính kèm, nhưng không chạy được... e ko hiểu cơ chế nên chỉ copy code và thay đổi tham chiếu.. hjk
Mong thầy và mng chị dẫn!!!
Function Sort1DArray(ByVal Arr, Optional ByVal isText As Boolean = False, Optional ByVal isDESC As Boolean = False)
Dim sCommand As String
sCommand = "('" & Join(Arr, vbBack) & "').split('" & vbBack & "').sort("
If isText Then
sCommand = sCommand & ")"
Else
sCommand = sCommand & "function(a,b){return (a-b)})"
End If
If isDESC Then sCommand = sCommand & ".reverse()"
sCommand = sCommand & ".join('" & vbBack & "')"
With CreateObject("MSScriptControl.ScriptControl")
.Language = "JavaScript"
Sort1DArray = Split(.Eval(sCommand), vbBack)
End With
End Function
2> Sửa code sự kiện SelectionChange thành:
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Address = "$F$8" Then
Dim Arr, rng As Range
Set rng = Sheets("data").Range("list")
Arr = UniqueList(rng)
[COLOR=#ff0000][B] Arr = Sort1DArray(Arr, True, False)[/B][/COLOR]
If IsArray(Arr) Then
With Target
.Validation.Delete
.Validation.Add 3, , , Join(Arr, ",")
End With
End If
End If
End Sub
E có tham khảo tài liệu data validation in Excel của Thày PhanTuHuong trên GPE.
Mục "Tạo danh sách tham chiếu phụ thuộc"
E xin gửi theo vi dụ của thày PTH đính kèm.
Giả sử sắp tới Hà Nội thêm quận mới là quận Mỹ Đình, e có nhập tiếp vào danh sách mà mở rộng tham chiếu ở source list Quận/Huyện thì công thức này phá sản, hjk
Chẳng nhẽ mỗi lần thêm quân mới lại phải insert vào đúng phần Tỉnh/thành phố..??
Có giải pháp nào hoàn hảo hơn không ạh? Mong giúp đỡ
E có tham khảo tài liệu data validation in Excel của Thày PhanTuHuong trên GPE.
Mục "Tạo danh sách tham chiếu phụ thuộc"
E xin gửi theo vi dụ của thày PTH đính kèm.
Giả sử sắp tới Hà Nội thêm quận mới là quận Mỹ Đình, e có nhập tiếp vào danh sách mà mở rộng tham chiếu ở source list Quận/Huyện thì công thức này phá sản, hjk
Chẳng nhẽ mỗi lần thêm quân mới lại phải insert vào đúng phần Tỉnh/thành phố..??
Có giải pháp nào hoàn hảo hơn không ạh? Mong giúp đỡ
Công thức này bắt buộc phải tuân thủ quy tắc: Sort dữ liệu
Vậy nên trường hợp muốn nhập liệu thoải mái (nhập tiếp vào danh sách mà không cần phải chèn đúng chổ), bạn phải dùng đến VBA
Công thức này bắt buộc phải tuân thủ quy tắc: Sort dữ liệu
Vậy nên trường hợp muốn nhập liệu thoải mái (nhập tiếp vào danh sách mà không cần phải chèn đúng chổ), bạn phải dùng đến VBA
Có cách nào tạo một mảng ĐỘNG với tham chiếu điều kiện là Tỉnh/thành phố không ạh?
ví dụ: Nếu chọn Hà Nội trong file bài #35 có mảng động là [A2:A8,A22].. từ đó ta có thể offset sang Quận/huyện??
E hỏi thêm chút, liệu list có thể đưa ra gợi ý về việc lựa chọn (như kiểu đánh hàm số trên excel)
Giả dụ: nhập chữ H ở list thì đưa ra lựa chọn như: Hà Nội, Hà Nam... Hà Tiên ???