VBA Timer関数で処理時間を正確に測定|コード改善の第一歩

当ページのリンクには広告 (Amazonアソシエイト含む) が含まれています。
アイキャッチ

「VBAで作成したコードの処理時間を測定してみたい…」
このように悩んでいませんか?


特定の処理にかかる「時間」を計測したい

長時間かかる処理のパフォーマンスをチェックしたい

動作の遅い箇所を特定して、改善の手がかりにしたい

その場合は、VBAの「Timer関数」を
使用すると解決します!


この記事では、VBAのTimer関数を詳しく解説します。

どの処理に時間がかかっているのかを正確に測定し、マクロの遅い箇所を特定できます。
たとえば、大量データのフィルタ処理や複雑な計算で発生する無駄な待ち時間を可視化することが可能です。
測定結果をもとにコードを最適化することで、マクロの実行時間を大幅に短縮できます。
Timer関数を使えば、日々の業務効率化やタスクの自動化がさらにスムーズに進むはずです!

初心者の方でもすぐに使えるサンプルコードを用意していますので、ぜひ参考にしてください!


Timer関数を効率よく使用する方法についても別記事で解説しています。
もしよければこちらもご覧ください。

あわせて読みたい
VBA Timer関数応用編:柔軟な時間計測をモジュール化で実現! 「VBAで処理時間を計測したいけど、簡単で再利用しやすい仕組みにしたい…」このように悩んでいませんか? ・コピペでTimer関数をすぐに使いたい・複数タスクの処理時間...

【 この記事の概要 】

よく使う度
難しさ
覚えておくと安心度

VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?

そんな方には、UdemyのVBA講座がおすすめです。

動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べるVBA講座はこちら  /

目次

この記事で「できるようになる」こと

この記事を読むことで、次のことが分かるようになります。

Timer関数で何ができる?処理時間を測定して効率化を目指そう!

VBAのTimer関数を使えば、プログラムの実行時間を秒単位で正確に測定できます。
これにより、以下のようなことが可能になります。

  • 処理時間を計測して、どの処理に時間がかかっているのかを把握
  • 長時間かかる処理のボトルネックを特定して、プログラムを最適化
  • 経過時間を記録し、動作の遅い部分を詳細に分析

このように、大量のデータをフィルタ処理するマクロが「どの段階で時間を浪費しているか」を特定し、効率化につなげることができます。

Timer関数は、プログラムの「時間的な動作」を可視化する基本ツールです。
業務の効率化やマクロの改善に悩む方にとって、非常に役立つスキルと言えます。

「処理が遅い箇所を見つけて改善したい」「VBAのスクリプトをもっと効率的にしたい」と感じている方は、Timer関数を活用してみましょう!
VBAスキルを一歩進めるきっかけになります。

スポンサーリンク

VBAのTimer関数とは? | 処理時間を測定できる原理を解説

VBAのTimer関数は、「午前0時(00:00:00)から現在時刻までの経過秒数」を返す関数です。

例えば、午前1時30分であれば、以下のように計算されます。


Timer関数の戻り値を考える

Timer関数の基本構文

Timer関数は非常にシンプルに使うことができます。

以下がその基本的な構文です。

Timer関数の構成
設定解説
  • 変数名 (必須)
    • Timer関数の結果を格納するための変数名を指定します。
  • Double型 (任意)
    • 小数点以下の秒数を扱えるように、変数を「Double型」に指定します。
  • Timer (必須)
    • 午前0時からの経過秒数を取得する関数。

より詳しい情報は、Microsoft公式のタイマー関数を参照してください。

Timer関数が返す値の特徴

Timer関数の特徴
  • 単位:秒
    Timer関数の戻り値は秒単位で、小数点以下の値も含まれるため、ミリ秒単位の計測も可能です。
  • 日付をまたぐとリセットされる
    午前0時を基準として計測するため、日付をまたぐ場合には経過秒数がリセットされます。
    この性質を考慮したロジックが必要です。

Timer関数の簡単な使用例をご紹介

1: 現在の経過秒数を取得する

以下は、Timer関数の構成を基にした具体的なコード例です。

