『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【VBA】Timerで処理時間を計測する

VBA には 午前 0 時から経過した秒数を返す Timer 関数が用意されています。戻り値は単精度浮動小数点型 (Single) です。そんな関数をいったい何に使うのかといえば、主にマクロの中に書かれたコードの処理時間を計測するために用います。

【VBA】Timer関数を使って処理時間を計測します

VBA のコードを書くときに複数の方法を思いついて「どっちのほうが速いのかな?」と迷ったときには Timer関数 を使って計測してください。

最初に For…Next ステートメントを用いて二次元配列に 100 万個のデータを入れて処理時間を計測してみましょう。といっても、これぐらいの処理なら一瞬で終わります。

'[VBA] 処理時間計測サンプルコード(1)

Option Base 1

Sub Process_Speed_Test_A()

  Dim starttime As Single
  Dim myspeed As Single
  Dim j As Integer, k As Integer
  Dim y As Integer
  Dim x(1000, 1000) As long

  y = 0

  '処理前の時刻を記録
  starttime = Timer

  For j = 1 To 1000
    For k = 1 To 1000
      x(j, k) = y
      y = y + 1
    Next k
  Next j

  '処理時間を記録
  myspeed = Timer - starttime

  Debug.Print "処理時間は" & myspeed & "秒です"

End Sub

'Process_Speed_Test_A()の実行結果:
'処理時間は 0.078125 秒です(実行環境によって表示される速度は異なります)

Timer 関数で処理時間を計測するときには、計りたい処理の直前でまず最初の値をとります。Process_Speed_Test_A では繰返し処理直前に

starttime = Timer

で時刻を取得して変数 starttime に入れています。そして処理の直後にもう1度値をとって、最初にとった時刻から引き算して処理時間を計測します。

myspeed = Timer - starttime

次は予めワークシートの A1 セルから ALL1000 までの 100 万個のデータを2次元配列に放り込む時間を計ってみます。

'[VBA] 処理時間計測サンプルコード(2)

Sub Process_Speed_Test_B()

  Dim starttime As Single
  Dim myspeed As Single
  Dim myrange As Variant

  '処理前の時刻を記録
  starttime = Timer

  myrange = Range("A1:ALL1000")

  '処理時間を記録
  myspeed = Timer - starttime
 
  Debug.Print "処理時間は" & myspeed & "秒です"

End Sub

'Process_Speed_Test_B()の実行結果:
'処理時間は 0.375 秒です

やっぱり、ワークシートから値を取り込むにはかなり時間がかかりますね。
 
Timer 関数を使うと、セルの値を一定間隔ごとに更新するようなマクロも作れます。

Sub AutoUpdateCell()
    Dim startTime As Double
    Dim interval As Double
    Dim currentValue As Long
    
    ' 初期化
    interval = 3 ' 更新間隔(秒)
    currentValue = Int(Rnd() * 100) ' 0から99のランダムな整数を生成
    
    ' 初回の値表示
    Range("A1").Value = currentValue
    
    ' タイマー開始
    startTime = Timer
    
    Do
        ' 一定間隔で値を更新
        If Timer - startTime >= interval Then
            currentValue = Int(Rnd() * 100)
            Range("A1").Value = currentValue
            startTime = Timer ' タイマーリセット
        End If
        DoEvents
    Loop
End Sub

AutoUpdateCell を実行すると、セル A1 に表示される値が 3 秒ごとに更新されます。コード内でランダムな値を使用していますが、必要に応じて変更してください。上記のコードを実行すると無限ループに入るため、実行後に VBA エディタのリセットボタンをクリックして手動で停止するか、適切な条件でループを終了する処理を追加してください。

コメント