返回列表 上一主題 發帖

公式與基本技巧演練

B原則上也算保留字
若輸入B,EXCEL會自動改成bb
顯示數值以1900年為43起算的年度
1900年日期顯示成43
1901年日期顯示成44
以此類推
加上驚嘆號!或反斜線\或用雙引號""
都代表使用字元
只是反斜線會被EXCEL自動轉成驚嘆號
學海無涯_不恥下問

TOP

本帖最後由 Hsieh 於 2011-3-17 08:48 編輯

回復 39# FAlonso
這篇重點在於基本技巧演練,並不鼓勵使用VBA或函數解題
既然兄台使用VBA來做,而且您也提到一些VBA使用上的困擾
底下程式碼供您參考看看
您會發生錯誤原因可能發生在
dictionary物件加入項目的方法
您使用了add方法來加入項目
dictionary物件有一個特性,就是索引值不能重覆
當add方法加入索引時,若該索引值已經存在就會產生錯誤
避免此情況發生,可用exists方法先判斷索引值是否存在,然後再決定是否加入
在您的流程中dictionary物件是用不到的
而底下程式碼利用的方法是直接指定索引值對應的值
這樣,值會改變,但不會有重複索引疑慮
再則您提到速度問題
加快速度的方法因個案各有不同
以本題為例,首先是將資料範圍以陣列型態讀取
直接靠記憶體讀寫,會比一格一格的讀寫快很多
在來是當你要指定儲存格時,要儘量減少select的使用
直接指定欄列位也會使速度加快
減少不必要的循環與動作都是加速的方法
您可以自己試試看
  1. Sub Ex()
  2. Dim d As Object, d1 As Object, d2 As Object, Ar(), i&, A As Range, C As Range
  3. Set d = CreateObject("Scripting.Dictionary")
  4. Set d1 = CreateObject("Scripting.Dictionary")
  5. Set d2 = CreateObject("Scripting.Dictionary")
  6. d2("考生號") = "姓名"
  7. Ar = Range([A1], [A65536].End(xlUp).Offset(, 3))
  8. For i = 2 To UBound(Ar, 1)
  9.    d(Ar(i, 1) & Ar(i, 3)) = IIf(Ar(i, 4) < 65, "C", IIf(Ar(i, 4) < 85, "B", "A"))
  10.    d1(Ar(i, 3)) = ""
  11.    d2("'" & Ar(i, 1)) = Ar(i, 2)
  12. Next
  13. [G:Q].ClearContents
  14. Application.ScreenUpdating = False
  15. [G1].Resize(d2.Count, 1) = Application.Transpose(d2.keys)
  16. [H1].Resize(d2.Count, 1) = Application.Transpose(d2.items)
  17. [I1].Resize(, d1.Count) = d1.keys
  18. For Each A In Range([I1], [I1].End(xlToRight))
  19.    For Each C In Range([G2], [G65536].End(xlUp))
  20.       Cells(C.Row, A.Column) = d(C & A)
  21.    Next
  22. Next
  23. End Sub
複製代碼
學海無涯_不恥下問

TOP

回復 20# zeny
這些儲存格內容都變成了日期
這是你使用bb的緣故
自訂格式改成
[>=85]!A;[>=65]!B;C
學海無涯_不恥下問

TOP

        靜思自在 : 為人處世要小心細心,但不要「小心眼」。
返回列表 上一主題