Sub ShowElapsedSeconds()
    Dim elapsedTime As Double '// Double型で宣言
    elapsedTime = Timer       '// 経過秒数を取得
    MsgBox "午前0時からの経過秒数は: " & elapsedTime & " 秒です"
End Sub
使用例:現在の経過秒数を取得する。の処理結果

2: Timer関数でコードの処理時間を測定する方法

Timer関数を使えば、処理の開始時刻と終了時刻を記録し、それらを引き算するだけで、実行時間を簡単に計測できます。

Sub MeasureProcessingTime()
    Dim startTime As Double
    Dim endTime As Double
    Dim elapsedTime As Double

    '// 計測開始
    startTime = Timer

    '// 何らかの処理

    '// 計測終了
    endTime = Timer

    '// 経過時間を計算
    elapsedTime = endTime - startTime

    '// 結果を表示
    MsgBox "処理時間: " & elapsedTime & " 秒"
End Sub
Timer関数で測定できる理由

Timer関数は、午前0時からの経過秒数をリアルタイムで返す機能があるため、開始時刻と終了時刻を記録してその差を取るだけで、実行時間を正確に測定できます。

小数点以下の秒数も取得可能なので、短い処理でもミリ秒単位の計測が可能です。

この仕組みにより、長い処理や複数の処理の効率を比較する際に、非常に役立ちます。

VBAのTimer関数と組み合わせてよく使われる便利な機能

Timer関数は、他のVBA機能と組み合わせることで、さらに効率的なコードを作成できます。

ここでは、Timer関数と相性の良い3つの機能を簡単にご紹介します。

1. Debug.Print: 処理時間をログとして記録

Timer関数で計測した時間をDebug.Printイミディエイトウィンドウに出力することで、処理時間を記録し、後から確認することができます。

特にテストやデバッグ時に役立つ機能です。

Debug.Printとの活用例

Sub LogProcessingTime()
    Dim startTime As Double
    Dim endTime As Double
    startTime = Timer

    '// 処理のシミュレーション
    Dim i As Long
    For i = 1 To 10000
        '// 何らかの処理
     Cells(i, 1) = i  '// ← 例えばセルの転記
    Next i

    endTime = Timer
    Debug.Print "処理時間: " & (endTime - startTime) & " 秒"
End Sub
Debug.Printとの活用例の結果

ポイント

イミディエイトウィンドウに出力された時間を参考に、プログラムの改善ポイントを特定できます。

コードの改善ヒントは「コード実行時間を改善するには? 効率化のためのヒント」をご確認ください。

2. DoEvents: 待機中でもExcelを操作可能に

Timer関数で時間を計測しながら待機処理を作る際、DoEventsを使うとExcelが固まらず、他の操作を受け付けられるようになります。

DoEventsは、VBAの処理を一時的に中断し、他の操作やイベントを実行可能にする機能です。
待機中でもExcelが「応答なし」とならず、ユーザー操作や他のプロセスを許可します。

DoEventsとの活用例

Sub WaitWithDoEvents()
    Dim startTime As Double
    startTime = Timer

    '// 5秒間待機しつつExcelを操作可能に
    Do While Timer < startTime + 5
        DoEvents
    Loop
    MsgBox "5秒経過しました!"
End Sub
DoEventsとの活用例の結果

ポイント

DoEventsを使うことで、待機中もExcelの操作や他のイベントが処理されます。

3. Application.Wait: 正確な時間指定の待機

Timer関数が経過時間を計測するのに対し、Application.Waitは特定の時刻まで待機するための機能です。

Application.Waitは、指定した時刻までVBAの処理を完全に停止させる機能です。
待機中はExcelの操作を一切受け付けず、正確な時間指定が必要な場合に適しています。

Application.Waitとの活用例

Sub WaitWithApplicationWait()
    Application.Wait Now + TimeValue("00:00:05") ' 5秒待機
    MsgBox "5秒経過しました!"
End Sub
Application.Waitとの活用例の結果

ポイント

特定の時刻まで待機させたい場合に便利です。
ただし、待機中は完全に操作不能になります。

