返回列表 上一主題 發帖

[發問] 最快速的比對資料方式?

C.D欄為被比對資料,
根據A欄數據,取出與C欄相同值所對應D欄數值,並填至B欄(與VLOOKUP相同):
  1. Sub TEST_Vlookup()
  2. Dim TM, Arr, Brr, xRow&, xD, i&
  3. TM = Timer
  4. [B:B].Clear: [J1] = ""
  5. xRow = 20000
  6. Arr = [A1].Resize(xRow)
  7. Brr = [C1:D1].Resize(xRow)
  8. Set xD = CreateObject("Scripting.Dictionary")
  9. For i = 1 To UBound(Brr)
  10.   xD(Brr(i, 1)) = Brr(i, 2)
  11. Next
  12. For i = 1 To UBound(Arr)
  13.   Arr(i, 1) = xD(Arr(i, 1))
  14. Next
  15. [B1].Resize(xRow) = Arr
  16. [J1] = Timer - TM
  17. End Sub
複製代碼
 
附檔還有〔類〕COUNTIF及SUMIF用法,都是字典檔與陣列的運用(2萬筆,1秒內完成,可能嗎???),
很普通的VBA,請自行參酌,恕不另作說明:
Test20150904.rar (374.9 KB)
  

TOP

回復 6# PKKO


〔雙重比對〕取出對應值:
  1. Sub TEST_Vlookup()
  2. Dim TM, Arr, Brr, Crr, Xrr, xRow&, xD, i&
  3. TM = Timer:  [B:B,E:E].Clear:  [M1] = ""
  4. xRow = 20000
  5. Arr = [A1].Resize(xRow)
  6. Brr = [C1:D1].Resize(xRow)
  7. Crr = [F1:G1].Resize(xRow)
  8.  
  9. Set xD = CreateObject("Scripting.Dictionary")
  10. For i = 1 To UBound(Crr)
  11.  xD(Crr(i, 1)) = Crr(i, 2)
  12. Next
  13.  
  14. Xrr = [E1].Resize(xRow)  '(X1)
  15. For i = 1 To UBound(Brr)
  16.   If xD.Exists(Brr(i, 2)) Then
  17.     xD(Brr(i, 1)) = xD(Brr(i, 2))
  18.     Xrr(i, 1) = xD(Brr(i, 2))  '(X2)
  19.   End If
  20. Next
  21. [E1].Resize(xRow) = Xrr  '(X3)
  22.  
  23. Xrr = [B1].Resize(xRow)
  24. For i = 1 To UBound(Arr)
  25.   If xD.Exists(Arr(i, 1)) Then Xrr(i, 1) = xD(Arr(i, 1))
  26. Next
  27. [B1].Resize(xRow) = Xrr
  28.  
  29. [M1] = Timer - TM
  30. End Sub
複製代碼
(X1)(X2)(X3)這三行用來填入E欄做檢查用,可以刪除:
Test20150904v2.rar (689.08 KB)
 
EXCEL及VBA,只是插花非專業,大概寫寫,參考即可∼∼
 

TOP

回復 10# PKKO


比對文字還有 Instr 方法,
要看資料結構及需求,才能決定使用何種方式,
請提供相關檔案資料,說明需求及模擬結果,

另,此問題已與此題本意不同,建議另行發帖較妥適,也可讓更多人共同參與討論!
 

TOP

        靜思自在 : 做該做的事是智慧,做不該做的事是愚癡。
返回列表 上一主題