lọc danh sách không bị trùng tên và khoảng trắng cho combobox & validation list

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,662
Được thích
16,720
Giới tính
Nam
Kính thưa các Thầy Cô, Anh Chị,
Tôi có một danh sách, một combobox và một data validation list.
Có CODE nào để lọc danh sách không bị trùng tên, không bị khoảng trắng cho comboboxlist hay không, và dùng name động được để co giản danh sách đã được lọc được không?
(không thêm bất kỳ nút comandbutton nào nhé, chỉ cần click vào combobox, list là danh sách đã được lọc)
Xin cảm ơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Kính thưa các Thầy Cô, Anh Chị,
Tôi có một danh sách, một combobox và một data validation list.
Có CODE nào để lọc danh sách không bị trùng tên, không bị khoảng trắng cho comboboxlist hay không, và dùng name động được để co giản danh sách đã được lọc được không?
(không thêm bất kỳ nút comandbutton nào nhé, chỉ cần click vào combobox, list là danh sách đã được lọc)
Xin cảm ơn.
Thử code này xem:
PHP:
Private Sub ComboBox1_DropButtonClick()
  With Range([A3], [A65536].End(xlUp))
    ComboBox1.List() = UniqueList(.Cells)
  End With
End Sub
PHP:
Private Function UniqueList(Range As Range)
  Dim Clls As Range
  With CreateObject("Scripting.Dictionary")
    For Each Clls In Range
      If Not IsEmpty(Clls) And Not .Exists(Clls.Value) Then
        .Add Clls.Value, Clls.Value
      End If
    Next Clls
    UniqueList = .Keys
  End With
End Function
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cái combobox này có 1 điểm không biết có giải quyết dc không, đó là nếu value label ở dạng tiếng việt có dấu khi chọn xong nó sẽ hiển thị lỗi font...vd như trong file của ndu, "nguyễn văn..." sẽ thành "nguy?n văn..."
 
Upvote 0
Em cám ơn Thầy Ndu nhiều lắm, nhờ Code của Thầy (đặc biệt Thầy dùng Dictionary thật độc đáo) đã giải quyết được vấn đề Combobox. Thưa Thầy còn cái List trong Validation thì sao ạ?



Cái combobox này có 1 điểm không biết có giải quyết dc không, đó là nếu value label ở dạng tiếng việt có dấu khi chọn xong nó sẽ hiển thị lỗi font...vd như trong file của ndu, "nguyễn văn..." sẽ thành "nguy?n văn..."

Mình không quan tâm đến cái vấn đề Font, bởi vì giá trị thực sự của Combobox không nằm trong đó mà là địa chỉ mà giá trị đó gán vào (LinkCell) hoàn toàn hiển thị bằng tiếng Việt! Bạn có thể thu nhỏ cái combobox lại, chỉ còn chừa cái nút thôi thì OK rồi phải không?
 
Lần chỉnh sửa cuối:
Upvote 0
Em cám ơn Thầy Ndu nhiều lắm, nhờ Code của Thầy (đặc biệt Thầy dùng Dictionary thật độc đáo) đã giải quyết được vấn đề Combobox. Thưa Thầy còn cái List trong Validation thì sao ạ?





Mình không quan tâm đến cái vấn đề Font, bởi vì giá trị thực sự của Combobox không nằm trong đó mà là địa chỉ mà giá trị đó gán vào (LinkCell) hoàn toàn hiển thị bằng tiếng Việt! Bạn có thể thu nhỏ cái combobox lại, chỉ còn chừa cái nút thôi thì OK rồi phải không?

Vấn đề ở đây là trên forum này chúng ta cùng nhau tham khảo và cho ý kiến để các cao thủ nghiên cứu chỉ giáo và mọi người nhờ đó trau dồi thêm kiến thức...

---> bạn không nên chỉ quan tâm đến việc đạt dc những cái mình cần.
 
Upvote 0
Vấn đề ở đây là trên forum này chúng ta cùng nhau tham khảo và cho ý kiến để các cao thủ nghiên cứu chỉ giáo và mọi người nhờ đó trau dồi thêm kiến thức...

---> bạn không nên chỉ quan tâm đến việc đạt dc những cái mình cần.

Bạn chưa hiểu ý mình, bạn cứ thử file mình (code của Thầy Anh Tuấn) và click vào cái combobox, thì sẽ nhìn ngay ra vấn đề mình nói. Lý do mà bạn đưa ra về lỗi Font là không khả thi vì hiện tại VBA chưa hỗ trợ cho UniCode. (Bạn có thể chuyển qua Font VNI Window thì OK).
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
À, còn một vấn đề nữa em muốn hỏi Thầy NDU là nếu cái danh sách kia ở Sheet2 thì làm sao chuyển qua cái Combobox ở Sheet1 được ạ? Em đã thử nhiều lần mà đều báo lỗi 1004? Em tệ quá!

