- 帖子
- 4901
- 主題
- 44
- 精華
- 24
- 積分
- 4916
- 點名
- 141
- 作業系統
- Windows 7
- 軟體版本
- Office 20xx
- 閱讀權限
- 150
- 性別
- 男
- 來自
- 台北
- 註冊時間
- 2010-4-30
- 最後登錄
- 2025-6-11
               
|
本帖最後由 Hsieh 於 2011-3-17 08:48 編輯
回復 39# FAlonso
這篇重點在於基本技巧演練,並不鼓勵使用VBA或函數解題
既然兄台使用VBA來做,而且您也提到一些VBA使用上的困擾
底下程式碼供您參考看看
您會發生錯誤原因可能發生在
dictionary物件加入項目的方法
您使用了add方法來加入項目
dictionary物件有一個特性,就是索引值不能重覆
當add方法加入索引時,若該索引值已經存在就會產生錯誤
避免此情況發生,可用exists方法先判斷索引值是否存在,然後再決定是否加入
在您的流程中dictionary物件是用不到的
而底下程式碼利用的方法是直接指定索引值對應的值
這樣,值會改變,但不會有重複索引疑慮
再則您提到速度問題
加快速度的方法因個案各有不同
以本題為例,首先是將資料範圍以陣列型態讀取
直接靠記憶體讀寫,會比一格一格的讀寫快很多
在來是當你要指定儲存格時,要儘量減少select的使用
直接指定欄列位也會使速度加快
減少不必要的循環與動作都是加速的方法
您可以自己試試看- Sub Ex()
- Dim d As Object, d1 As Object, d2 As Object, Ar(), i&, A As Range, C As Range
- Set d = CreateObject("Scripting.Dictionary")
- Set d1 = CreateObject("Scripting.Dictionary")
- Set d2 = CreateObject("Scripting.Dictionary")
- d2("考生號") = "姓名"
- Ar = Range([A1], [A65536].End(xlUp).Offset(, 3))
- For i = 2 To UBound(Ar, 1)
- d(Ar(i, 1) & Ar(i, 3)) = IIf(Ar(i, 4) < 65, "C", IIf(Ar(i, 4) < 85, "B", "A"))
- d1(Ar(i, 3)) = ""
- d2("'" & Ar(i, 1)) = Ar(i, 2)
- Next
- [G:Q].ClearContents
- Application.ScreenUpdating = False
- [G1].Resize(d2.Count, 1) = Application.Transpose(d2.keys)
- [H1].Resize(d2.Count, 1) = Application.Transpose(d2.items)
- [I1].Resize(, d1.Count) = d1.keys
- For Each A In Range([I1], [I1].End(xlToRight))
- For Each C In Range([G2], [G65536].End(xlUp))
- Cells(C.Row, A.Column) = d(C & A)
- Next
- Next
- End Sub
複製代碼 |
|