2010年5月26日水曜日

【速度対決】10万セルに値を書き出す【VBA】

 A1:CV1000(1000行×100列=10万セル)に値を書き出してみます。

Public StartTime As Double
Public EndTime As Double

Sub TimerStart()
    StartTime = Timer
End Sub

Sub TimerStop()
    EndTime = Timer
    MsgBox (EndTime - StartTime & " 秒")
End Sub

Sub Sample01()
    [a1:cv1000].Clear
    Call TimerStart         '---- 測定開始
    For r = 1 To 1000
        For c = 1 To 100
            '-- セルを一つずつ呼び出し
            Cells(r, c) = r
        Next c
    Next r
    Call TimerStop          '---- 約33.8秒
End Sub

Sub Sample02()
    [a1:cv1000].Clear
    Call TimerStart         '---- 測定開始
    '-- 画面の更新を停止
    Application.ScreenUpdating = False
    For r = 1 To 1000
        For c = 1 To 100
            '-- セルを一つずつ呼び出し
            Cells(r, c) = r
        Next c
    Next r
    Application.ScreenUpdating = True
    Call TimerStop          '---- 約21.4秒
End Sub

Sub Sample03()
    [a1:cv1000].Clear
    Call TimerStart         '---- 測定開始
    Dim x(1 To 1000, 1 To 100)
    For r = 1 To 1000
        For c = 1 To 100
            '-- あらかじめ配列に代入
            x(r, c) = r
        Next c
    Next r
    '-- 配列の内容をセルへ一気に書き出し
    [a1:cv1000] = x
    Call TimerStop          '---- 約0.13秒
End Sub

 Sample01ではCells()で各セルに直接アクセス。
 Sample02はSample01と同じコードで画面の更新を停止。
 Sample03ではあらかじめ配列へ代入した後にセルへ一気に書き出しています。
 一番遅いSample01でも、1万セルまでであれば3秒程度で終了しますので、1万セルを境にコードの最適化を考えれば十分かも知れません。

0 件のコメント:

コメントを投稿