Làm sao lọc không trùng danh sách có mã số vào một Combobox (2 cột)?

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
Mình có Danh Sách và Mã số tên, khi phát sinh nghiệp vụ mới mình tạo ra 1 Mã số phát sinh, khi mình trích lọc từ Combo khách hàng thì Combo Mã số phát sinh nhận tham số từ Combo khách hàng. Mình muốn tại combo khách hàng, ngoài cái tên được lọc không trùng có thêm mã số gốc của tên.

Xin xem File đính kèm.

Cám ơn rất nhiều!
 

File đính kèm

Mình có Danh Sách và Mã số tên, khi phát sinh nghiệp vụ mới mình tạo ra 1 Mã số phát sinh, khi mình trích lọc từ Combo khách hàng thì Combo Mã số phát sinh nhận tham số từ Combo khách hàng. Mình muốn tại combo khách hàng, ngoài cái tên được lọc không trùng có thêm mã số gốc của tên.

Xin xem File đính kèm.

Cám ơn rất nhiều!
Sửa UDF UniqueList thành vầy:
PHP:
Private Function UniqueList(ListRange As Range)
  Dim Clls As Range, Dic, Arr(), i As Long
  Set Dic = CreateObject("Scripting.Dictionary")
  For Each Clls In ListRange
    If Not IsEmpty(Clls) And Not Dic.Exists(Clls.Value) Then
      Dic.Add Clls.Value, ""
      ReDim Preserve Arr(1, i)
      Arr(0, i) = Clls.Value
      Arr(1, i) = Clls(, 2).Value
      i = i + 1
    End If
  Next Clls
  UniqueList = Arr
End Function
Sự kiện Initialize của Form:
PHP:
Private Sub UserForm_Initialize()
  On Error Resume Next
  With Range(Sheet1.[A2], Sheet1.[A65536].End(xlUp))
    CboKhachHang.List() = WorksheetFunction.Transpose(UniqueList(.Cells))
  End With
  CboKhachHang.SetFocus: CboKhachHang.SelStart = 0: CboKhachHang.SelLength = Len(CboKhachHang.Text)
End Sub
Tức là tạo mảng 2 chiều từ trong UniqueList Function luôn còn Dictionary Object chỉ làm nhiệm vụ kiểm tra TRÙNG chứ chẳng xài vào việc gì cả
 

File đính kèm

Upvote 0
Cám ơn Thầy NDU thật nhiều! Em không nghĩ được trả lời nhanh đến như vậy!
 
Upvote 0
Thầy ơi, em đảo cột Mã số lên trước, cột tên ra sau, thì cái Cobo Mã phát sinh nó không nhận tham số? Nếu cột mã số là Text thì nó lại nhận, còn số thì nó "ngu" Thầy ơi.
 
Upvote 0
Thầy ơi, em đảo cột Mã số lên trước, cột tên ra sau, thì cái Cobo Mã phát sinh nó không nhận tham số? Nếu cột mã số là Text thì nó lại nhận, còn số thì nó "ngu" Thầy ơi.
Gữi file đang "gãy" lên đây cho dễ hình dung nhé
 
Upvote 0
Trong code CboKhachHang_Change, bạn có thể sửa đoạn
If Clls.Value = CboKhachHang Then
thành:
If Clls.Value = Val(CboKhachHang) Then
Cũng được vậy

Hehehehe, vậy là File nó không "ngu" mà em mới là đứa "ngu ngu", do không xem xét kỹ!

Cám ơn Thầy!
 
Upvote 0
Hehehehe, vậy là File nó không "ngu" mà em mới là đứa "ngu ngu", do không xem xét kỹ!

Cám ơn Thầy!
Bạn có từng nghĩ đến trường hợp cột Mã Số chứa giá trị vừa là Text vừa là Number thì sẽ thế nào không?
Giống vầy đây:

untitled.JPG

