機能と数式 | VBA | セミナー | オンラインソフト | お問い合わせ | その他
Top > Excel > VBA > VBA高速化テクニック

何度も同じことをしない



内容にもよりますが、10行のマクロと1000行のマクロでは、普通10行のマクロの方が高速です。それは、行数が少ないからではなく、Excelが実行するコマンドの数が少ないからです。ちょっと乱暴な言い方をすれば、使用するプロパティやメソッドの数を少なくすればマクロの実行速度を上げられます。もちろん動作に必要なコードを削ることはできませんが、同じ動作を実現するにしてもコードを簡素化することは可能です。

ここでは、次のコードを検証します。

Sub Test1()
    Dim i As Long
    For i = 1 To 20000
        ActiveWorkbook.Sheets("Sheet1").Cells(i, 1).Value = _
            ActiveWorkbook.Sheets("Sheet1").Cells(i, 2).Value + _
            ActiveWorkbook.Sheets("Sheet1").Cells(i, 3).Value
    Next i
End Sub

Sub Test2()
    Dim i As Long
    With ActiveWorkbook.Sheets("Sheet1")
        For i = 1 To 20000
            .Cells(i, 1) = .Cells(i, 2) + .Cells(i, 3)
        Next i
    End With
End Sub

Test1 Test2 %
1回目  1.35 秒  0.98 秒  73.0% 
2回目  1.32 秒  0.98 秒  74.3% 
3回目  1.32 秒  0.97 秒  73.6% 
4回目  1.33 秒  0.97 秒  73.4% 
5回目  1.32 秒  0.98 秒  74.7% 
6回目  1.31 秒  0.97 秒  74.2% 
7回目  1.32 秒  0.98 秒  74.4% 
8回目  1.31 秒  0.99 秒  75.8% 
9回目  1.32 秒  0.99 秒  75.1% 
10回目  1.33 秒  1.02 秒  77.3% 
平均  1.32 秒  0.99 秒  74.6% 

速度的には、大きな改善ではありませんが、何よりも可読性とメンテナンス性が向上します。ちなみに、Withステートメントで操作対象のオブジェクトを省略した場合、メモリ内では自動的にオブジェクト型変数が用意され、その変数にオブジェクトが格納されます。Withステートメント内の「.Value」みたいなオブジェクト省略部分は、コンパイルされるときオブジェクト変数を利用した命令に置き換えられ、End With部分でオブジェクト型変数が解放される仕組みになっています。

参考までに、Withステートメントではなく、オブジェクト型変数を使った記述も検証してみましょう。

Sub Test2()
    Dim i As Long, Target As Worksheet
    Set Target = ActiveWorkbook.Sheets("Sheet1")
    For i = 1 To 20000
        Target.Cells(i, 1) = Target.Cells(i, 2) + Target.Cells(i, 3)
    Next i
End Sub

Test1 Test2 %
1回目  1.33 秒  0.75 秒  56.5% 
2回目  1.32 秒  0.75 秒  56.7% 
3回目  1.33 秒  0.73 秒  55.1% 
4回目  1.35 秒  0.76 秒  56.5% 
5回目  1.32 秒  0.73 秒  55.1% 
6回目  1.36 秒  0.73 秒  53.5% 
7回目  1.31 秒  0.74 秒  56.3% 
8回目  1.32 秒  0.72 秒  54.9% 
9回目  1.33 秒  0.73 秒  55.1% 
10回目  1.35 秒  0.73 秒  53.8% 
平均  1.33 秒  0.74 秒  55.4% 

若干ですが、Withステートメントよりも、明示的にオブジェクト型変数を使う方が速い結果になりました。まぁ、この程度の違いでしたら、可読性の優れている書き方を選択すればいいですね。



このエントリーをはてなブックマークに追加