Tìm kiếm dữ liệu trong form (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

doanhhoang79

Thành viên hoạt động
Tham gia
31/3/08
Bài viết
142
Được thích
18
Có ai có mẫu tìm kiếm dữ liệu trong Form không? Tôi đang muốn tham khảo

Ai biết chỉ cho tôi với,

Cảm ơn,
 
Có ai có mẫu tìm kiếm dữ liệu trong Form không? Tôi đang muốn tham khảo

Ai biết chỉ cho tôi với,

Cảm ơn,
Thuật toán TÌM KIẾM thì nhiều lắm, chẳng hạn như có thể dùng Find, AutoFilter, Advanced Filter... hoặc các hàm tìm kiếm của Excel...
Quan trọng là sau khi tìm ta sẽ làm gì
Dù sao, bạn phải có file và nói rõ mục đích mới có thể giải quyết vấn đề
 
Upvote 0
vẫn xung quanh cái vụ của bác Nguyen Duy Long thôi anh ndu ạ,
Mặc dù bác Duy Long đã giúp đỡ nhưng em thấy code này hình như vẫn chưa ổn lắm.
Sau khi click nút tìm kiếm rồi Dblclick vào listbox nó vẫn báo lỗi và cho kết quả không chính xác. Anh ndu kiểm tra code giúp em với, xem cần bổ sung gì thêm không?

Em gửi file VD đính kèm,

Cơm ơn anh,

- -- - - - - - - - - - -

Nó báo lỗi ở dòng này:
rg = Sheet1.Range("A1:A10000").Find(UserForm2.ListBox1.List(a - 1, 0)).Row
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Nó báo lỗi ở dòng này:
rg = Sheet1.Range("A1:A10000").Find(UserForm2.ListBox1.List(a - 1, 0)).Row
Xem file của bạn, tôi nghĩ nếu nó báo lổi thì chăng qua là do ta chưa khai báo biến mà thôi!
Thử thêm dòng:
Dim rg As Range
Rồi test lại xem!
Ngoài ra hãy thêm dòng:
On Error Resume Next
vào đầu code, phòng trường hợp tìm không thấy sẽ báo lổi
-----------
Tuy nhiên, nhìn mấy Form này thấy nó sao sao ấy ---> Tìm để làm cái gì mới được chứ ---> Sao bạn không đưa file thực tế của bạn lên (file này tôi nghĩ chỉ là giả lập, không thực tế tí nào)
 
Lần chỉnh sửa cuối:
Upvote 0
Cái chính là cái Form của bạn và cơ chế tìm kiếm của bạn không thực tế thôi. Cái Form điều kiện tìm kiếm y chang cái form gốc vậy thì thà tìm luôn trên Form gốc cho nhanh.Mình xin tham gia như sau:

1/Form điều kiện thường nhập tìm mã bắt đầu bằng ký tự gì, có chứa ký tự gì, kết thúc ký tự gì hay đúng mã nào đó.

2/Cơ chế tìm kiếm có 2 dạng:
-Chuyển nhanh đến dòng đầu tiên thỏa mãn điều kiện.
-Lọc và chỉ để lại trên Form những dòng fù hợp, như vậy lựa chọn rất nhanh.
 
Upvote 0
Cái chính là cái Form của bạn và cơ chế tìm kiếm của bạn không thực tế thôi. Cái Form điều kiện tìm kiếm y chang cái form gốc vậy thì thà tìm luôn trên Form gốc cho nhanh.Mình xin tham gia như sau:

1/Form điều kiện thường nhập tìm mã bắt đầu bằng ký tự gì, có chứa ký tự gì, kết thúc ký tự gì hay đúng mã nào đó.

2/Cơ chế tìm kiếm có 2 dạng:
-Chuyển nhanh đến dòng đầu tiên thỏa mãn điều kiện.
-Lọc và chỉ để lại trên Form những dòng fù hợp, như vậy lựa chọn rất nhanh.

Anh nói đúng, File em đưa là VD giả thiết thôi,
thực tế nó chỉ lọc ra những dòng cần thiết thôi.
Em muốn sau khi tìm ra những dòng mong muốn rồi thì mình Dblclick vào dòng đó, nó sẽ đưa con chuột đến đúng dữ liệu đó ở Listbox trong Form1

Xem file của bạn, tôi nghĩ nếu nó báo lổi thì chăng qua là do ta chưa khai báo biến mà thôi!
Thử thêm dòng:
Dim rg As Range
Rồi test lại xem!
Ngoài ra hãy thêm dòng:
On Error Resume Next
vào đầu code, phòng trường hợp tìm không thấy sẽ báo lổi
-----------
Tuy nhiên, nhìn mấy Form này thấy nó sao sao ấy ---> Tìm để làm cái gì mới được chứ ---> Sao bạn không đưa file thực tế của bạn lên (file này tôi nghĩ chỉ là giả lập, không thực tế tí nào)

Em giải thích thế này:
Giả sử anh có 01 Form1 trong đó có 01 listbox với hàng nghìn dòng dữ liệu. Làm thế nào để anh tìm đến dữ liệu cần tìm một cách nhanh nhất. Anh không thể dò tìm từng dữ liệu, sẽ mất rất nhiều thời gian.
Vì vậy em phải dùng thêm 01 form tìm kiếm với 01 listbox hiện kết quả, sau khi tìm được dữ liệu rồi thì chỉ cần Dblclick vào dữ liệu đó, nó sẽ đưa chỏ chuột đến dữ liệu trong listbox ở Form1. Như vậy sẽ nhanh và pro hơn không???
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Bạn tham khảo cách lọc Auto Filter trong phần Custom ấy. Đấy là 1 dạng Form điều kiện lọc tiêu biểu đấy
P/S: Với yêu cầu của bạn chả có lý gì mà lại tất cả đều bắt đầu bằng M cả Nếu vậy phần mã này thừa. Mình ví dụ danh sách nhân viên ta có mã Phòng Kế toán: KT001, KT002..., Phòng Nhân sự NS001, NS002... Quầy hàng số 1 : 1Q001, 1Q002... Quầy số 2 2Q001, 2Q002
Như vậy ta thiết lập MatchRequired=True thì bạn chỉ cần gõ ký tự đầu tiên của nhóm thì List hay Comb sẽ nhảy nhanh đến dòng đầu tiên của nhóm. Bạn xem chính Form của bạn chỉ cần gõ chữ cái đầu lađến rồi
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Em giải thích thế này:
Giả sử anh có 01 Form1 trong đó có 01 listbox với hàng nghìn dòng dữ liệu. Làm thế nào để anh tìm đến dữ liệu cần tìm một cách nhanh nhất. Anh không thể dò tìm từng dữ liệu, sẽ mất rất nhiều thời gian.
Vì vậy em phải dùng thêm 01 form tìm kiếm với 01 listbox hiện kết quả, sau khi tìm được dữ liệu rồi thì chỉ cần Dblclick vào dữ liệu đó, nó sẽ đưa chỏ chuột đến dữ liệu trong listbox ở Form1. Như vậy sẽ nhanh và pro hơn không???
Nếu là tôi thì tôi làm khác ---> Gõ 1 vài ký tự gợi nhớ vào TextBox, bấm nút TÌM, nó sẽ Show vào ListBox những Record có liên quan (giống như tra từ điển ấy) ---> Và đúng như anh Sealand nhận xét, trò này AutoFilter làm ngon lành (chứ ai lại thiết kế ra 2 cái Form kỳ dị như bạn thế kia)
 
Upvote 0
Nếu là tôi thì tôi làm khác ---> Gõ 1 vài ký tự gợi nhớ vào TextBox, bấm nút TÌM, nó sẽ Show vào ListBox những Record có liên quan (giống như tra từ điển ấy) ---> Và đúng như anh Sealand nhận xét, trò này AutoFilter làm ngon lành (chứ ai lại thiết kế ra 2 cái Form kỳ dị như bạn thế kia)

Em đồng ý quan điểm của các bác,
Các bác có file mẫu cụ thể không gửi em tham khảo với. Lưu ý các tháo tác hoàn toàn thực hiện trên form (không thực hiện ở trong sheet)

Em cảm ơn,
 
Upvote 0
Để đáp ứng đươc việc lọc với cơ chế chứa 1 vài ký tự gợi ý như Ndu thì ta nên viết sub nạp Item cho List hay Comb chứ không gán đơn giản được. Như vậy, mã nào thỏa mãn thì nạp.

Có 1 cách là RemoveItem không thỏa mãn nhưng khi reset (Hủy lọc) khônglấy lại tất cả các mã được mà chỉ load lại Form mới đwợc
 
Upvote 0
Để đáp ứng đươc việc lọc với cơ chế chứa 1 vài ký tự gợi ý như Ndu thì ta nên viết sub nạp Item cho List hay Comb chứ không gán đơn giản được. Như vậy, mã nào thỏa mãn thì nạp.

Có 1 cách là RemoveItem không thỏa mãn nhưng khi reset (Hủy lọc) khônglấy lại tất cả các mã được mà chỉ load lại Form mới đwợc

Nếu load lại form em thấy có vẻ không Pro cho lắm.
Nếu thực hiện công việc này trực tiếp trên sheet em nghĩ nó sẽ đơn giản hơn. Nhưng đây phải thực hiện trên form nên em phải nhờ các cao thủ giúp đỡ.
 
Lần chỉnh sửa cuối:
Upvote 0
Em đồng ý quan điểm của các bác,
Các bác có file mẫu cụ thể không gửi em tham khảo với. Lưu ý các tháo tác hoàn toàn thực hiện trên form (không thực hiện ở trong sheet)

Em cảm ơn,
Đây là 1 mẫu vừa làm xong! Bạn thử xem!
Gọi Form lên, cần tìm cái gì cứ gõ vào TextBox ---> Ví dụ bạn gõ AAB thì lập tức tất cả những mã nào có 3 ký tự đầu là AAB sẽ hiện ra trong ListBox ---> Làm gì nữa tiếp sau đó là tùy bạn
code:
PHP:
Private Sub TextBox1_Change()
  Dim Clls As Range
  Application.ScreenUpdating = False
  With Sheet1.Range(Sheet1.[A1], Sheet1.[A65536].End(xlUp))
    ListBox1.Clear
    .AutoFilter 1, TextBox1.Value & "*"
    For Each Clls In .Offset(1).SpecialCells(12).SpecialCells(2)
      ListBox1.AddItem (Clls)
    Next
    .AutoFilter
  End With
  Application.ScreenUpdating = True
End Sub
Bạn thấy đấy, thuật toán chính là AutoFilter, phần râu ria còn lại quá đơn giản luôn!
 

File đính kèm

Upvote 0
Đây là 1 mẫu vừa làm xong! Bạn thử xem!
Gọi Form lên, cần tìm cái gì cứ gõ vào TextBox ---> Ví dụ bạn gõ AAB thì lập tức tất cả những mã nào có 3 ký tự đầu là AAB sẽ hiện ra trong ListBox ---> Làm gì nữa tiếp sau đó là tùy bạn
code:
PHP:
Private Sub TextBox1_Change()
  Dim Clls As Range
  Application.ScreenUpdating = False
  With Sheet1.Range(Sheet1.[A1], Sheet1.[A65536].End(xlUp))
    ListBox1.Clear
    .AutoFilter 1, TextBox1.Value & "*"
    For Each Clls In .Offset(1).SpecialCells(12).SpecialCells(2)
      ListBox1.AddItem (Clls)
    Next
    .AutoFilter
  End With
  Application.ScreenUpdating = True
End Sub
Bạn thấy đấy, thuật toán chính là AutoFilter, phần râu ria còn lại quá đơn giản luôn!

Phương pháp của anh ndu rất hay, em sẽ áp dụng vào ứng dụng thực tế của mình,
cảm ơn bác,
Chủ nhật mà bác vẫn vất vả quá nhưng vui bác nhỉ,
 
Upvote 0
Phương pháp của anh ndu rất hay, em sẽ áp dụng vào ứng dụng thực tế của mình,
cảm ơn bác,
Chủ nhật mà bác vẫn vất vả quá nhưng vui bác nhỉ,

Bạn lưu ý
: Để việc tìm kiếm hiệu quả hơn, bạn nên thêm phần Sort vào ListBox
Thuật toán về Sort ListBox (hay Sort bất cứ thứ gì) có lẽ ai cũng biết
- Quét qua từng Item
- So sánh Item1 với Item2 ---> Nếu Item1> Item2 thì đổi chổ chúng với nhau
- Và cứ thế tiếp tục

Tuy nhiên phương pháp này làm cho tốc độ tính toán chậm hẳn đi
Trong Excel đã có công cụ Sort, ta tận dụng nó vào code là nhanh nhất...
Thuật toán:
- Lưu vùng dử liệu vào 1 biến tạm
- Sort dử liệu theo trật tự
- Chạy code gì đó
(với file của ta là chạy AutoFilter và AddItem vào ListBox)
- Sau khi code xong, lấy biến tạm (đã lưu) áp ngược vào vùng dử liệu (tức trả mọi thứ về như ban đầu)
===> Phương pháp này tỏ ra mạnh về mặt tốc độ nhưng chỉ áp dụng được với vùng dử liệu thô (không chứa công thức)
Bạn thử xem
---------------
Nói thêm 1 chút: Với Form đã tạo như trên, bạn có thể biến nó thành phần mềm tra từ điển được đấy (chỉ cần có Data)
 
Lần chỉnh sửa cuối:
Upvote 0

Bạn lưu ý
: Để việc tìm kiếm hiệu quả hơn, bạn nên thêm phần Sort vào ListBox
Thuật toán về Sort ListBox (hay Sort bất cứ thứ gì) có lẽ ai cũng biết
- Quét qua từng Item
- So sánh Item1 với Item2 ---> Nếu Item1> Item2 thì đổi chổ chúng với nhau
- Và cứ thế tiếp tục

Tuy nhiên phương pháp này làm cho tốc độ tính toán chậm hẳn đi
Trong Excel đã có công cụ Sort, ta tận dụng nó vào code là nhanh nhất...
Thuật toán:
- Lưu vùng dử liệu vào 1 biến tạm
- Sort dử liệu theo trật tự
- Chạy code gì đó
(với file của ta là chạy AutoFilter và AddItem vào ListBox)
- Sau khi code xong, lấy biến tạm (đã lưu) áp ngược vào vùng dử liệu (tức trả mọi thứ về như ban đầu)
===> Phương pháp này tỏ ra mạnh về mặt tốc độ nhưng chỉ áp dụng được với vùng dử liệu thô (không chứa công thức)
Bạn thử xem
---------------
Nói thêm 1 chút: Với Form đã tạo như trên, bạn có thể biến nó thành phần mềm tra từ điển được đấy (chỉ cần có Data)

Anh Giúp em luôn đi, em còn lơ tơ mơ cái món này lắm,

Cảm ơn anh,
 
Upvote 0
Anh Giúp em luôn đi, em còn lơ tơ mơ cái món này lắm,

Cảm ơn anh,
Sửa lại có tí thôi mà (thêm phần Sort vào)
PHP:
Private Sub TextBox1_Change()
  Dim Clls As Range, Temp As Variant
  Application.ScreenUpdating = False
  With Sheet1.Range(Sheet1.[A1], Sheet1.[A65536].End(xlUp))
    Temp = .Value
    .Sort .Cells(2, 1), 1, Header:=xlGuess 
    .AutoFilter 1, TextBox1.Value & "*"
    ListBox1.Clear
    For Each Clls In .Offset(1).SpecialCells(12).SpecialCells(2)
      ListBox1.AddItem (Clls)
    Next
    .AutoFilter
    .Value = Temp
  End With
  Application.ScreenUpdating = True
End Sub
Với code mới có phần Sort này thì chắc ăn việc tìm kiếm của bạn cũng trở nên dể dàng hơn rất nhiều
Bạn hãy tự so sánh xem code mới và cũ có điểm nào khác nhau
 
Upvote 0
To Ndu:
Mình cho cách sử lý nạp Comb. của Ndu rất hay. Nhưng có vấn đề 1 chút là nếu gõ ký tự không có dòng nào thỏa thì nó nạp tất cả (Thậm chí cả tiêu đề, nếu có vài cột nưa có cũng nạp tất). Bạn hiệu chỉnh chút nữa cho hoàn thiện.
P/S:Mình tham gia cách "bình dân" nhất (Ý mình nói là không sử dụng chức năng nâng cao của Exc)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
To Ndu:
Mình cho cách sử lý nạp Comb. của Ndu rất hay. Nhưng có vấn đề 1 chút là nếu gõ ký tự không có dòng nào thỏa thì nó nạp tất cả (Thậm chí cả tiêu đề, nếu có vài cột nưa có cũng nạp tất). Bạn hiệu chỉnh chút nữa cho hoàn thiện.
P/S:Mình tham gia cách "bình dân" nhất (Ý mình nói là không sử dụng chức năng nâng cao của Exc)
Vâng... em thấy... và cái này dể sửa mà anh!
Thêm đoạn:
If Len(Trim(TextBox1.Value)) = 0 Then Exit Sub
vào đầu code!
Thay đoạn:
For Each Clls In .Offset(1).SpecialCells(12).SpecialCells(2)
thành:
For Each Clls In .Offset(1).SpecialCells(12)
===> Vậy là xong!
Vòng lập For duyệt qua các cell đã được Filter sẽ nhanh hơn rất nhiều so với duyệt qua toàn bộ ---> Điều này dể nhận thấy khi anh gõ nhiều ký tự vào khung tìm kiếm
Em lấy ví dụ:
- Khi em gõ chữ ABB thì qua bộ lọc AutoFilter, số dòng dử liệu chỉ còn lại 4, tương đương vòng lập For sẽ chỉ duyệt qua 4 lần... Trong khi đó với code của anh nó vẫn phải duyệt 500 lần
 
Upvote 0
Vâng... em thấy... và cái này dể sửa mà anh!
Thêm đoạn:
If Len(Trim(TextBox1.Value)) = 0 Then Exit Sub
vào đầu code!
Thay đoạn:
For Each Clls In .Offset(1).SpecialCells(12).SpecialCells(2)
thành:
For Each Clls In .Offset(1).SpecialCells(12)
===> Vậy là xong!
Vòng lập For duyệt qua các cell đã được Filter sẽ nhanh hơn rất nhiều so với duyệt qua toàn bộ ---> Điều này dể nhận thấy khi anh gõ nhiều ký tự vào khung tìm kiếm
Em lấy ví dụ:
- Khi em gõ chữ ABB thì qua bộ lọc AutoFilter, số dòng dử liệu chỉ còn lại 4, tương đương vòng lập For sẽ chỉ duyệt qua 4 lần... Trong khi đó với code của anh nó vẫn phải duyệt 500 lần

Quá tuyệt, cảm ơn các bác cao thủ đã giúp đỡ em,

Các bác cho em hỏi thêm: Nếu muốn hiển thị nhiều cột ở trong ListBox thì làm thế nào nhỉ?
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Các bác cho em hỏi nếu muốn hiển thị nhiều cột ở trong ListBox thì làm thế nào nhỉ?
File ở bài số #19 của anh Sealand là dạng ListBox với 2 cột đấy, bạn tải về mà nghiên cứu ---> Tôi nghĩ rất dể (mò tí là ra)
-------------
Nói riêng với bạn: Nhớ không lầm thì với chủ đề này bạn đã gữi lên rất nhiều lần, nhưng cho đến nay mới tạm giải quyết được... Nguyên nhân là vì bạn đã "dẩn dắt" mọi người đi theo hướng mà bạn cho là đúng (tạo 2 form).. mà đáng lý ra, ngay từ đầu bạn nên mô tả mục đích để mọi người gợi ý cho bạn 1 hướng đi tốt
Bạn thấy đấy, cứ lòng vòng với thiết kế 2 cái Form mà có được gì đâu ---> Khi mọi người hiểu được ý đồ tổng thể, sẽ dể dàng giúp bạn hơn
 
Lần chỉnh sửa cuối:
Upvote 0
Em "mò" rồi nhưng vẫn không ra nên mới nhờ các bác hi..hi,
Theo cách của các bác đúng là hay lắm nhưng nhiều khi lĩnh vực này em thấy cũng khá phức tạp, chẳng han:

Kết hợp rất nhiều điều kiện để đang dạng hoá việc tìm kiếm như: gõ mã số; nếu không nhớ mã số thì gõ họ tên, hoặc chỉ cần gõ tên vào textbox,...
các cách của các bác mới chỉ có một ý thôi. Như vậy bắt buộc người nhập phải nhớ một thứ gì đó.
 
Lần chỉnh sửa cuối:
Upvote 0
Em "mò" rồi nhưng vẫn không ra nên mới nhờ các bác hi..hi,
Theo cách của các bác đúng là hay lắm nhưng nhiều khi lĩnh vực này em thấy cũng khá phức tạp, chẳng han:

Kết hợp rất nhiều điều kiện để đang dạng hoá việc tìm kiếm như: gõ mã số; nếu không nhớ mã số thì gõ họ tên, hoặc chỉ cần gõ tên vào textbox,...
các cách của các bác mới chỉ có một ý thôi. Như vậy bắt buộc người nhập phải nhớ một thứ gì đó.
Bạn xem file này nhé: Tìm kiếm với 3 điều kiện MÃ, TÊN và ĐƠN VỊ
Muốn Add 3 cột vào ListBox thì điều đầu tiên bạn phải chỉnh thuộc tính Columns Count = 3
như hình này:

attachment.php


Còn code thì cũng chẳng có gì...
PHP:
Private Sub TextBox1_Change()
  Dim Clls As Range, Temp As Variant, i As Long, FCol As Long
  Application.ScreenUpdating = False
  FCol = -(OptionButton1.Value + 2 * OptionButton2.Value + 3 * OptionButton3.Value)
  If Len(Trim(TextBox1.Value)) = 0 Then Exit Sub
  With Sheet1.Range(Sheet1.[A1], Sheet1.[A65536].End(xlUp)).Resize(, 3)
    Temp = .Value
    .Sort .Cells(2, FCol), 1, Header:=xlGuess
    .AutoFilter FCol, TextBox1.Value & "*"
    ListBox1.Clear
    For Each Clls In .Offset(1).Resize(, 1).SpecialCells(12)
      ListBox1.AddItem (Clls)
      ListBox1.List(i, 1) = Clls(, 2)
      ListBox1.List(i, 2) = Clls(, 3)
      i = i + 1
    Next
    .AutoFilter
    .Value = Temp
  End With
  Application.ScreenUpdating = True
End Sub
PHP:
Private Sub UserForm_Initialize()
  OptionButton1.Value = 1
End Sub
Bạn cứ so sánh code của ListBox 1 cột và ListBox 3 cột này xem chổ nào khác nhau nhé
 

File đính kèm

Upvote 0
cái này không tìm kiếm được dữ liệu dạng số hả bạn ? có ai có cách khắc phục không ? chỉ mình với ..!
 
Upvote 0
Giải thích giúp mình dùm dòng ".Offset(1).SpecialCells(12).SpecialCells(2)" với
 
Upvote 0
Gíup mình làm thêm 1 bươ1c này nữa

Mình không thể tìm kiếm bằng số , mã hàng minh toàn bằng số thôi nế không thể tìm đươc thì tức lắm , minh đã kiếm file này lâu lăm rồi&&&%$r
 
Upvote 0
Mình không thể tìm kiếm bằng số , mã hàng minh toàn bằng số thôi nế không thể tìm đươc thì tức lắm , minh đã kiếm file này lâu lăm rồi&&&%$r
hì, tội nghiệp bác quá nhỉ, chẳng ai giúp. Code thì giữ nguyên, bạn chỉ cần format toàn bộ vùng dữ liệu đó sang dạng text là ok ngay thôi mà.
Chúc vui!
 
Upvote 0
Mình không thể tìm kiếm bằng số , mã hàng minh toàn bằng số thôi nế không thể tìm đươc thì tức lắm , minh đã kiếm file này lâu lăm rồi&&&%$r


hì, tội nghiệp bác quá nhỉ, chẳng ai giúp. Code thì giữ nguyên, bạn chỉ cần format toàn bộ vùng dữ liệu đó sang dạng text là ok ngay thôi mà.
Chúc vui!

Không thể Tìm kiếm dạng số mà bạn Format dạng Text được đâu nha bạn! Với AutoFilter thì nó rất rạch ròi, với Text thì nó cho thêm dấu chấm hỏi (?) hoặc dấu sao (*), chứ với Number thì vô phương!

Nhưng cũng phải có giải pháp chứ! Dựa vào File của Thầy NDU, tôi chỉnh lại như sau: Load Form lên, thêm cột phụ gán công thức ghép text vào mã số, a-lê-hấp thế là xong! Thoát Form thì xóa cột phụ. Các cấu trúc khác giữ nguyên!

PHP:
Option Explicit
Private Sub UserForm_Initialize()
  Application.ScreenUpdating = False
  With Sheet1
    .[D:D].Clear: .[D1] = "ExtraID"
    .[D2].FormulaR1C1 = "=""F"" & RC1": .[D2].Copy
    .Range("D2:D" & .Range("A65536").End(xlUp).Row).PasteSpecial
    .[A1].Select
  End With
End Sub
 
'==========================================================================
 
Private Sub UserForm_Terminate()
  With Sheet1
    .[D:D].Clear
    .[A:A].NumberFormat = "General"
  End With
  Application.ScreenUpdating = True
End Sub
 
'==========================================================================
 
Private Sub TextBox1_Change()
  Dim Clls As Range, Temp As Variant, i As Long, FCol As Long, Txb
  FCol = -(OptionButton1.Value + 2 * OptionButton2.Value + 3 * OptionButton3.Value)
  If OptionButton1.Value = True Then FCol = 4: Txb = "F" & TextBox1.Value Else Txb = TextBox1.Text
  If Len(Trim(TextBox1)) = 0 Or TextBox1 = "" Then ListBox1.Clear: Exit Sub
  With Sheet1.Range(Sheet1.[A1], Sheet1.[A65536].End(xlUp)).Resize(, 4)
    Temp = .Value
    .Sort .Cells(2, FCol), 1, Header:=xlGuess
    .AutoFilter FCol, Txb & "*"
    ListBox1.Clear
    For Each Clls In .Offset(1).Resize(, 1).SpecialCells(12)
      ListBox1.AddItem (Clls)
      ListBox1.List(i, 1) = Clls(, 2)
      ListBox1.List(i, 2) = Clls(, 3)
      i = i + 1
    Next
    .AutoFilter
    .Value = Temp
  End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Anh ndu! có thể tạo tiêu đề trong ListBox được không. Tiêu đề giống như trong Sheet1 (Mã|Họ và Tên|Đơn vị). Nếu có tiêu đề thì dễ nhìn dữ liệu hơn, phải không anh.
 
Upvote 0
Anh ndu! có thể tạo tiêu đề trong ListBox được không. Tiêu đề giống như trong Sheet1 (Mã|Họ và Tên|Đơn vị). Nếu có tiêu đề thì dễ nhìn dữ liệu hơn, phải không anh.

Được với điều kiện nguồn chính là Rowsource chứ không phải là List.

Đặt thuộc tính Column Head là TRUE.
 

File đính kèm

Upvote 0
Anh Trọng Nghĩa! Làm theo cách của anh thì không thể tìm kiếm được khi kết hợp với code tìm kiếm của anh ndu. Thực hiện như code của anh ndu nhưng trong listbox có thêm hàng tiêu đề.
 
Upvote 0
Anh Trọng Nghĩa! Làm theo cách của anh thì không thể tìm kiếm được khi kết hợp với code tìm kiếm của anh ndu. Thực hiện như code của anh ndu nhưng trong listbox có thêm hàng tiêu đề.

Trong code ta linh hoạt một chút là được thôi!

Với bài gởi này, thay vì dùng AutoFilter của Excel thì ta dùng hàm Filter (Hàm Filter2DArray của ndu96081631) nhằm tăng tốc độ và cũng tránh rắc rối dữ liệu nguồn, ta thực hiện như sau:

PHP:
Private Sub TextBox1_Change()
    Dim sArray, FindArray, fCol As Long, fRow As Long
    sArray = Sheet1.Range(Sheet1.[A1], Sheet1.[A65536].End(xlUp)).Resize(, 3).Value
    fCol = -(OptionButton1.Value + 2 * OptionButton2.Value + 3 * OptionButton3.Value)
    FindArray = Filter2DArray(sArray, fCol, TextBox1.Text & "*", True)
    Source.Range("A:C").Clear
    
    If IsArray(FindArray) Then
        fRow = UBound(FindArray)
        Source.Range("A1").Resize(fRow, 3).Value = FindArray
        ListBox1.RowSource = "Source!A2:C" & fRow
    Else
        Source.Range("A1:C1").Value = Sheet1.Range("A1:C1").Value
        Source.Range("B2").Value = "No match found!"
        ListBox1.RowSource = "Source!A2:C2"
    End If
End Sub

Như vậy, dù tìm kiếm kiểu số hay kiểu chuỗi vẫn thực hiện được, mặt khác, khi dùng với Rowsource, ListBox sẽ hiển thị được cái tiêu đề.

Lưu ý: Có một sheet (Source) ẩn kiểu veryhidden để làm RowSource cho ListBox.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Anh Hoàng Trọng Nghĩa ơi. File tìm kiếm mới của anh khi nhập theo tên: nhập mấy kí tự đầu tiên thì nó mới search được, còn chỉ nhập mấy từ sau thì không search được. VD: search tên Phạm Minh Tiến -nếu gõ Phạm thì nó ra, còn gõ Minh hay Tiến thì nó báo ko tìm thấy.
Anh có cách nào search chữ Tiến hay chữ Minh thì nó ra luôn tên ko ?
 
Upvote 0
Anh Hoàng Trọng Nghĩa ơi. File tìm kiếm mới của anh khi nhập theo tên: nhập mấy kí tự đầu tiên thì nó mới search được, còn chỉ nhập mấy từ sau thì không search được. VD: search tên Phạm Minh Tiến -nếu gõ Phạm thì nó ra, còn gõ Minh hay Tiến thì nó báo ko tìm thấy.
Anh có cách nào search chữ Tiến hay chữ Minh thì nó ra luôn tên ko ?

Sửa lại tại đoạn này:

Mã:
[B]FindArray = Filter2DArray(sArray, fCol, [COLOR=#0000cd]TextBox1.Text [/COLOR][COLOR=#ff0000]& "*"[/COLOR], True)[/B]

thành:

Mã:
[B]FindArray = Filter2DArray(sArray, fCol, [COLOR=#ff0000]"*" & [/COLOR][COLOR=#0000cd]TextBox1.Text[/COLOR][COLOR=#ff0000] & "*"[/COLOR], True)[/B]

Có nghĩa rằng chỉ thêm "*" & đằng trước nữa là xong!

Nói chung, nó sẽ lọc từ na ná cho đến khi nhập đúng hết.
 
Upvote 0
anh Hoàng Trọng Nghĩa ơi. Cái hàm của anh tìm kiếm ok hết rồi nhưng chỉ còn 1 cái nữa là không có click tới tên cần tìm kiếm. Trong form có tên tìm kiếm nhưng khi click tên đó nó không nhảy qua excel tới ô đó. Anh coi giúp dùm em cái đó nữa nha!
 
Upvote 0
anh Hoàng Trọng Nghĩa ơi. Cái hàm của anh tìm kiếm ok hết rồi nhưng chỉ còn 1 cái nữa là không có click tới tên cần tìm kiếm. Trong form có tên tìm kiếm nhưng khi click tên đó nó không nhảy qua excel tới ô đó. Anh coi giúp dùm em cái đó nữa nha!

Cái này có gì đâu mà khó, chỉ cần double click vào cái ListBox với thủ tục dưới đây:

Mã:
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim MyID As String
    MyID = ListBox1.List(, 0)
    Unload Me
    Range(Sheet1.[A1], Sheet1.[A65536].End(xlUp)) _
    .Find(MyID, LookIn:=xlValues, LookAt:=xlWhole) _
    .Resize(, 3).Select
End Sub
 

File đính kèm

Upvote 0
Nếu cột A của sheet1 có dữ liệu nhập là dữ liệu ngày (dd/mm/yyyy) thì code tìm kiếm bị lỗi khi double click vào listbox để tìm dòng, nhờ anh Hoàng Trọng Nghĩa sửa giúp code doubleclick vào listbox được không ạ?
 
Upvote 0
Cái này có gì đâu mà khó, chỉ cần double click vào cái ListBox với thủ tục dưới đây:

Mã:
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim MyID As String
    MyID = ListBox1.List(, 0)
    Unload Me
    Range(Sheet1.[A1], Sheet1.[A65536].End(xlUp)) _
    .Find(MyID, LookIn:=xlValues, LookAt:=xlWhole) _
    .Resize(, 3).Select
End Sub

Anh Nghĩa hoặc ai biết xin giúp em thêm chút nũa nhé. Em muốn việc tìm kiếm này theo 2 điều kiện đồng thời. Ví dụ như tìm đồng thời theo tên và theo đơn vị thì phải code thế nào. Tất nhiên, em biết khi đó trên Form không phải là OptionButton mà phải chuyển thành Checkbox. Loay hoay mãi mà em không làm ra.
 
Upvote 0
Xin hỏi?
Làm thế nào trong list ta chọn đối tượng cần tìm (đưa chuột vào đối tượng trong list được to đậm như trong list) khi nhấp đúp chuột thì hiện ra riêng đồi tượng đó trong Sheets hoặc trong form (nếu tạo form). Việc đó VBA Excel có thực hiện được không ? nếu được thì viết Code như thế nào.
Rất mong hướng dẫn, giúp đở thêm. Xin cám ơn.
 
Upvote 0
Xin hỏi?
Làm thế nào trong list ta chọn đối tượng cần tìm (đưa chuột vào đối tượng trong list được to đậm như trong list) khi nhấp đúp chuột thì hiện ra riêng đồi tượng đó trong Sheets hoặc trong form (nếu tạo form). Việc đó VBA Excel có thực hiện được không ? nếu được thì viết Code như thế nào.
Rất mong hướng dẫn, giúp đở thêm. Xin cám ơn.

Để lọc nhiều cột thì bạn thử xem code ở chủ đề sau có đáp ứng được không. Nhân tiện nhờ bạn test hộ và cho biết.
Số tôi không may thì phải. Mình thì sẵn sàng giúp nhiều người nhưng nhờ vả thì không ai giúp.

http://www.giaiphapexcel.com/forum/...cột-lọc-tùy-ý-cột-số-tới-2-điều-kiện
 
Upvote 0
Để lọc nhiều cột thì bạn thử xem code ở chủ đề sau có đáp ứng được không. Nhân tiện nhờ bạn test hộ và cho biết.
Số tôi không may thì phải. Mình thì sẵn sàng giúp nhiều người nhưng nhờ vả thì không ai giúp.

http://www.giaiphapexcel.com/forum/...cột-lọc-tùy-ý-cột-số-tới-2-điều-kiện


Hic, người khác không hỏi Thầy thì chớ, Thầy mà hỏi thì ai đủ trình độ để trả lời chứ trời?
 
Upvote 0

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

Back
Top Bottom