返回列表 上一主題 發帖

[發問] 如何使用陣列+字典物件比對資料的時候用LIKE語法?

〔模糊比對〕,因有判斷式,大概一般都使用〔雙層迴圈〕,20000*20000=400000000,快不了!
要不,就要先將被比對文字〔拆分〕再納入〔字典檔〕,例如:1234 先拆成 1,2,3,4,12,23,34,123,234,1234,
以8個字元來說,每個編號要拆成36個:=(字元數+1)/2*字元數,
故第一個迴圈為:20000*36=720000,再加第二迴圈20000,共跑 740000,
但這又脫離正規解法,參考即可:(附檔有三種模式,可比較看看)
 
程式碼:
  1. Sub 取數3()
  2. Dim i&, j&, Arr, Brr, Drr, T, SS, xD, xD1, TT$, M%, N%, Y$
  3. T = Timer
  4. [B:B].ClearContents: [H3:H4] = ""
  5. Arr = [A1].Resize(R):  Brr = [B1].Resize(R):  Drr = [D1].Resize(R)
  6. Set xD = CreateObject("Scripting.Dictionary")
  7. Set xD1 = CreateObject("Scripting.Dictionary")
  8. For j = 1 To UBound(Drr)
  9.   TT = Drr(j, 1)
  10.   M = Len(TT)
  11.   N = 1
  12.   xD1.RemoveAll
  13.   Do
  14.    For i = 1 To M
  15.      Y = Mid(TT, N, i)
  16.      If xD1(Y) = "" Then xD(Y) = xD(Y) + 1
  17.      xD1(Y) = 1
  18.    Next i
  19.    N = N + 1: M = M - 1
  20.   Loop Until M = 0
  21. Next j
  22.  
  23. For i = 1 To UBound(Arr)
  24.   Y = Arr(i, 1): j = xD(Y)
  25.   Brr(i, 1) = j
  26.   SS = SS + j
  27. Next i
  28.  
  29. [B1].Resize(R) = Brr:  [H3] = Timer - T: [H4] = SS
  30. End Sub
複製代碼
 
附檔下載:
模糊比對取數v01.rar (151.53 KB)
 

TOP

回復 11# PKKO


Filter與一般函數相同,遇大迴圈還是要耗些時間:
Sub Test_Filter()
Dim i&, Arr(3000), Brr, T
For i = 0 To 3000:  Arr(i) = i + 1: Next i
T = Timer
 
For i = 1 To 5000:  Brr = Filter(Arr, i): Next i
MsgBox Timer - T
End Sub
 
但比起雙迴圈已快很多,是不錯的方法∼∼
 
若要比對方式為:
"A12*"  "B315*" 〔開頭相同〕 或 "*256" "*21" 〔結尾相同〕,還是用 Like,
Instr則可判斷關鍵字在文字串中的位置,也是常用語法∼∼

程式依資料多寡.型態及結構,使用適宜即可,無好壞之分∼∼
 

TOP

        靜思自在 : 君子為目標,小人為目的。
返回列表 上一主題