[Giúp đỡ] Sửa code tìm kiếm

Liên hệ QC

adult

Thành viên hoạt động
Tham gia
2/12/07
Bài viết
193
Được thích
30
Chào các anh chị,
Em có tìm được 1 file search trong form rất hay và tốc độ rất nhanh, sử dụng phương thức tìm dictionary của thầy @ndu96081631 . Nhưng trong code thì chỉ tìm nội dung gõ chính xác thì mới tìm ra.
Ví du: trong cột Tên hàng có Lắc Châu Bạc, tại ô textbox em phải gõ chữ "Lắc" thì mới ra, còn em gõ chữ "Châu" thì tìm không thấy, các anh chị có thể sửa giúp em code tìm nội dung bất kỳ, không cần tìm từ chữ đầu tiên không ạ? Em có post file lên, nhờ các anh chị giúp nha.
Cảm ơn nhiều

Còn đây là code trong file luôn nhé.
Mã:
Function Filter2DArray(sArray, ColIndex As Long, FindStr As String)
  Dim TmpArr, i As Long, j As Long, Arr, Dic, TmpStr, Tmp
  Set Dic = CreateObject("Scripting.Dictionary")
  TmpArr = sArray
  ColIndex = ColIndex + LBound(TmpArr, 2) - 1
  For i = LBound(TmpArr, 1) To UBound(TmpArr, 1)
    TmpStr = Left(TmpArr(i, ColIndex), Len(FindStr))
    If UCase(TmpStr) = UCase(FindStr) Then Dic.Add i, ""
  Next
  If Dic.Count > 0 Then
    Tmp = Dic.Keys
    ReDim Arr(UBound(Tmp), LBound(TmpArr, 2) To UBound(TmpArr, 2))
    For i = LBound(Tmp) To UBound(Tmp)
      For j = LBound(TmpArr, 2) To UBound(TmpArr, 2)
        Arr(i, j) = TmpArr(Tmp(i), j)
      Next
    Next
  End If
  Filter2DArray = Arr
End Function
 

File đính kèm

  • search userform.xlsb
    697 KB · Đọc: 36
Lần chỉnh sửa cuối:
...
UCase(Mid(FindStr, 2, Len(FindStr))))
UCase(FindStr)

Mấy cái trên thì xử lý rất vụng, có thể tối ưu được không?
Với code trên mà nói chuyện "vụng" và "tối ưu" là đặt lầm chỗ ưu tiên.
Điểm quan trọng là phải hỏi lại thớt muốn tìm như thế nào. Theo code trên thì tìm từ "cà" trong "cà chua" sẽ ra cả "càng cua"
...
Cuối cùng code trên dùng dic, tức là nó chỉ lọc theo kiểu duy nhất, cái này là đại kỵ chứ chả hay kho gì cả nhé.
Đại kỵ chỗ nào? Có thể đúng, có thể sai, có thể dùng dao mổ trâu cắt cổ gà, chứ làm gì đến nổi đụng vào là không tốt.
Đúng là sẽ phải dùng mảng để nạp thông tin về cột và giá trị cần lọc. Viết theo gợi ý của anh thì sẽ là ăn nhanh, không phải code nhiều, dùng cái có sẵn chỉ việc phát triển thêm. Đối với những bạn thích vọc thì thêm thắt bẫy lỗi trường hợp lọc được kết quả empty nữa. Mà viết thành một hàm hoàn chỉnh nó cũng có cái thú chứ anh.
...
Cứ theo code #14 mà triển khai lại, tuy nhiên đầu vào bây giờ là hai mảng chẳng hạn, một mảng chỉ số cột, một mảng giá trị tìm kiếm tương ứng.
Đã nghĩ đến dùng mảng mà vẫn còn cố chấp. Theo đúng tinh thần Excel thì phải dùng Paramarray chứ.
 
Upvote 0
Đúng là sẽ phải dùng mảng để nạp thông tin về cột và giá trị cần lọc. Viết theo gợi ý của anh thì sẽ là ăn nhanh, không phải code nhiều, dùng cái có sẵn chỉ việc phát triển thêm. Đối với những bạn thích vọc thì thêm thắt bẫy lỗi trường hợp lọc được kết quả empty nữa. Mà viết thành một hàm hoàn chỉnh nó cũng có cái thú chứ anh.
Tôi không có ý ăn nhanh đâu. Tôi đưa ra cách mà người "mù" VBA có thể tự làm được nếu chịu khó suy nghĩ.

1. Nếu là người thạo code thì họ biết viết code hoặc sửa code của người khác. Tôi không bàn tới những người này vì họ tự mình làm được.

2. Nếu là người không thạo, không biết cách sửa code thì cách tôi đưa ra là cho họ. Họ không phải sửa gì trong code nguồn. Thậm chí họ không cần nhờ bất cứ ai. Chỉ cần suy nghĩ một chút là họ làm được. Gọi hàm gốc lần thứ nhất thì res là kết quả các dòng thỏa đk1. Nếu truyền mảng res đó khi gọi hàm gốc lần thứ 2 thì res sau khi gọi hàm gốc lần thứ 2 chính là kết quả các dòng thỏa đk1 và đk2 ***. Gọi hàm gốc n lần thì res là kết quả các dòng thỏa đk1, đk2, ..., đkn. Thế thôi.