組み合わせてできることのまとめ

Timer関数との組み合わせて使用される機能まとめ
  • Timer + Debug.Print
    • 処理時間を記録してプログラムの改善点を発見。
  • Timer + DoEvents
    • 待機中でもExcelを操作可能にし、柔軟な処理を実現。
  • Timer + Application.Wait
    • 時間計測と正確な待機処理を組み合わせて安定したスクリプトを作成。

Timer関数をメインに、これらの機能を組み合わせることで、時間計測を活用したより実用的なマクロを作成できます!

スポンサーリンク

日付をまたぐ際のTimer関数の注意ポイント

Timer関数は、午前0時を基準に経過秒数を返すため、日付をまたぐと値がリセットされる仕様があります。

これにより、長時間の処理や深夜に実行されるマクロでは、経過時間の計算に問題が発生することがあります。

問題の例

例えば、深夜に動作するマクロで処理開始時刻が「23:59」終了時刻が翌日「0:01」の場合、Timer関数は以下の値を返します。

日をまたぐとどうなる?
  • 開始時刻 (23:59) : 約86340秒
  • 終了時刻 (0:01) : 約60秒

この場合、経過時間を単純に 終了時刻 - 開始時刻 で計算すると、負の値となり正しい結果が得られません。

解決方法 : サンプルコード

日付をまたぐ場合は、以下のように条件分岐を加えることで正確な経過時間を計算できます。

Sub HandleTimerAcrossMidnight()
    Dim startTime As Double
    Dim endTime As Double
    Dim elapsedTime As Double

    startTime = Timer
    '// 深夜をまたぐ場合のシミュレーション
    Application.Wait Now + TimeValue("00:00:05") '// 5秒待機
    endTime = Timer

    If endTime < startTime Then
        elapsedTime = (86400 - startTime) + endTime '// 86400秒 = 1日
    Else
        elapsedTime = endTime - startTime
    End If

    MsgBox "経過時間: " & elapsedTime & " 秒"
End Sub

ポイント解説

ポイント
  • 条件分岐を追加
    • 終了時刻が開始時刻より小さい場合、日付をまたいだと判断し、補正を加えます。
  • 86400秒 = 1日
    • Timer関数は1日(24時間)でリセットされるため、日付をまたぐ場合は「1日の総秒数(86400秒)」を基準に計算します。

Timer関数はシンプルで便利な機能ですが、日付をまたぐ処理では適切な条件分岐が必要です。

この問題に対処することで、深夜に動作するマクロや長時間処理でも正確な経過時間を計測できます。

スポンサーリンク

VBAのTimer関数を使った使用例をご紹介

ここでは、VBAのTimer関数を使って、日付に対する加算・減算を行う具体的な使用例を紹介します。

以下に紹介する使用例は、すべてコピペしてすぐに実行できるコードです。
気になる例は、ぜひご覧いただき、実際に実行してみてください。

VBAの基礎から応用までを効率よくしっかり学習したい方には、UdemyのVBA講座もおすすめです。

特に自己学習で進める場合、ビデオや実践例があると理解が進みやすくなります。

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べるVBA講座はこちら  /

使用例1: 処理時間を正確に計測してプログラムを最適化

VBAのTimer関数を使用して、特定の処理にかかる時間を正確に計測する方法を紹介します。

この方法を使うと、処理時間を見える化して、プログラムの効率化ポイントを発見することができます。

コード例 | 処理時間を計測する基本例

Sub MeasureProcessingTime()
    Dim startTime As Double
    Dim endTime As Double
    Dim elapsedTime As Double

    '// 計測開始
    startTime = Timer

    '// 計測対象の処理(例: セルへの値の入力)
    Dim i As Long
    For i = 1 To 100000
        Cells(i, 1).Value = i
    Next i

    '// 計測終了
    endTime = Timer

    '// 経過時間を計算
    elapsedTime = endTime - startTime

    '// 結果を表示
    MsgBox "処理時間: " & elapsedTime & " 秒", vbInformation
End Sub

処理結果

使用例1: 処理時間を正確に計測してプログラムを最適化の処理結果

