Function VH(ByVal tmp As Range, ByVal Rng As Range, ByVal RngTT As Range) As VariantChậm là đương nhiên.
Mã:For i = 1 To Rng.Rows.Count key = Rng(i, 1).Value If Len(key) Then Dic.Item(LCase(key)) = Rng(i, 2).Value Next i
Code trong vòng lặp trên đọc giá trị của từng ô từ sheet. Tổng cộng đọc 172000 lần vào key và đọc 171972 lần để thêm vào Dic. Vấn đề tương tự với vòng FOR thứ 2.
Nên nhớ là khi dữ liệu lớn thì cấm tuyệt đối đọc (ghi) từng cell từ (vào) sheet
Tôi chỉ sửa những chỗ "nhạy cảm".
Chú ý: tôi lấy code từ 1 bài trước, sau đó thấy có code mới nhưng ngại dò xem có chỗ nào thay đổi. Nói chung triết lý thì như code dưới đây. Tức đọc dữ liệu 1 lần từ sheet vào mảng sau đó trong vòng FOR thì dò trong mảng thôi.
Mã:Function VH(ByVal tmp As Range, ByVal Rng As Range, ByVal RngTT As Range) As Variant Dim Dic As Object, DicTT As Object, Res(), sArr(), aRngTT(), aRng(), S As Variant, key Dim i As Long, k As Long sArr = tmp.Value aRng = Rng.Value aRngTT = RngTT.Value ReDim Res(LBound(sArr) To UBound(sArr), 1 To 1) Set Dic = CreateObject("Scripting.Dictionary") For i = 1 To UBound(aRng) key = aRng(i, 1) If Len(key) Then Dic.Item(LCase(key)) = aRng(i, 2) Next i Set DicTT = CreateObject("Scripting.Dictionary") For i = 1 To UBound(aRngTT) key = aRngTT(i, 1) If Len(key) Then DicTT.Item(LCase(key)) = aRngTT(i, 2) Next i For k = LBound(sArr) To UBound(sArr) If Len(sArr(k, 1)) Then S = Split(Application.Trim(sArr(k, 1)), " ") For i = LBound(S) To UBound(S) key = LCase(S(i)) If DicTT.exists(key) Then S(i) = DicTT.Item(key) Else If Dic.exists(key) Then S(i) = Dic.Item(key) End If Next i Res(k, 1) = Join(S, " ") End If Next VH = Res Set Dic = Nothing: Set DicTT = Nothing End Function
Với ByVal tmp As Range thì phạm vi áp dụng của Function bị hạn chế, khó dùng cho file thực tế của chủ topic
Thật ra File thực tế bảng tra không lớn nên dùng Range hay Array không ảnh hưởng bao nhiêu, chạy không mượt chủ yếu là do các hàm mảng khác và cách vận dụng công thức không phù hợp: https://www.giaiphapexcel.com/diendan/threads/nhờ-giúp-chuyển-công-thức-dài-thành-vba.134507/