Private Sub ComboBox1_DropButtonClick()
With Range(Sheet2.[A3], Sheet2.[A65536].End(xlUp))
ComboBox1.List() = UniqueList(.Cells)
End With
End Sub

Hoặc:

Private Sub ComboBox1_DropButtonClick()
With Sheet2.Range([A3], [A65536].End(xlUp))
ComboBox1.List() = UniqueList(.Cells)
End With
End Sub
 
Upvote 0
Em cám ơn Thầy Ndu nhiều lắm, nhờ Code của Thầy (đặc biệt Thầy dùng Dictionary thật độc đáo) đã giải quyết được vấn đề Combobox. Thưa Thầy còn cái List trong Validation thì sao ạ?
Validation thì hơi khác (nhớ không lầm đã từng bàn trên diển đàn rồi
Cách thực hiện như sau:
- AutoFilter với điều kiện NonBlanks (hoặc dùng SpecialCells(2)... ) rồi copy dử liệu đang hiện ra nơi khác
- Tạo name liên kết với vùng dử liệu vừa trích rồi đặt Validation theo list này
Chỉ có cách đó thôi!
-------------------------
À, còn một vấn đề nữa em muốn hỏi Thầy NDU là nếu cái danh sách kia ở Sheet2 thì làm sao chuyển qua cái Combobox ở Sheet1 được ạ? Em đã thử nhiều lần mà đều báo lỗi 1004? Em tệ quá!

Private Sub ComboBox1_DropButtonClick()
With Range(Sheet2.[A3], Sheet2.[A65536].End(xlUp))
ComboBox1.List() = UniqueList(.Cells)
End With
End Sub

Hoặc:

Private Sub ComboBox1_DropButtonClick()
With Sheet2.Range([A3], [A65536].End(xlUp))
ComboBox1.List() = UniqueList(.Cells)
End With
End Sub
Dùng cái này:
With Sheet2.Range(Sheet2.[A3], Sheet2.[A65536].End(xlUp))
Chẳng hiểu sao có trường hợp không cần tên sheet ở đầu nó vẫn chiu ---> Trường hợp này lại phải ghi đầy đủ
-------------
Nói thêm: Nếu UDF UniqueList bạn sử dụng nhiều lần thì nên đưa nó ra riêng 1 Module nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Thử code này xem:
PHP:
Private Sub ComboBox1_DropButtonClick()
  With Range([A3], [A65536].End(xlUp))
    ComboBox1.List() = UniqueList(.Cells)
  End With
End Sub
PHP:
Private Function UniqueList(Range As Range)
  Dim Clls As Range
  With CreateObject("Scripting.Dictionary")
    For Each Clls In Range
      If Not IsEmpty(Clls) And Not .Exists(Clls.Value) Then
        .Add Clls.Value, Clls.Value
      End If
    Next Clls
    UniqueList = .Keys
  End With
End Function
Nội dung của mình cũng tương tự trên nhưng mình muốn sắp xếp tăng dần thì phải sửa code lại như thế nào? Xin Thầy Ndu chỉ giúp ạ. Cám ơn Thầy rất nhiều.
 
Upvote 0
Nội dung của mình cũng tương tự trên nhưng mình muốn sắp xếp tăng dần thì phải sửa code lại như thế nào? Xin Thầy Ndu chỉ giúp ạ. Cám ơn Thầy rất nhiều.
Cách dể nhất là đừng dùng UDF này ---> Hãy dùng Advanced Filter với tùy chọn Unique records only, lọc nó ra 1 cột phụ rồi sort cột này
--------------
Sorry bạn minhthien321, lý ra phải dùng cách mà tôi vừa nói ở trên (Advanced Filter\Unique) chứ không phải là AutoFilter
 
Upvote 0
Thử code này xem:
PHP:
Private Function UniqueList(Range As Range)
  Dim Clls As Range
  With CreateObject("Scripting.Dictionary")
    For Each Clls In Range
      If Not IsEmpty(Clls) And Not .Exists(Clls.Value) Then
        .Add Clls.Value, Clls.Value
      End If
    Next Clls
    UniqueList = .Keys
  End With
End Function

Em thích đoạn code này nhưng chưa hiểu tại sao phải 02 lần Clls.Value, Clls.Value

 
Upvote 0
Validation thì hơi khác (nhớ không lầm đã từng bàn trên diển đàn rồi
Cách thực hiện như sau:
- AutoFilter với điều kiện NonBlanks (hoặc dùng SpecialCells(2)... ) rồi copy dử liệu đang hiện ra nơi khác
- Tạo name liên kết với vùng dử liệu vừa trích rồi đặt Validation theo list này
Chỉ có cách đó thôi!
-------------------------
ndu96081631 đã viết:
Cách dể nhất là đừng dùng UDF này ---> Hãy dùng Advanced Filter với tùy chọn Unique records only, lọc nó ra 1 cột phụ rồi sort cột này.

Bác xem lại những cụm từ màu đỏ này, hình như phải phân biệt "hỏi", "ngã" chứ nhể? Mình góp một ý thế thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
SeaLand đã viết:
Một lần nạp key, một lần nạp Item. Vì dùng key là chính nên cũng có thể viết như sau cho nhẹ Object:
Thưa anh SeaLand,
Muội dốt quá vẫn chưa hiểu tại sao mỗi lần nạp key lại phải nạp một Items?
 
Upvote 0
Thưa anh SeaLand,
Muội dốt quá vẫn chưa hiểu tại sao mỗi lần nạp key lại phải nạp một Items?
Ví dụ ta có trước đoạn code này
PHP:
Dim Dic
Set Dic = CreateObject("Scripting.Dictionary")
- Cú pháp nạp dữ liệu cho Dictionary là:
Dic.Add Key, Item
- Mỗi lần nạp như vậy thì Key sẽ được cho vào nhóm KeysItem sẽ được cho vào nhóm Items
- Item có thể là bất cứ giá trị gì nhưng Key bắt buộc phải là những phần tử không trùng nhau trong nhóm Keys ---> Và ta áp dụng tính chất này của Dictionary để lấy unique list
- Nếu không muốn Add giá trị cho Item thì có thể viết thế này:
Dic.Add Key,""
hoặc giống như anh Sealand làm ở trên
Đây thuộc về cú pháp (quy định) nên dù muốn hay không cũng phải viết cho đầy đủ! Thế thôi!
(bạn đặc biết lưu ý: Key khác với KeysItem khác với Items nha)
-----------------------------------
Bác xem lại những cụm từ màu đỏ này, hình như phải phân biệt "hỏi", "ngã" chứ nhể? Mình góp một ý thế thôi.
Trước đây còn sai tợn.... giờ đã cố gắng lắm rồi mà vẫn còn sai... Ẹc... Ẹc... (nhưng có khá hơn chút)
Cảm ơn bạn đã nhắc nhở, vì mỗi lần như thế tôi lại.. nhớ thêm 1 chữ
 
Lần chỉnh sửa cuối:
Upvote 0
Lọc danh sách không trùng các bạn có thể tham khảo tại đây.

Lê Văn Duyệt
 
Upvote 0
Thưa anh SeaLand,
Muội dốt quá vẫn chưa hiểu tại sao mỗi lần nạp key lại phải nạp một Items?
Ngay cái tên của nó cũng đã thể hiện cấu trúc này rồi. Nó giống như 1 từ điển hay 1 danh mục. Key là mã để tìm kiếm, xác định khoá mã của 1 đề mục này khác với mọi đề mục khác.
Ví dụ: Dic.Add "Dong Thap", "Đồng Tháp: Một tỉnh thuộc khu vực đồng bằng Nam Bộ"

Khi tìm kiếm người ta tìm theo Key hay Index của Key. Khi đã thấy Key thì ta cũng có thể lấy được Item.Giả sử bạn là người nước ngoài muốn tham khảo từ "Dong Thap" thì sẽ được diễn giải chi tiết về từ đó.
Mình nói rõ thêm 2 thuật ngữ mà Ndu đã nói ở trên:
-Key là khoá mã của 1 đề mục.
-Keys: là tổ hợp khoá mã có trong Dic. Nó giống như 1 mục lục 1 cấp, từ đây ta tra từ khoá (Key) để tìm nghĩa (Item)

Còn mình nói sử dụng Key là chính là vì ta cần nạp mã VT chứ không phải nhập tên VT. Key thì bắt buộc duy nhất nhưng Item thì có thể trùng nhau.
 
Lần chỉnh sửa cuối:
Upvote 0
Bác NDU ơi, đối với Vlidation list bác có thể chỉ thêm cho em không ? cụ thể hơn ý, làm sao để nó không lấy dữ liệu trùng và không lấy những dòng trống. em làm hoài mà không được bác a
 
Upvote 0
Bác NDU ơi, đối với Vlidation list bác có thể chỉ thêm cho em không ? cụ thể hơn ý, làm sao để nó không lấy dữ liệu trùng và không lấy những dòng trống. em làm hoài mà không được bác a
Ở trên đã nói rồi còn gì ---> Bạn dùng Advanced Filter lọc ra 1 vùng phụ rồi gán vùng này vào Validation list (đương nhiên khi lọc bằng Advanced Filter, bạn phải check vào mục Unique Records only nhé)
 
Upvote 0
Web KT

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

Back
Top Bottom