コードの動作概要

STEP
計測開始時刻を取得

Timer関数で処理開始時刻を取得。値は秒単位で記録されます。

STEP
計測対象の処理を実行

この例では、セルA1からA100000までに連続した値を入力する処理を計測しています。

STEP
計測終了時刻を取得

処理終了時刻をTimer関数で取得します。

STEP
経過時間を計算

endTimeからstartTimeを引くことで、処理時間(秒単位)を計算します。

STEP
結果を表示
  • メッセージボックスに計測結果を表示します。

このコードで使用している機能

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub MeasureProcessingTime()
    • マクロの開始を表します。
      「MeasureProcessingTime」という名前でサブルーチン(処理のまとまり)を定義しています。
      このマクロは、処理時間を計測するコード全体を指します。
  2. Dim startTime As Double
    Dim endTime As Double
    Dim elapsedTime As Double
    • 「startTime」: 処理の開始時刻を秒単位で格納します。
    • 「endTime」: 処理の終了時刻を秒単位で格納します。
    • 「elapsedTime」: 経過時間(終了時刻 – 開始時刻)を格納します。
    • いずれも「Double型(小数点を含む数値型)」です。
      秒単位で細かい計測を行うために適しています。
  3. startTime = Timer
    • Timer関数を使って、処理を開始する前の現在時刻を取得し、変数「startTime」に保存します。
      Timerは、0:00(午前0時)からの経過秒数を返すため、この時点での時間が記録されます。
  4. Dim i As Long
    • 変数「i」をLong型(整数)で宣言しています。
      「i」はループ処理(繰り返し処理)で使用され、1から100000までの番号を管理します。
  5. For i = 1 To 100000
    Cells(i, 1).Value = i
    Next i
    • Forループを使用して、特定の処理を繰り返します。
    • この処理では、ExcelのA列(1列目)の1行目から100000行目までに、1から100000までの値を順番に入力しています。
      • 「For i = 1 To 100000」 : 「i」を1から100000までの値で繰り返します。
      • 「Cells(i, 1).Value = i」 : Excelの「Cells」を使って、「i」行目のA列に「i」の値を入力します。
      • 「Next i」 : 次の値(i+1)に進みます。
        この処理を100000回繰り返します。
  6. endTime = Timer
    • Timer関数を再び使って、処理が終了した時点の現在時刻を取得し、変数「endTime」に保存します。
      これで処理の開始時刻(startTime)と終了時刻(endTime)が記録されました。
  7. elapsedTime = endTime – startTime
    • 開始時刻(startTime)と終了時刻(endTime)の差を計算して、経過時間を求めています。
      この結果(経過時間)は、秒単位で正確に計算されます。
      例: 処理開始が100秒、終了が102秒なら、経過時間は「102 – 100 = 2秒」となります。
  8. MsgBox “処理時間: ” & elapsedTime & ” 秒”, vbInformation
    • 処理結果をポップアップ(メッセージボックス)で表示します。
      「”処理時間: “」という文字列と、「elapsedTime」で計算された経過時間を連結しています。
      「vbInformation」を指定して、情報アイコン(”i”のマーク)が付いたメッセージボックスを表示します。
  9. End Sub
    • マクロの終了を示します。

総括・ポイント

このコードは、Timer関数を使って特定の処理時間を計測する具体的な例です。

  • メリット
    • プログラムの効率化ポイントを特定できる。
    • 実行環境やデータ量に応じたパフォーマンスの違いを把握可能。
  • ポイント
    • 長時間の処理では、Timerの値がリセットされるケースに注意が必要です(日付をまたぐ場合の対処方法は別セクションで解説)。
  • 応用
    • 処理対象を変更することで、任意のVBAスクリプトの処理時間を計測可能。
    • 複数の処理を比較してパフォーマンス最適化の指標を得ることも可能。
スポンサーリンク

コード実行時間を改善するには? 効率化のためのヒント

Timer関数を使ってコードの実行時間を測定したら、次はその結果を基に改善に取り組みましょう。

以下は、実行時間を短縮するために検討すべきポイントと具体的な改善方法のヒントです。

