- 帖子
- 354
- 主題
- 5
- 精華
- 0
- 積分
- 387
- 點名
- 0
- 作業系統
- windows7
- 軟體版本
- vba,vb,excel2007
- 閱讀權限
- 20
- 性別
- 男
- 註冊時間
- 2017-1-8
- 最後登錄
- 2024-8-2
 
|
28#
發表於 2022-5-24 03:54
| 只看該作者
本帖最後由 singo1232001 於 2022-5-24 04:09 編輯
回復 27# oak0723-1
若你還要再快
這裡還有一個再快8%~15%的
缺點是 各表得分不會算 也不會顯示
只會算全部表得分跟排名 會顯示
若你的記憶體速度2400 Mhz(工作管理員>效能>內可以看記憶體速度)
14萬筆大概13秒 若舊版有顯示的大概14秒 新版的快8~15% (當然記憶體快會更快)
若你的記憶體速度3200Mhz 我用另一台3200電腦測
14萬筆大概8.5秒 舊版的9秒
推估記憶體3600Mhz大概可以到7秒 這樣
大概抓1萬筆0.6秒 (當然還是要看資料的複雜程度提升 會花更多時間)
Sub testFast()
TT = Timer '<可註解移除
Set sh0 = Sheets("輸入")
ReDim ar(1 To Sheets.Count - 1): w = 1 '主陣列 1維+2維多欄 之後混加10張表 總資料
ar0 = sh0.[I3:IN3] '次陣列0 2維1欄 輸入.[I3:IN3] 之後比對用
'ReDim ar1(1 To Sheets.Count - 1) '次陣列1 1維+2維1欄 10張表 之後混加各表得分加總
sh0.[i5:T1048576].ClearContents
For Each Z In Sheets
If Z.Name <> "輸入" Then
ar(w) = Z.Range("I5:IN" & Z.Cells(Rows.Count, 2).End(3).Row) '主陣列 混加2維不規則陣列
' ReDim ir(1 To UBound(ar(w)), 0)
' ar1(w) = ir
If MaxR < UBound(ar(w)) Then MaxR = UBound(ar(w))
w = w + 1
End If
Next
ReDim ar2(1 To MaxR, 0) As Integer '次陣列2 2維1欄 加總10張表總得分
'For i = 1 To MaxR: ar2(i, 0) = 0: Next
For i = 1 To UBound(ar) '根據主陣列與次陣列1比對算分 記錄在次陣列2
For j = 1 To 240 '10表總分紀錄在次陣列3
If ar0(1, j) <> "" Then '為空不算
For k = 1 To UBound(ar(i))
If ar(i)(k, j) = ar0(1, j) Then '輸入與資料判斷相同
' ar1(i)(k, 0) = ar1(i)(k, 0) + 1 '各表 該列+1分
ar2(k, 0) = ar2(k, 0) + 1 '總表 該列+1分
If ar(i)(k, j) = "" Then
If ar0(1, j) = 0 Then
'ar1(i)(k, 0) = ar1(i)(k, 0) - 1 ' '遇到0="" 把分數扣回來-1
ar2(k, 0) = ar2(k, 0) - 1 '遇到0="" 把分數扣回來-1
End If
End If
End If
Next
End If
Next
Next
'For i = 1 To UBound(ar) '各表總分依序放入[I5:R1048576]
'sh0.Cells(5, i + 8).Resize(UBound(ar1(i)), 1) = ar1(i)
'Next
sh0.[s5].Resize(UBound(ar2), 1) = ar2 '全部總分放入[S5:S1048576]
Set d = CreateObject("scripting.dictionary"): d.RemoveAll '去重
For i = 1 To UBound(ar2): d(ar2(i, 0)) = "": Next
d0 = d.keys() '次陣列3
For i = 0 To d.Count - 1 '次陣列3 氣泡排序
For j = i + 1 To d.Count - 1
If d0(i) < d0(j) Then tp = d0(i): d0(i) = d0(j): d0(j) = tp
Next
Next
ReDim d1(0 To d0(0)) '得分轉排名
For i = 0 To UBound(d0): d1(d0(i)) = i + 1: Next '創d1排名對照表陣列
For i = 1 To UBound(ar2): ar2(i, 0) = d1(ar2(i, 0)): Next '依對照表index修改次陣列3
sh0.[T5].Resize(UBound(ar2), 1) = ar2 '全部排名放入[T5:T1048576]
sh0.[A1] = Format(Timer - TT, "0.0") '<可註解移除
End Sub |
|