Hỏi về Data Validation

Liên hệ QC
E có một cột với nhiều số trùng nhau.. làm thể nào để đưa ra một ô dạng list của data validation các số là duy nhất
many tks!

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
 
E có một cột với nhiều số trùng nhau.. làm thể nào để đưa ra một ô dạng list của data validation các số là duy nhất
many tks!

Dùng chức năng có sẵn của excel: Data->consolidate

Tất nhiên là qua cột phụ, có điều nhanh gọn.
 
Dùng chức năng có sẵn của excel: Data->consolidate

Tất nhiên là qua cột phụ, có điều nhanh gọn.
Với cột phụ thì e có khả năng làm được, nhưng để file thêm nhỏ gọn nên e muốn add luôn vào soucre của list data validation ạh, hì
 
Với cột phụ thì e có khả năng làm được, nhưng để file thêm nhỏ gọn nên e muốn add luôn vào soucre của list data validation ạh, hì

Cột phụ thì ai cũng làm được, ý mình là nếu làm cột phụ thì mình nghĩ dùng consolidate là nhanh gọn nhất.
Không thì .. chỉ có VBA như anh NDU nói.
 
Với cột phụ thì e có khả năng làm được, nhưng để file thêm nhỏ gọn nên e muốn add luôn vào soucre của list data validation ạh, hì

Bạn đưa dữ liệu thật lên tôi làm luôn cho
(giả lập không đúng sự thật, mất công làm đi làm lại mệt lắm)
 
Bạn đưa dữ liệu thật lên tôi làm luôn cho
(giả lập không đúng sự thật, mất công làm đi làm lại mệt lắm)
Dạ, cảm ơn thày, thày có thể làm trên giả lập ko ạh, để học trò còn động não suy nghĩ cho dữ liệu thật..
 
Dạ, cảm ơn thày, thày có thể làm trên giả lập ko ạh, để học trò còn động não suy nghĩ cho dữ liệu thật..
1> Code trong Module:
Mã:
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
 

File đính kèm

  • data validation.xlsm
    14.8 KB · Đọc: 26
list duy nhất

1> Code trong Module:
Mã:
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!!!
 

File đính kèm

  • list.xlsb
    17.4 KB · Đọc: 9
consolidate dùng như thế nào bạn? mình chưa dùng chức năng này bao giờ, hì, tks
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.
Untitled.jpg
 
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!!!

Trong file bạn nói rằng:
List duy nhất ở ô màu đỏ lấy tham chiếu từ name list bên sheet data
Vậy mà code lại ghi:
Mã:
Set rng = Range("list")
thì sao mà được
Lý ra phải:
Mã:
Set rng = [COLOR=#ff0000]Sheets("data").[/COLOR]Range("list")
Chỉ rõ tên sheet nguồn đàng hoàng
 
Dạ, thật là tuyệt... vì là e áp dụng hơi máy móc, chưa hiểu về code ạh (nghĩ đơn giản là đặt name rồi thì áp dụng ở đâu cũng được), rất cảm ơn thày...
 
Trong file bạn nói rằng:

Vậy mà code lại ghi:
Mã:
Set rng = Range("list")
thì sao mà được
Lý ra phải:
Mã:
Set rng = [COLOR=#ff0000]Sheets("data").[/COLOR]Range("list")
Chỉ rõ tên sheet nguồn đàng hoàng
Cho e hỏi bổ đề chút là có thể tư động sort cái list (từ nhỏ đến lớn) trong sheet list đc ko ah?
 
Cho e hỏi bổ đề chút là có thể tư động sort cái list (từ nhỏ đến lớn) trong sheet list đc ko ah?

Được luôn!
1> Thêm code này vào Module:
Mã:
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
 

File đính kèm

  • list.xlsb
    20.3 KB · Đọc: 24
Danh sách tham chiếu phụ thuộc

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 đỡ
 

File đính kèm

  • Validation.xlsx
    10.9 KB · Đọc: 19
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
Mọi con đường đều dẫn đến VBA... Hì.. thày giúp em với ạh.
 
Mọi con đường đều dẫn đến VBA... Hì.. thày giúp em với ạh.
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??
 

File đính kèm

  • Validation.xlsm
    20.7 KB · Đọc: 25
Lần chỉnh sửa cuối:
Thật ra dạng bài này đã có rồi. Bạn xem topic này:
http://www.giaiphapexcel.com/forum/...a-validation-có-điều-kiện&p=535067#post535067

Mọi thứ đã có sẵn, ta vẽ thêm "con mèo" vào là xong! (trong 30 giây)
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 ???
 
Web KT

Bài viết mới nhất

Back
Top Bottom