これらを活用して、より効率的なVBAコードを作成しましょう。

1. 配列を使ってみよう

セルに対して1つ1つ値を設定すると時間がかかるため、データ操作を配列でまとめて処理することで速度を大幅に向上させることができます。

ポイント
  • 配列に一括でデータを格納し、最後にセル範囲に書き戻すようにする。
  • Forループ内で直接セルを操作しない。

コード例

Sub UseArrayForEfficiency()
    Dim dataArray() As Long
    Dim i As Long

    '// 配列にデータを格納
    ReDim dataArray(1 To 100000)
    For i = 1 To 100000
        dataArray(i) = i
    Next i

    '// 配列をシートに書き戻し
    Sheet1.Range("A1:A100000").Value = Application.Transpose(dataArray)
End Sub
配列のコード例処理結果
あわせて読みたい
VBA 配列の使い方徹底解説:宣言、初期化、動的配列・ソートもわかる基本ガイド 「ループ処理を使ってセルにデータを転記していたけれど、データが増えると動作が遅くなる…」このように困ったことはありませんか? ・複数のデータをまとめて管理する...

2. ScreenUpdatingを無効にしてみる

ScreenUpdating(画面更新)は、処理中にExcelの画面表示を更新する機能です。

これを無効にすると、余計なリソースを消費せず処理を高速化できます。

ポイント
  • 処理開始時にApplication.ScreenUpdating = Falseを設定し、終了時にTrueに戻します。

コード例

Sub DisableScreenUpdating()
    Application.ScreenUpdating = False

    '// 処理内容
    For i = 1 To 100000
        Cells(i, 1).Value = i
    Next i

    Application.ScreenUpdating = True
End Sub

3. 計算モードを手動に設定する

Excelの再計算機能は大きなデータ処理で時間がかかる要因になります。

コード実行中は計算モードを手動に変更し、終了後に自動に戻すことで効率化できます。

ポイント
  • Application.CalculationxlCalculationManualに設定する。
  • 処理が終わったら必ずxlCalculationAutomaticに戻す。

コード例

Sub ManualCalculation()
    Application.Calculation = xlCalculationManual

    '// 処理内容
    For i = 1 To 100000
        Cells(i, 1).Value = i
    Next i

    Application.Calculation = xlCalculationAutomatic
End Sub

4. 範囲操作を最適化する

Excelのセルや範囲を何度も操作するのは非効率です。

Rangeオブジェクトを適切に使うことで、操作を最小限に抑えることができます。

ポイント
  • 一度に複数セルを操作する。
  • 範囲オブジェクトを変数に格納して繰り返し使う。

コード例

Sub OptimizeRangeOperations()
    Dim rng As Range
    Set rng = Sheet1.Range("A1:A100000")

    '// 一括操作
    rng.Value = "=ROW()"
End Sub

この記事のまとめ

この記事では、VBA Timer関数を活用した時間計測の基本と応用例を解説しました。

Timer関数は処理時間の測定をはじめ、マクロの効率化に役立つ便利なツールです。

ポイントのおさらい

さらに学ぶために

Timer関数は、単なる時間計測に留まらず、業務効率化やコードの最適化にも役立つVBAの基礎機能です。

今回の解説を基に、ぜひ実際のマクロ作成で活用してください。

効率的なVBAコードを作り、作業時間を短縮する第一歩を踏み出しましょう!

Timer関数を効率よく使用する方法についても別記事で解説しています。
もしよければこちらもご覧ください。

あわせて読みたい
VBA Timer関数応用編:柔軟な時間計測をモジュール化で実現! 「VBAで処理時間を計測したいけど、簡単で再利用しやすい仕組みにしたい…」このように悩んでいませんか? ・コピペでTimer関数をすぐに使いたい・複数タスクの処理時間...
あわせて読みたい
サイトマップ このページは、本サイトの記事を分かりやすくまとめました。ぜひご覧ください。 目次 「VBA」を見る 「Officeスクリプト」を見る 「ワークシート関数」を見る 「Python...
スポンサーリンク
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次