返回列表 上一主題 發帖

[發問] (己解決!) 想請教各位,那一種寫法比較快一點? (想優化一下)

[發問] (己解決!) 想請教各位,那一種寫法比較快一點? (想優化一下)

本帖最後由 StanleyVic 於 2011-8-9 14:50 編輯

各位大大好,本人想優化一下代碼, 請教如下:
如果把公式 : AN6 =IF(D6<>"",T6-AI6,"") 寫成 vba
1. 本人有幾萬行記錄,所以寫了2種寫法,想請教那一個比種可以跑得快一點?
   (可以的話..解釋一下)
2. 如各位大大有更好的寫法,請指教.

====================================================
寫法 (一)
Private Sub CommandButton12_Click()
Dim j,AA as integer
    Sheets("Status B Log").Activate
    For j = 6 To Range("A65536").End(xlUp).Row
        If Cells(j, "D") <> "" Then
           AA = Cells(j, "T") - Cells(j, "AI")
           Cells(j, "AN") = Application.WorksheetFunction.Round(AA, 2)
        Else
           Cells(j, "AN") = ""
        End If
    Next j
        ThisWorkbook.Save
        MsgBox (" Quoted vs Invoice ( Variance ) - OK !")
End Sub

------------
寫法 (二)

Private Sub CommandButton12_Click()
Dim i As Integer
    Sheets("Status B Log").Activate
    For i = 6 To Range("D65536").End(xlUp).Row
        Cells(i, "AN").FormulaR1C1 = "=IF(RC[-36]<>"""",RC[-20]-RC[-5],"""")"
        Cells(i, "AN") = Round(Cells(i, "AN").Value, 2)
    Next i
        ThisWorkbook.Save
        MsgBox (" Quoted vs Invoice ( Variance ) - OK !")
End Sub
NeverTry , NeverNo !

本帖最後由 StanleyVic 於 2011-7-19 11:39 編輯

首先,本人十分感謝"GBKEE" 和 "oobird" 的回答,
真想不到..一個公式 AN6 =IF(D6<>"",T6-AI6,"")  在vba 中可以千萬萬化.
好. 我現就總結一下 : 如果我了解錯,請各位大大指出.

我的寫法1 和 2 的時間都一樣是 1.157407 秒.
但如果要我說快, 我會選2, 因為1中我細心查真的如 GBKEE 所說,我迴了圈子.
因為寫法1當中, 可以直接把 AA 代入,不用再多一層.所以我寫 2會比1 快一點.
AA = Cells(j, "T") - Cells(j, "AI")
Cells(j, "AN") = Application.WorksheetFunction.Round(AA, 2)

'----------------------------
方法3 (GBKEE) 和 方法4 (oobird)
老實說,太令我震驚, 我的 顯示是 0秒..
問題 :
1. 請問大大, 你們的format 是如何寫才能算出 毫秒 ?
2. 請問方法3(GBKEE) 中 以下這句代碼的用處是什麼 ?
    Set Rng = Rng.SpecialCells(xlCellTypeConstants)   'D欄有資料範圍
   我不明白它的意思..
NeverTry , NeverNo !

TOP

本帖最後由 StanleyVic 於 2011-7-19 12:30 編輯

回復 3# oobird

回方法四 : "oobird" 您好! 你的方法是先全都定義好.能快速跑完代碼.謝謝你的建議.
但本人真的很新手..也有很多代碼的地方,還未了解透.因想多學習....希望你不介意..能為我解釋一下.萬分感謝.
一. 代碼中 Dim j&, n&, d, t, ai, arr   的 & 是什麼時意思..?

   n = .Range("d65536").End(xlUp).Row
   d = .Range("d6:d" & n)
   t = .Range("t6:t" & n)
   ai = .Range("ai6:ai" & n)

二. 以上我了解到是你想預先定義好, 方便運行vba 公式 AN6 =IF(D6<>"",T6-AI6,"") 而建立的
   可能我對 ReDim arr 不太熟和不了解,讓我下面不能解讀了.. (以下綠色是我了解的地方,如有錯請更正我的思考)

   ReDim arr(1 To UBound(d), 0)                                                                       ' 數組 由 [D6:DN]    
    For j = 1 To n - 6                                                                                      ' 記錄的行數 (只有內容的行數 6~n)    
        If d(j, 1) <> "" Then                                                                               ' 公式�堛漣P斷語句.if(d6<>""    
          arr(j, 0) = Application.WorksheetFunction.Round(t(j, 1) - ai(j, 1), 2)             ' 這句 arr(j,0) 中的 0 是什麼 ?   
        End If
    Next j                                                                                                        
    .Cells(6, "AN").Resize(UBound(d), 1) = arr                                                       ' 不明白這句代碼    
    End With

再次謝過"oobird" 辛苦了.. !! :loveliness: :handshake
NeverTry , NeverNo !

TOP

本帖最後由 StanleyVic 於 2011-7-19 14:45 編輯

回復 8# GBKEE

謝謝"GBKEE-版主"給我的意見..
感謝你引導了我.. 關於Timer 和與Time 區別.
現在我可以實現了"毫秒"的出現.

另外 :
不明白的地方.......... 我.......
好的..我會再多多學習.增強一下自己的基本功.
謝謝你對我們新人的期待 ^_^"
NeverTry , NeverNo !

TOP

        靜思自在 : 成功是優點的發揮,失敗是缺點的累積。
返回列表 上一主題