So sánh tốc độ tìm kiếm giá trị trong Range

  • Thread starter Thread starter vba_gpe
  • Ngày gửi Ngày gửi
Liên hệ QC

vba_gpe

Thành viên thường trực
Tham gia
15/12/10
Bài viết
296
Được thích
44
Nghề nghiệp
Thất nghiệp
Em chào mọi người ạ.
Hiện em tham khảo được 3 cách tìm kiếm một value trong Range:
cách 1:
PHP:
Function EvalFind(What, Where As Range) As Range
  Dim i&, q$
  If VarType(What) = vbString Then q = """"
  On Error Resume Next
  i = Evaluate("MATCH(" & q & What & q & "," & Where.Address(External:=True) & ",0)")
  If i > 0 Then Set EvalFind = Where(i)
End Function
Cách 2: Dùng Scripting.Dictionary, sau đó duyệt qua từng phần tử trong mảng, nếu thỏa điều kiện thì add vào
PHP:
CreateObject("Scripting.Dictionary")
,
Cách 3: Dùng mặc định của Excel .
PHP:
Range.Find
Cho em hỏi giữa 3 cách tìm kiếm này thì cách tìm kiếm nào sẽ nhanh hơn ạ?
Cảm ơn mọi người.

P/s: Nếu bài viết có từ nào đặt vi phạm nội quy thì BQT báo để em biết em sửa bài ạ. :)
 
Lần chỉnh sửa cuối:
Em chào mọi người ạ.
Hiện em tham khảo được 3 cách tìm kiếm một value trong Range:
cách 1:
PHP:
Function EvalFind(What, Where As Range) As Range
  Dim i&, q$
  If VarType(What) = vbString Then q = """"
  On Error Resume Next
  i = Evaluate("MATCH(" & q & What & q & "," & Where.Address(External:=True) & ",0)")
  If i > 0 Then Set EvalFind = Where(i)
End Function
Cách 2: Dùng Scripting.Dictionary, sau đó duyệt qua từng phần tử trong mảng, nếu thỏa điều kiện thì add vào
PHP:
CreateObject("Scripting.Dictionary")
,
Cách 3: Dùng mặc định của Excel .
PHP:
Range.Find
Cho em hỏi giữa 3 cách tìm kiếm này thì cách tìm kiếm nào sẽ nhanh hơn ạ?
Cảm ơn mọi người.

P/s: Nếu bài viết có từ nào đặt vi phạm nội quy thì BQT báo để em biết em sửa bài ạ. :)

Xin chào vba_gpe,
Về câu hỏi của bạn Oanh Thơ (OT) chưa đủ kiến thức nên không giúp được gì.
Nhưng có phải bạn đã có ví dụ và code đầy đủ của cả 3 cách,nếu vậy bạn có thể gửi ví dụ hoặc code nên cho Oanh Thơ học hỏi với được không ạ.
Xin lỗi vì không giúp được gì cho bạn mà lại làm phiền bạn.
 
Upvote 0
Em chào mọi người ạ.
Hiện em tham khảo được 3 cách tìm kiếm một value trong Range:
cách 1:
PHP:
Function EvalFind(What, Where As Range) As Range
  Dim i&, q$
  If VarType(What) = vbString Then q = """"
  On Error Resume Next
  i = Evaluate("MATCH(" & q & What & q & "," & Where.Address(External:=True) & ",0)")
  If i > 0 Then Set EvalFind = Where(i)
End Function
Cách 2: Dùng Scripting.Dictionary, sau đó duyệt qua từng phần tử trong mảng, nếu thỏa điều kiện thì add vào
PHP:
CreateObject("Scripting.Dictionary")
,
Cách 3: Dùng mặc định của Excel .
PHP:
Range.Find
Cho em hỏi giữa 3 cách tìm kiếm này thì cách tìm kiếm nào sẽ nhanh hơn ạ?
Cảm ơn mọi người.

P/s: Nếu bài viết có từ nào đặt vi phạm nội quy thì BQT báo để em biết em sửa bài ạ. :)
Tùy thuộc vào dữ liệu kiểu gì, có dữ liệu cụ thể thì nên test bằng cách đo thời gian
Nhưng đa số các bài hỏi ở cái diễn đàn này là nhỏ, nên không lo tốc độ làm gì, vì chưa nhấc tay khỏi chuột thì đã tìm kiếm được rồi (dù dùng cách nào trong 3 cách trên)
 
Upvote 0
--> @vba_gpe
Em chào mọi người ạ.
Hiện em tham khảo được 3 cách tìm kiếm một value trong Range:
cách 1:
PHP:
Function EvalFind(What, Where As Range) As Range
  Dim i&, q$
  If VarType(What) = vbString Then q = """"
  On Error Resume Next
  i = Evaluate("MATCH(" & q & What & q & "," & Where.Address(External:=True) & ",0)")
  If i > 0 Then Set EvalFind = Where(i)
End Function
Cách 2: Dùng Scripting.Dictionary, sau đó duyệt qua từng phần tử trong mảng, nếu thỏa điều kiện thì add vào
PHP:
CreateObject("Scripting.Dictionary")
,
Cách 3: Dùng mặc định của Excel .
PHP:
Range.Find
Cho em hỏi giữa 3 cách tìm kiếm này thì cách tìm kiếm nào sẽ nhanh hơn ạ?
Cảm ơn mọi người.

