YiaoWang
{@last-update}
前へ | 目次 | 次へ

Excel VBA:高速化 >ループ内:書式の設定をまとめてする


結論

【改修前】
Public Sub Test1(ByVal MAX_COUNT As Long)
    Dim y As Long
    For y = 1 To MAX_COUNT
        Cells(y, 1) = y
        ' セルの書式を"###,0"にする
        Cells(y, 1).NumberFormatLocal = "#,##0"
    Next
End Sub

【改修後】
Public Sub Test2(ByVal MAX_COUNT As Long)
    Dim y As Long
    For y = 1 To MAX_COUNT
        Cells(y, 1) = y
    Next
    ' セルの書式を"###,0"にする
    Range("A1:A" & MAX_COUNT).NumberFormatLocal = "#,##0"
End Sub

【参考】
Public Sub Test3(ByVal MAX_COUNT As Long)
    Dim y As Long
    For y = 1 To MAX_COUNT
        Cells(y, 1) = y
    Next
    ' 1行目のセルの書式を"###,0"にして残りの行に書式をコピーする
    Cells(1, 1).NumberFormatLocal = "#,##0"
    Cells(1, 1).Copy
    Range("A1:A" & MAX_COUNT).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
        SkipBlanks:=False, Transpose:=False
End Sub

説明

処理がなければ速度は最速です。 セルの書式や罫線などを事前に設定しておくことで問題ないなら VBA での実装は止めましょう。
但し、この場合は、ユーザが設定を変更してしまう可能性を考慮しておかなければなりません。 業務システムでは、シートの保護等でユーザが変更できないことを保証しない限りは、 事前の設定は難しいと思います。

一括設定できるものをループの外で実装することは、処理速度だけでなく、処理の分離にもつながり、 可読性、保守性も上がります。

尚、今回は1列に対しての書式設定の計測比較を行いました。 複数列に対して、列ごとに異なる書式を設定する必要がある場合、Test2 と Test3 の速度比に 変化があるかどうかは試してみる価値があると思います。


参考:結論のソースの処理時間比較

MAX_COUNT Test1 Test2 Test3 Test2/Test1
1,000 1.4555秒 0.0461秒 0.1258秒 3.2%
10,000 11.768秒 0.3938秒 0.5828秒 3.4%
100,000 117.0531秒 4.6617秒 6.0312秒 4.0%

参考ページ



前へ | 目次 | 次へ
inserted by FC2 system