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

・特定の処理にかかる「時間」を計測したい
・長時間かかる処理のパフォーマンスをチェックしたい
・動作の遅い箇所を特定して、改善の手がかりにしたい



その場合は、VBAの「Timer関数」を
使用すると解決します!
この記事では、「VBAのTimer関数」を詳しく解説します。
どの処理に時間がかかっているのかを正確に測定し、マクロの遅い箇所を特定できます。
たとえば、大量データのフィルタ処理や複雑な計算で発生する無駄な待ち時間を可視化することが可能です。
測定結果をもとにコードを最適化することで、マクロの実行時間を大幅に短縮できます。
Timer関数を使えば、日々の業務効率化やタスクの自動化がさらにスムーズに進むはずです!
初心者の方でもすぐに使えるサンプルコードを用意していますので、ぜひ参考にしてください!
Timer関数を効率よく使用する方法についても別記事で解説しています。
もしよければこちらもご覧ください。


【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
VBAをしっかり学びたいけれど、「どこから始めればいいかわからない」と迷っていませんか?
そんな方には、UdemyのVBA講座がおすすめです。
動画での丁寧な解説や、実践的な学習スタイルで、初心者でも無理なく基礎から応用まで習得できます。
自己学習を進める上で、何度でも繰り返し見返せる講座は非常に心強い味方になりますよ!


\ 自分のペースで学べるVBA講座はこちら /
この記事で「できるようになる」こと
この記事を読むことで、次のことが分かるようになります。
- VBAのTimer関数で何ができるのか?確認する
- Timer関数の基礎を習得する
- Timer関数はどういう機能と合わせてよく使用されるか?チェックする
- Timer関数の注意ポイントを確認する
- Timer関数の使用例を確認する
Timer関数で何ができる?処理時間を測定して効率化を目指そう!
VBAのTimer関数を使えば、プログラムの実行時間を秒単位で正確に測定できます。
これにより、以下のようなことが可能になります。
- 処理時間を計測して、どの処理に時間がかかっているのかを把握
- 長時間かかる処理のボトルネックを特定して、プログラムを最適化
- 経過時間を記録し、動作の遅い部分を詳細に分析
このように、大量のデータをフィルタ処理するマクロが「どの段階で時間を浪費しているか」を特定し、効率化につなげることができます。
Timer関数は、プログラムの「時間的な動作」を可視化する基本ツールです。
業務の効率化やマクロの改善に悩む方にとって、非常に役立つスキルと言えます。
「処理が遅い箇所を見つけて改善したい」「VBAのスクリプトをもっと効率的にしたい」と感じている方は、Timer関数を活用してみましょう!
VBAスキルを一歩進めるきっかけになります。
VBAのTimer関数とは? | 処理時間を測定できる原理を解説
VBAのTimer関数は、「午前0時(00:00:00)から現在時刻までの経過秒数」を返す関数です。
例えば、午前1時30分であれば、以下のように計算されます。


Timer関数の基本構文
Timer関数は非常にシンプルに使うことができます。
以下がその基本的な構文です。


- 変数名 (必須)
- Timer関数の結果を格納するための変数名を指定します。
- Double型 (任意)
- 小数点以下の秒数を扱えるように、変数を「Double型」に指定します。
- Timer (必須)
- 午前0時からの経過秒数を取得する関数。
より詳しい情報は、Microsoft公式のタイマー関数を参照してください。
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関数は、午前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


ポイント
イミディエイトウィンドウに出力された時間を参考に、プログラムの改善ポイントを特定できます。
コード実行時間を改善するには? 効率化のためのヒント」をご確認ください。
コードの改善ヒントは「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
を使うことで、待機中も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


ポイント
特定の時刻まで待機させたい場合に便利です。
ただし、待機中は完全に操作不能になります。
組み合わせてできることのまとめ
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講座もおすすめです。
特に自己学習で進める場合、ビデオや実践例があると理解が進みやすくなります。


\ 自分のペースで学べる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
処理結果


コードの動作概要
Timer
関数で処理開始時刻を取得。値は秒単位で記録されます。
この例では、セルA1からA100000までに連続した値を入力する処理を計測しています。
処理終了時刻をTimer
関数で取得します。
endTime
からstartTime
を引くことで、処理時間(秒単位)を計算します。
- メッセージボックスに計測結果を表示します。
このコードで使用している機能
1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Sub MeasureProcessingTime()
- マクロの開始を表します。
「MeasureProcessingTime」という名前でサブルーチン(処理のまとまり)を定義しています。
このマクロは、処理時間を計測するコード全体を指します。
- マクロの開始を表します。
- Dim startTime As Double
Dim endTime As Double
Dim elapsedTime As Double- 「startTime」: 処理の開始時刻を秒単位で格納します。
- 「endTime」: 処理の終了時刻を秒単位で格納します。
- 「elapsedTime」: 経過時間(終了時刻 – 開始時刻)を格納します。
- いずれも「Double型(小数点を含む数値型)」です。
秒単位で細かい計測を行うために適しています。
- startTime = Timer
- Timer関数を使って、処理を開始する前の現在時刻を取得し、変数「startTime」に保存します。
Timerは、0:00(午前0時)からの経過秒数を返すため、この時点での時間が記録されます。
- Timer関数を使って、処理を開始する前の現在時刻を取得し、変数「startTime」に保存します。
- Dim i As Long
- 変数「i」をLong型(整数)で宣言しています。
「i」はループ処理(繰り返し処理)で使用され、1から100000までの番号を管理します。
- 変数「i」をLong型(整数)で宣言しています。
- 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回繰り返します。
- endTime = Timer
- Timer関数を再び使って、処理が終了した時点の現在時刻を取得し、変数「endTime」に保存します。
これで処理の開始時刻(startTime)と終了時刻(endTime)が記録されました。
- Timer関数を再び使って、処理が終了した時点の現在時刻を取得し、変数「endTime」に保存します。
- elapsedTime = endTime – startTime
- 開始時刻(startTime)と終了時刻(endTime)の差を計算して、経過時間を求めています。
この結果(経過時間)は、秒単位で正確に計算されます。
例: 処理開始が100秒、終了が102秒なら、経過時間は「102 – 100 = 2秒」となります。
- 開始時刻(startTime)と終了時刻(endTime)の差を計算して、経過時間を求めています。
- MsgBox “処理時間: ” & elapsedTime & ” 秒”, vbInformation
- 処理結果をポップアップ(メッセージボックス)で表示します。
「”処理時間: “」という文字列と、「elapsedTime」で計算された経過時間を連結しています。
「vbInformation」を指定して、情報アイコン(”i”のマーク)が付いたメッセージボックスを表示します。
- 処理結果をポップアップ(メッセージボックス)で表示します。
- 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




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.Calculation
をxlCalculationManual
に設定する。- 処理が終わったら必ず
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関数の基本を学ぶ
- Timer関数は、午前0時から現在時刻までの経過秒数を返す関数です。
その仕組みや基本構文を解説しました。
⇒ 「VBAのTimer関数とは? | 処理時間を測定できる原理を解説」をもう一度見る
- Timer関数は、午前0時から現在時刻までの経過秒数を返す関数です。
- Timer関数を使った時間計測の実用例
- Timer関数を使った処理時間の測定方法をサンプルコードで解説しました。
特定の処理がどれだけ時間を要するかを正確に把握できます。
⇒ 「VBAのTimer関数を使った使用例をご紹介」をもう一度見る
- Timer関数を使った処理時間の測定方法をサンプルコードで解説しました。
- Timer関数の注意ポイント
- 日付をまたぐ場合に発生する値のリセット問題への対処法を解説しました。
深夜実行や長時間処理でも正確な計測を行う方法を紹介しました。
⇒ 「日付をまたぐ際のTimer関数の注意ポイント」をもう一度見る
- 日付をまたぐ場合に発生する値のリセット問題への対処法を解説しました。
- コード改善のヒント
- Timer関数で測定した処理時間を基にコードを改善する方法を紹介しました。
配列の活用、ScreenUpdatingの無効化、計算モードの切り替えなど具体的な対策を提示。
⇒ 「コード実行時間を改善するには?-効率化のためのヒント」をもう一度見る
- Timer関数で測定した処理時間を基にコードを改善する方法を紹介しました。
さらに学ぶために
Timer関数は、単なる時間計測に留まらず、業務効率化やコードの最適化にも役立つVBAの基礎機能です。
今回の解説を基に、ぜひ実際のマクロ作成で活用してください。
効率的なVBAコードを作り、作業時間を短縮する第一歩を踏み出しましょう!
Timer関数を効率よく使用する方法についても別記事で解説しています。
もしよければこちらもご覧ください。



