Giúp đỡ về tạo list bằng validation

Liên hệ QC

alexanderhuti

Thành viên chính thức
Tham gia
25/8/09
Bài viết
62
Được thích
6
Em xin nhờ các cao thu giúp đỡ.

Giả sử em có cột dữ liệu từ A1 đến A như sau:
A1 quoc gia
A2 anh
A3 phap
A4 duc
A5 y
A6 anh
A7 phap
A8 anh
A9 phap
A10 y
Tại ô B1 em chọn Data Validation (Allow = List, Source = $A:$A), thì sẽ tạo ra 1 nút cuộn sổ xuống để em chọn giá trị. Trong ô sổ xuống đó sẽ có quoc gia, anh, phap, duc,y, roi lai anh, phap,...
Như vậy sẽ có rất nhiều giá trị trùng. Vậy có cách nào để list chỉ hiện ra mỗi 1 quốc gia chỉ 1 giá trị thôi (không trùng lặp) không? Em có thể dùng filter, sort nhưng em không muốn, vì em cần dùng validation này để kết hợp với cái khác nữa.
Vui lòng chỉ giúp em. Thanks!
 
Em xin nhờ các cao thu giúp đỡ.

Giả sử em có cột dữ liệu từ A1 đến A như sau:
A1 quoc gia
A2 anh
A3 phap
A4 duc
A5 y
A6 anh
A7 phap
A8 anh
A9 phap
A10 y
Tại ô B1 em chọn Data Validation (Allow = List, Source = $A:$A), thì sẽ tạo ra 1 nút cuộn sổ xuống để em chọn giá trị. Trong ô sổ xuống đó sẽ có quoc gia, anh, phap, duc,y, roi lai anh, phap,...
Như vậy sẽ có rất nhiều giá trị trùng. Vậy có cách nào để list chỉ hiện ra mỗi 1 quốc gia chỉ 1 giá trị thôi (không trùng lặp) không? Em có thể dùng filter, sort nhưng em không muốn, vì em cần dùng validation này để kết hợp với cái khác nữa.
Vui lòng chỉ giúp em. Thanks!

cách thông thường là:
1-lọc giá trị duy nhất trong cột A--->ra một cột tạm nào đó, bằng cthức hoặc bằng advanveced filter--->sau đó đặt name cho vùng này là list.
2-còn ko muốn cột phụ thì dùng vba
 
Mình cảm ơn bạn "nhapmon"
Vậy bạn có thể cho mình xin đoạn code vba này không. Cảm ơn bạn
 

File đính kèm

  • ValidationList.rar
    16.3 KB · Đọc: 25
tôi ko rành vba lắm, tôi thấy các cao thủ thường dùng Dic...
tôi thì chỉ dùng advanced filer thôi........
Chào bạn nhapmon,
Với trường hợp như thế này có thể không dùng Dic bạn ah. Bạn có thể tham khảo thuật toán sau, mình thấy nó rất hay.
Mã:
Sub vali()
    Dim Arr, Tmp As String
    Arr = Sheet1.Range("A1:A" & Sheet1.Range("A65536").End(3).Row)
    For i = 1 To UBound(Arr)
        If InStr(1, Tmp, Arr(i, 1)) = 0 Then Tmp = Tmp & "," & Arr(i, 1)
    Next
    With Sheet1.[B2]
        .Validation.Delete
        .Validation.Add 3, , , Tmp
    End With
End Sub
 
Chào bạn nhapmon,
Với trường hợp như thế này có thể không dùng Dic bạn ah. Bạn có thể tham khảo thuật toán sau, mình thấy nó rất hay.
Mã:
Sub vali()
    Dim Arr, Tmp As String
    Arr = Sheet1.Range("A1:A" & Sheet1.Range("A65536").End(3).Row)
    For i = 1 To UBound(Arr)
        If InStr(1, Tmp, Arr(i, 1)) = 0 Then Tmp = Tmp & "," & Arr(i, 1)
    Next
    With Sheet1.[B2]
        .Validation.Delete
        .Validation.Add 3, , , Tmp
    End With
End Sub
Hãy cẩn thận khi dùng InStr để lọc duy nhất.
Với cột dữ liệu đã sắp xếp thế này: "Ba Tê", "dhn46", "Ba", "dhn4" thì kết quả sẽ bị "tèo". Híc
Thân
 
Hãy cẩn thận khi dùng InStr để lọc duy nhất.
Với cột dữ liệu đã sắp xếp thế này: "Ba Tê", "dhn46", "Ba", "dhn4" thì kết quả sẽ bị "tèo". Híc
Thân
- Vâng bác concogia nói rất đúng, Code mang tính tham khảo về thuật toán, nhưng nếu vận dụng linh hoạt hơn 1 chút là cũng có thể xử lý phần nào đó (ví dụ: thêm * vào đầu và cuỗi chuỗi => *dhn4*,*dhn46* => tìm chuỗi *dhn4* sẽ khác *dhn46*)
- Trên GPE dhn46 học được thuật toán này chính là từ 1 bài viết của bác đó :)

Cảm ơn bác chúc bác sức khỏe, thành công. (tạc lon mạnh như viết Code)
 
Vậy xin hỏi bác "dhn46" thì trường hợp của em phải làm thế nào ạ.
 
ghi chú: ở cột A hàng ngày em sẽ nhập thêm dữ liệu.
 
Web KT

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

Back
Top Bottom