返回列表 上一主題 發帖

迴圈耗時的問題

迴圈耗時的問題

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

測試檔︰ 迴圈問題.rar (104.1 KB)

想將"前三小數"工作表的.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測試檔
誠請各位大大不吝幫忙! 謝謝!

爬文許久,還是找不到適用的語法^^"
先以錄製的語法暫用~~如果可以再修減的話,誠請各位大大不吝賜教!謝謝!
'更改文字和底色
    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

TOP

迴圈本身次數多,有時也會慢,尤其是對象是儲存格。
有些狀況可以不用迴圈,直接對整個範圍尋找取代,應該會比較快。
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語句也行,
這樣的型式效率應該比較好。
Word呈現極致的靜態之美,Excel展現極致的動態之美。

TOP

回復 3# linyancheng
謝謝版主指教!我試試看^^

TOP

「取代」不要用迴圈,會省很多時間
Range("AP2:AP127").Replace What:="大", Replacement:="小"
Range("AX2:BB127").Replace What:="大", Replacement:="小"

TOP

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

可否再請問 : 底色取代要怎麼寫才正確?
謝謝您^^

TOP

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]

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


=================================
EXCEL參考資料:
http://blog.xuite.net/smile1000mile/blog

TOP

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

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

TOP

回復 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]
EXCEL參考資料:
http://blog.xuite.net/smile1000mile/blog

TOP

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

TOP

        靜思自在 : 能善用時間的人,必能掌握自己努力的方向。
返回列表 上一主題