Còn cách đưa các đk vào mảng chẳng qua là để có thể dùng vòng lặp FOR
-----------
***: Nếu tôi đưa cho ông kiểm duyệt một bài b1 và lệnh cho ông ta là phải xóa các từ sex thì ông ta trình tôi bản kq1 không còn từ sex nào nữa. Nếu tiếp đó tôi đưa bản b2 = kq1 mà ông ta vừa làm và lệnh phải xóa các từ orgasm thì ông ta trình bản kq2. Rõ ràng bản kq2 không chứa orgasm vì ông kiểm duyệt vừa xóa. Cũng không chứa sex vì bản gốc b2 = kq1 không có.

Giải thích cho những người thấy chướng mắt khi tôi dùng vd. với sex và orgasm. Đây là bài viết sẽ đăng trên báo dành cho trẻ vị thành niên. Vì thế phải lược bỏ những từ trên nếu tác giả cố tình dùng. Kiểm duyệt (censorship) mà.
 
Upvote 0
Với code trên mà nói chuyện "vụng" và "tối ưu" là đặt lầm chỗ ưu tiên.
Điểm quan trọng là phải hỏi lại thớt muốn tìm như thế nào. Theo code trên thì tìm từ "cà" trong "cà chua" sẽ ra cả "càng cua"

Đại kỵ chỗ nào? Có thể đúng, có thể sai, có thể dùng dao mổ trâu cắt cổ gà, chứ làm gì đến nổi đụng vào là không tốt.

Đã nghĩ đến dùng mảng mà vẫn còn cố chấp. Theo đúng tinh thần Excel thì phải dùng Paramarray chứ.
mấy cái ucase vụng là ở chỗ phải tính đi tính lại, trong khi chỉ cần tính một lần trước vòng lặp for, em chỉ góp ý cho cái code, còn dic thì trưa qua nắng, nhìn không rõ, dùng dic là dùng dao mổ trâu thịt trim
 
Upvote 0
Với code trên mà nói chuyện "vụng" và "tối ưu" là đặt lầm chỗ ưu tiên.
Điểm quan trọng là phải hỏi lại thớt muốn tìm như thế nào. Theo code trên thì tìm từ "cà" trong "cà chua" sẽ ra cả "càng cua"

Đại kỵ chỗ nào? Có thể đúng, có thể sai, có thể dùng dao mổ trâu cắt cổ gà, chứ làm gì đến nổi đụng vào là không tốt.

Đã nghĩ đến dùng mảng mà vẫn còn cố chấp. Theo đúng tinh thần Excel thì phải dùng Paramarray chứ.
Dùng một tham số để chứa chỉ số và chuỗi tìm kiếm hay 2 tham số nó khâc nhau không nhiều
 
Upvote 0
mấy cái ucase vụng là ở chỗ phải tính đi tính lại, trong khi chỉ cần tính một lần trước vòng lặp for,
Cách nầy quá tuyệt, hãy múa phím viết code theo ý tưởng tuyệt vời nầy xem có được không?
em chỉ góp ý cho cái code, còn dic thì trưa qua nắng, nhìn không rõ, dùng dic là dùng dao mổ trâu thịt trim
Dùng "dao" nào không quan trọng bằng cách thức "thịt trim" đúng điệu, đúng "qui trình"
Sáng nay trời nắng, đang chờ tụ mây gọi mưa
 
Upvote 0
mấy cái ucase vụng là ở chỗ phải tính đi tính lại, trong khi chỉ cần tính một lần trước vòng lặp for, em chỉ góp ý cho cái code, còn dic thì trưa qua nắng, nhìn không rõ, dùng dic là dùng dao mổ trâu thịt trim
Đã nói đặt ưu tiên sai chỗ rồi. Cái quan trọng là có nên dùng hàm InStr hay không, và nếu dùng thì như thế nào.
Dùng một tham số để chứa chỉ số và chuỗi tìm kiếm hay 2 tham số nó khâc nhau không nhiều
Khác rất nhiều.
Dùng Paramarray khi có khả năng con số động 0-n ; điển hình là hàm Choose, hay gần hơn là hàm SUMIFS (n là số chẵn)
Dùng Array khi cần thiết phải nạp mảng; điển hình là hàm Match
Ở đây, không có nhu cầu lấy điều kiện lọc từ một range cho nên không dùng mảng.

Mảng là một cấu trúc cho nên cho phép code hoạt động rộng rãi (bao quát) hơn. Tuy nhiên, cũng vì là một cấu trúc cho code gọi hàm cũng phải dựng dữ liệu thành cấu trúc trước khi nạp tham - trừ trường hợp nạp cả range như đã đề cập ở trên.
 
Upvote 0
Đã nói đặt ưu tiên sai chỗ rồi. Cái quan trọng là có nên dùng hàm InStr hay không, và nếu dùng thì như thế nào.
HỊ hị, tại em chỉ quan tâm cái vụ code cụ thể. Như gợi ý của anh ở bài trước thì việc này cần tách bạch một số cái, ví dụ là tìm theo từ hay theo chữ cái, ví dụ tìm "Vũ" thì là tìm từ "Vũ" hay là tìm câu nào có hai chữ "V" và "Ũ" đứng cạnh nhau.
 
Upvote 0
Ồ đĩa, ồ đĩa, hia câm trúp bồ...
Mi in lịch nát bét hở?

Nguyên bản:
Oh dear, oh dear, here comes trouble.
Me English not bad, heh?
 
Upvote 0
Web KT
Back
Top Bottom