Lúc này dùng Val(..) là không ăn thua
Thử nghiên cứu giải pháp xem
Ec.. Ec...
 
Upvote 0
Bạn có từng nghĩ đến trường hợp cột Mã Số chứa giá trị vừa là Text vừa là Number thì sẽ thế nào không?
Giống vầy đây:

View attachment 47239

Lúc này dùng Val(..) là không ăn thua
Thử nghiên cứu giải pháp xem
Ec.. Ec...

Không biết Thầy có "bẩy" gì trong câu hỏi này không chứ nó quá đơn giản mà Thầy???
Chỉ thêm một cái OR thôi là giải quyết được vấn đề rồi mà?!

For Each Clls In Range(Sheet1.[A2], Sheet1.[A65536].End(xlUp))
If Clls.Value = Val(Combo1) Or Clls.Value = Combo1 Then

Tôi lại tiếp tục làm thêm một cái Combo2 cũng trích lọc tên không trùng, nhưng bằng AdvanceFilter. Theo các bạn, có nhận thấy sự khác biệt giữa 2 combo này không? Và theo các bạn, một cái trích lọc theo Hàm, một cái là AdvanceFilter thì cái nào hiệu quả cao hơn, nhanh hơn?
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Không biết Thầy có "bẩy" gì trong câu hỏi này không chứ nó quá đơn giản mà Thầy???
Chỉ thêm một cái OR thôi là giải quyết được vấn đề rồi mà?!

For Each Clls In Range(Sheet1.[A2], Sheet1.[A65536].End(xlUp))
If Clls.Value = Val(Combo1) Or Clls.Value = Combo1 Then

Tôi lại tiếp tục làm thêm một cái Combo2 cũng trích lọc tên không trùng, nhưng bằng AdvanceFilter. Theo các bạn, có nhận thấy sự khác biệt giữa 2 combo này không? Và theo các bạn, một cái trích lọc theo Hàm, một cái là AdvanceFilter thì cái nào hiệu quả cao hơn, nhanh hơn?
Advanced Filter theo tôi sẽ cho tốc độ rất nhanh... tuy nhiên, cái dở của nó là cần 1 vùng phụ để lưu dữ liệu sau lọc
Nói thì nói vậy chứ code lọc UniqueList dùng Dictionary Object cũng không phải là chậm lắm đâu nha ---> Vì nó lấy dữ liệu và cho vào 1 biến nhớ (ảo) chứ không làm gì trực tiếp trên sheet cả ---> Đến khi cần lấy thì ta thực thi từ biến nhớ này (vẫn tốt như thường)
 
Upvote 0
Advanced Filter theo tôi sẽ cho tốc độ rất nhanh... tuy nhiên, cái dở của nó là cần 1 vùng phụ để lưu dữ liệu sau lọc
Nói thì nói vậy chứ code lọc UniqueList dùng Dictionary Object cũng không phải là chậm lắm đâu nha ---> Vì nó lấy dữ liệu và cho vào 1 biến nhớ (ảo) chứ không làm gì trực tiếp trên sheet cả ---> Đến khi cần lấy thì ta thực thi từ biến nhớ này (vẫn tốt như thường)

Ngoài những cái Thầy nói, thì cái Combo1 nó chưa hay ở điểm không thể tạo Column Header (không quan trọng), đặc biệt khi gõ vào mã số nào đó, nó không update vào Textbox tên của mã số đó liền, nhưng Combo2 thì làm được. Cũng là gõ mã số, ví dụ là 3, rồi bấm phím lên hoặc xuống Combo2 sẽ hiểu là số liền kề trên (4) hoặc dưới (2X), điều này Combo1 không hiểu, nó cho giá trị đầu tiên tức là 1 (chỉ khi ta chọn bằng cách xổ cái list trong combo1 ra rồi chọn một mã số nào đó, thì mới bấm lên, xuống nó mới hiểu).
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom