Board logo

標題: 迴圈耗時的問題 [打印本頁]

作者: ziv976688    時間: 2019-8-22 01:24     標題: 迴圈耗時的問題

本帖最後由 ziv976688 於 2019-8-22 01:26 編輯

測試檔︰[attach]31172[/attach]

想將"前三小數"工作表的.Range("AP2:AP127")範圍內的"大"改為"小";
並將44號底色改為38號底色,4號底色改為40號底色,8號底色改為39號底色。
另將.Range("AX2:BB127")範圍內的"大"改為"小";
最後將[AP2:BC127].Copy [BE2]
目前的程式碼如下︰
'更改文字和底色  '=>列247
    For Each Rng In .Range("AP2:AP127")
        Rng.Value = Replace(Rng, "大", "小")
        i = Rng.Interior.ColorIndex
        Rng.Interior.ColorIndex = IIf(i = 44, 38, IIf(i = 4, 40, IIf(i = 8, 39, i)))
    Next
    For Each Rng In .Range("AX2:BB127")
        Rng.Value = Replace(Rng, "大", "小")
    Next
    [AP2:BC127].Copy [BE2]   '=>列256

問題︰上述的區段程式碼跑的時間異常(約須耗時15秒)。
需求︰請問要如何正確編寫?以利提升執行的效率。

PS︰附上2個.CSV測試檔
誠請各位大大不吝幫忙! 謝謝!

作者: ziv976688    時間: 2019-8-23 01:42

爬文許久,還是找不到適用的語法^^"
先以錄製的語法暫用~~如果可以再修減的話,誠請各位大大不吝賜教!謝謝!
'更改文字和底色
    Range("AP2:AP127").Select
    Application.FindFormat.Interior.ColorIndex = 44
    Application.ReplaceFormat.Interior.ColorIndex = 38
    Selection.Replace What:="大", Replacement:="小", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=True, _
        ReplaceFormat:=True
    Application.FindFormat.Interior.ColorIndex = 4
    Application.ReplaceFormat.Interior.ColorIndex = 40
    Selection.Replace What:="大", Replacement:="小", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=True, _
        ReplaceFormat:=True
    Application.FindFormat.Interior.ColorIndex = 8
    Application.ReplaceFormat.Interior.ColorIndex = 39
    Selection.Replace What:="大", Replacement:="小", LookAt:=xlPart, _
        SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=True, _
        ReplaceFormat:=True
   
    Range("AX2:BB127").Select
    Selection.Replace What:="大", Replacement:="小", LookAt:=xlPart
作者: linyancheng    時間: 2019-8-27 18:37

迴圈本身次數多,有時也會慢,尤其是對象是儲存格。
有些狀況可以不用迴圈,直接對整個範圍尋找取代,應該會比較快。
IIf本身比較慢,有時候程式碼較簡略,相對執行效率反而較低,把程式碼寫長一點,
Rng.Interior.ColorIndex = IIf(i = 44, 38, IIf(i = 4, 40, IIf(i = 8, 39, i)))
此行展開:
if .....then
elseif ...... then
else
end if
或用Select Case語句也行,
這樣的型式效率應該比較好。
作者: ziv976688    時間: 2019-8-27 22:00

回復 3# linyancheng
謝謝版主指教!我試試看^^
作者: mistery    時間: 2019-8-28 12:07

「取代」不要用迴圈,會省很多時間
Range("AP2:AP127").Replace What:="大", Replacement:="小"
Range("AX2:BB127").Replace What:="大", Replacement:="小"
作者: ziv976688    時間: 2019-8-28 16:37

回復 5# mistery
謝謝大大的指教。

可否再請問 : 底色取代要怎麼寫才正確?
謝謝您^^
作者: 准提部林    時間: 2019-8-28 20:30

Dim Ur(3) As Range, Cx%, Cv%, Crr
Crr = Array(0, 38, 40, 39)
.Range("AP2:AP127").Replace "大", "小"
For Each Rng In .Range("AP2:AP127")
    Cx = Rng.Interior.ColorIndex
    Cv = Switch(Cx = 44, 1, Cx = 4, 2, Cx = 8, 3, Cx = Cx, 0)
    If Ur(Cv) Is Nothing Then Set Ur(Cv) = Rng Else Set Ur(Cv) = Union(Ur(Cv), Rng)
    For i = 1 To 3
        If Not Ur(Cv) Is Nothing Then Ur(Cv).Interior.ColorIndex = Crr(i)
    Next i
Next
.Range("AX2:BB127").Replace "小", "大"
[AP2:BC127].Copy [BE2]

是否有快一些, 沒辦法測, 試試吧~~


=================================
作者: ziv976688    時間: 2019-8-29 03:00

本帖最後由 ziv976688 於 2019-8-29 03:03 編輯

回復 7# 准提部林
感謝版主的熱心相助。
測試結果 : 沒有受到  For Each Rng In .Range("AP2:AP127")...... Next  的迴圈影響,快很多。
萬分感謝^^
作者: 准提部林    時間: 2019-8-29 10:12

回復 8# ziv976688

更正:
Dim Ur(3) As Range, Cx%, Cv%, Crr
Crr = Array(0, 38, 40, 39)
.Range("AP2:AP127").Replace "大", "小"
For Each Rng In .Range("AP2:AP127")
    Cx = Rng.Interior.ColorIndex
    Cv = Switch(Cx = 44, 1, Cx = 4, 2, Cx = 8, 3, Cx = Cx, 0)
    If Ur(Cv) Is Nothing Then Set Ur(Cv) = Rng Else Set Ur(Cv) = Union(Ur(Cv), Rng)
Next
For i = 1 To 3  '這一段要從上方迴圈抓出來
     If Not Ur(Cv) Is Nothing Then Ur(Cv).Interior.ColorIndex = Crr(i)
Next i
.Range("AX2:BB127").Replace "小", "大"
[AP2:BC127].Copy [BE2]
作者: ziv976688    時間: 2019-8-29 11:29

回復 9# 准提部林
再次萬分感謝版主的熱心幫忙^^(鞠躬)




歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)