P/s: Nếu bài viết có từ nào đặt vi phạm nội quy thì BQT báo để em biết em sửa bài ạ. :)
Không biết 3 cách trên từ đâu định nghĩa thành.
Tôi chỉ biết nếu tìm kiếm bằng Excel hoặc VBA. Nếu code của bạn không mượn công thức của Excel thì phương thức tìm kiếm của bạn là dưới dạng "nhị phân" bởi VBA. Hoặc dùng hàm Excel để tìm kiếm
Tìm kiếm Nhị phân mà so với Tìm kiếm trong Excel thì bạn nghĩ cái nào nhanh hơn
 
Upvote 0
Cách 3 nhanh nhất, kế đến cách 1, cách 2 là kém hiệu quả nhất.
 
Upvote 0
Hình như còn cách tìm chạy bằng cơm nữa thì phải. Cách này chắc xếp ở vị trí số 0.
 
Upvote 0
Hình như còn cách tìm chạy bằng cơm nữa thì phải. Cách này chắc xếp ở vị trí số 0.
Có nhiều cách tìm lắm. Nhưng vị trí xếp còn tuỳ thuộc vào thời điểm tìm có gặp thành viên nào rỗi việc, muốn thử tài cốt đinh hay không.
 
Upvote 0
liệu kiểu gì, có dữ liệu cụ thể thì nên test bằn
Cảm ơn mọi người đã quan tâm.
Em mới đi công tác về nên nay mới kiểm tra lại.
Dữ liệu trong ví dụ của em chỉ đơn giản là tìm các giá trị thỏa điều kiện trong cột B (Cột Data) của sheet1 như hình thôi ạ.
Vùng cần tìm từ: B2:B26.
Giá trị cần tìm: Data name 11
Kết quả cần phải trả về: Vị trí dòng 12

1.jpg
 
Upvote 0
Vẫn là cách 3 nhanh nhất, kế đến cách 1, cách 2 là kém hiệu quả nhất.

Chú 1: với 26 dữ liệu trong bảng dò thì khó mà nhìn thấy sự chênh lệch.

Chú 2: thực ra với dữ liệu sắp xếp thì hàm Match tìm nhị phân nhanh hơn. Nhưng code của bài #1 không thể lợi dụng yếu tố này cho nên vẫn thua Find.
Dictionary chỉ bắt đầu hiệu quả khi số lần tìm không nhỏ quá so với bảng dò. Tìm chỉ 1 lần là quá nhỏ.

Chú 3:
i. dữ liệu như thớt đưa ra ở bài #8 không phải là đã sắp xếp.
ii. dicntionary dùng kỹ thuật bảng băm để làm bảng dò tìm. Dữ liệu có nhiều chỗ giống nhau như thế có thể làm cho lúc thiết lập bảng băm chậm 1 chút (thiết lập xong rồi thì nó tự biết cân, chạy bình thường)
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn mọi người đã quan tâm.
Em mới đi công tác về nên nay mới kiểm tra lại.
Dữ liệu trong ví dụ của em chỉ đơn giản là tìm các giá trị thỏa điều kiện trong cột B (Cột Data) của sheet1 như hình thôi ạ.
Vùng cần tìm từ: B2:B26.
Giá trị cần tìm: Data name 11
Kết quả cần phải trả về: Vị trí dòng 12

View attachment 208809
Dữ liệu kiểu ví dụ làm đại thế này thì khỏi tìm
Vị trí 11 thì chính là ="Data name" & 11
Sao phải tìm
nên có lẽ đây là câu hỏi chơi, thì sẽ nhận được kết quả trả lời chơi - giống bài này
 
Upvote 0
Xin chào tất mọi người,
Hiện OT cũng đang có một trường hợp tương tự bài toán này,OT sử dụng code sau:
Mục đích để xóa các dòng tìm kiếm được trong 1 khoảng thời gian : từ dStart đến dFinish
Mã:
Public Sub FindAndClear()

    Dim shData As Worksheet, shDK As Worksheet, rngClear As Range, rng As Range, rngData As Range
    Dim dStart As Variant, dFinish As Variant, i As Variant, j As Variant, lR As Variant
    
    Dim StartTime As Double, SecondsElapsed As Double
    
    StartTime = Timer
    
    Set shData = ThisWorkbook.Worksheets("DATA")
    Set shDK = ThisWorkbook.Worksheets("DK")
    dStart = shDK.Range("D3").Value2
    dFinish = shDK.Range("F3").Value2
    
    With shData
        lR = .Range("D" & .Rows.Count).End(xlUp).Row
        Set rng = .Range("D1:D" & lR)
        Set rngData = .Range("C1:N" & lR)
        rngData.Sort Key1:=.Range("D1"), Order1:=xlAscending
        i = Application.Match(dStart, rng, 1) + 1
        j = Application.Match(dFinish, rng, 1)
        Set rngClear = .Range("D" & i & ":D" & j)
        Debug.Print i & ChrW(10) & j
        If Not IsError(i) And Not IsError(j) Then rngClear.EntireRow.Delete
    End With
    
    SecondsElapsed = Round(Timer - StartTime, 2)
    MsgBox "This code ran successfully in " & SecondsElapsed & " seconds", vbInformation
    
End Sub

Dữ liệu trong file kèm thực tế còn nhiều hơn hơn nữa, nhưng OT cắt bớt để giảm dung lượng tập tin.
Về cơ bản OT thấy cũng đáp ứng được nhu cầu trong công việc, nhưng tiện đây bàn về tốc độ vì thế OT lên để nhờ các bạn góp ý cho thêm giải pháp khác để tham khảo ạ.
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom