Excelのマクロを学習する中で、他の人が作ったVBAコードを見ると、
「Wait」という単語を見かけることがあるかと思います。
- 「Wait」って何?
- 「Wait」を役割が知りたい
- 「Wait」の書き方や使い方を知っておきたい
このような考えに至ったのではないでしょうか。
この記事を読むことで、下記のことがわかります。
- 「Wait」の役割がわかる
- 「Wait」の書き方や使い方を学べる
- 「Wait」を使う際の注意点を知れる
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします
VBA(Excelマクロ)のWaitとは?役割と必要性
VBAのWaitは、処理を指定した時刻まで一時停止させるメソッドです。
メソッドとは、特定のオブジェクト(アプリやソフトなど)に対して実行できる機能で、
「オブジェクト名.メソッド名」というコードで記述します。
「Application.Wait」と記述することで、WaitメソッドをApplication(アプリ)に対して実行したということになります。
例えば、A・B・C・Dとマクロの処理が続いていくとします。

これらの処理は一瞬たりとも止まることなく続いていきます。
しかしながら、時には続けて処理することで、処理の境目がうまくつながらないことがあります。
リレーで言えば、バトンタッチがうまくいかないという感じでしょうか。
例えばBの処理が遅く、Cの処理が速いとバトンタッチが失敗しやすいです。

そこでBの処理が終わったら、10秒ほど待機する時間を作ることで、バトンタッチがうまくいく場合があります。

待機中にバトンタッチを済ませるということです。

この待機を管理するのが「Wait」の役割です。

ではそんな「Wait」の書き方・使い方を見ていきましょう。
Waitメソッドの使い方
まずは基本構文からお見せします。
基本構文
▼基本構文
Application.Wait
▼使用例1
Application.Wait TimeValue("13:00:00") ' 午後1時まで待機
▼使用例2
Application.Wait Now + TimeValue("00:00:10") ' 10秒間待機
「使用例2」のように「Application.Wait Now + TimeValue」とするのが一般的です。
()内には待機する時間を指定しましょう。
(今回は10秒を指定)
「1.5秒とか細かい時間を指定できないの?」と思った方は「Waitメソッドの注意点」をご参考ください。
「使用例1」も使わないことはないです。
朝8時になったら「スタート!」と表示させるなど、特定の処理を始めたい時に有効です。
では「Wait」メソッドを実際に使ってみましょう。
簡単な使い方
前提知識{マクロの基礎・作り方から実行まで}
前提知識{「Debug.Print」で値を表示させる方法}
前提知識{Format(時刻表示)の使い方}
まずは簡単な使い方をお見せします。
下記のVBAコードは、「現在時刻を表示」→「10秒待機」→「現在時刻を表示」と進めた例です。
Sub 簡単なウェイト()
Debug.Print Format(Now, "hh:nn:ss")
Application.Wait Now + TimeValue("00:00:10")
Debug.Print Format(Now, "hh:nn:ss")
End Sub

「Now」は「現在の時刻」を指します。
加えて「TimeValue」で10秒を指定しているため、10秒後まで待機という処理になります。
少し高度な使い方
前提知識{変数の宣言や使い方}
前提知識{ループ処理(For)}
下記のVBAコードは、For文ループにWaitを組み込んだ例です。
Sub 少し高度なウェイト()
Dim i As Integer
For i = 1 To 5
Debug.Print Format(Now, "hh:nn:ss")
Application.Wait Now + TimeValue("00:00:01")
Next i
End Sub

ループする毎に1秒ずつ待機させています。
これにより、ループ処理が安定する場合があります。
Waitメソッドの注意点
今回は注意点を3つ紹介いたします。
1秒未満は指定できない
「Wait」は簡単で便利なメソッドですが、1秒未満を指定することはできません。
(0.5秒や1.5秒は指定できない)
1秒未満の細かな指定をしたい場合は、「Sleep」を使いましょう。
しかしながら、「Sleep」はAPIを呼び出す必要があるため、少し高度です。
ある程度の妥協ができるなら「Wait」を使った方が簡単で安全です。
待機中はマクロ全体が停止
Wait中は、他の処理も含めて完全にマクロが停止します。
待機中はマクロの中断やデバッグなど、ユーザー操作が一切反応しませんのでご注意ください。
指定間違いに注意
まずは下記VBAコードを見てください。
Sub 間違ったウェイト()
Application.Wait Now + 10 ' 絶対にマネしないでください
End Sub
10秒待機を指定したつもりですが、これは間違いです。
これでは10日後までの待機を指定したことになり、待機が終わらない状態に陥ってしまいます。
中断や停止も反応しないため、強制終了するしかありません。
下記の通り、「TimeValue」で指定する癖をつけましょう。
Application.Wait Now + TimeValue("00:00:10")
最後に
VBA(Excelマクロ)のWaitについて解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!