Excel VBAで1秒待つ方法をお探しですね。
広告
Excel VBAで1秒待機する方法 – Application.WaitとSleep関数の使い方と使い分け
Excel VBAでマクロを作っていると、「画面が切り替わるまでちょっと待ちたい」「外部ファイルを開いた直後に操作したい」「メッセージを出す前に1秒だけ間を空けたい」といった場面に出くわすことがあります。
こんなときに使うのが、処理を一時停止する「待機処理」です。
よく使われるのは、Excelに最初から用意されている`Application.Wait`と、Windowsの機能を借りる`Sleep`関数の2つ。
どちらも処理を止められますが、指定できる時間の単位や使うための準備、待っている間の動きに違いがあります。
この記事では、Excel VBAで1秒待つ基本的なコードから、それぞれの使い分け、実際に使うときに気をつけたいポイントまで、わかりやすく解説していきます。
Excel VBAで処理を止めたい場面って?
Excel VBAで「1秒待つ」処理が必要になるのは、見た目をかっこよくしたいときだけじゃありません。
実は実務でも結構使う場面があります。
たとえば、
– 別のExcelファイルを開いた直後にシートを操作したい
– 外部のアプリを起動してから、そのアプリが出力したファイルを読み込みたい
– Webページやシステムから出力されるファイルができるまで待ちたい
といったケースです。
VBAは基本的に、コードを上から順番に実行していきます。
だから、相手側の処理が終わる前に次の行に進んでしまうと、「ファイルが見つかりません」とか「画面がまだ更新されてない」といったエラーが起きることがあるんです。
待機処理を使うときの注意点
ただし、「とりあえず長めに止めておけば安全でしょ」という使い方はおすすめしません。
マクロ全体の実行時間がムダに長くなってしまうからです。
特に、毎回10秒とか30秒とか固定で待たせる処理をループの中に入れると、データが少ないうちは問題なくても、件数が増えたときに「待ち時間だけで何分もかかる」なんてことになりかねません。
1秒待機のような短い停止は便利ですが、本当は「何を待っているのか」を意識して使うことが大事です。
単純に一定時間だけ止めればいい場面では`Application.Wait`や`Sleep`が向いていますが、ファイルの存在確認とか処理完了の判定ができる場面では、条件を確認しながら待つ設計も検討すると、より安定したマクロになります。
VBAで使える待機方法
Excel VBAで代表的な待機方法には、次の3つがあります。
1. **Application.Wait** – Excel標準の待機メソッド
2. **Sleep関数** – Windows APIを使った待機
3. **DoEvents** – イベント処理を明け渡す(厳密には待機専用ではない)
このうち、1秒待機を簡単に書きたいなら`Application.Wait`、ミリ秒単位で細かく指定したいなら`Sleep`がよく使われます。
`DoEvents`は待機専用の命令ではなく、処理中にExcelやWindowsに制御を戻して、画面更新やユーザー操作を処理させるためのものです。
この記事では、まず基本となる`Application.Wait`と`Sleep`に絞って、1秒待機の実装方法を見ていきましょう。
Application.Waitで1秒待機する方法
`Application.Wait`は、Excel VBAに最初から用意されている待機用のメソッドです。
追加の設定や宣言をしなくても使えるので、初心者が最初に覚える待機処理としてピッタリです。
基本的な考え方
`Application.Wait`の考え方は、「指定した時刻になるまでマクロの実行を止める」というものです。
1秒待機したい場合は、現在時刻を表す`Now`に、1秒分の時間を足した時刻を指定します。
一番よく使われる書き方はこちらです。
“`vba
Sub WaitOneSecond()
MsgBox “待機を開始します”
Application.Wait Now + TimeValue(“00:00:01”)
MsgBox “1秒経過しました”
End Sub
“`
このコードでは、`Now`で現在の日時を取得して、`TimeValue(“00:00:01”)`で1秒分の時刻を足しています。
つまり、「今から1秒後まで待つ」という意味です。
ポイント:「何秒待つ」じゃなくて「いつまで待つ」
`Application.Wait`は、「何秒待つ」という指定ではなく、「いつまで待つ」という指定である点がポイントです。
「午後7時まで待つ」みたいな指定もできますが、1秒待機の用途では、時刻を直接書くよりも`Now`に待機時間を加える書き方のほうが安全です。
時刻だけを指定すると、現在時刻との関係で意図しない長時間待機になる可能性があるからです。
Application.Waitのメリット
`Application.Wait`のメリットは、Excel標準機能だけで完結することです。
社内の共有マクロや、VBAに慣れていない人が保守するコードでは、外部APIの宣言が不要なぶん読みやすくなります。
一方で、基本的には秒単位の待機に向いていて、「0.1秒だけ待つ」「500ミリ秒待つ」といった細かい制御にはちょっと不向きです。
また、待機中は実行中のマクロが止まるので、その間に次のVBA処理は進みません。
Excel自体の応答や中断の挙動は環境によって見え方が変わることがありますが、少なくとも「マクロ処理を止める命令」であることは覚えておきましょう。
戻り値を使った書き方
`Application.Wait`は、成功時に`True`を返します。
普通の1秒待機では戻り値を気にしなくても問題ありませんが、ユーザー操作で中断される可能性を考慮したい場合は、結果を変数で受け取る書き方もできます。
“`vba
Sub WaitResultSample()
Dim result As Boolean
result = Application.Wait(Now + TimeValue(“00:00:01”))
If result Then
MsgBox “待機が完了しました”
Else
MsgBox “待機が中断されました”
End If
End Sub
“`
実務では、1秒程度の短い待機ならシンプルに書くことが多いですが、長い待機を入れる場合は「途中で止められるか」「止まった場合に後続処理をどうするか」まで考えておくと、トラブルを減らせます。
Sleep関数で1秒待機する方法
`Sleep`関数は、VBA標準の関数ではなく、Windows APIとして提供されている機能です。
APIというのは、OSや外部プログラムが持っている機能を別のプログラムから呼び出すための仕組みのことです。
Sleep関数を使うための準備
Excel VBAから`Sleep`を使う場合は、標準モジュールの先頭に宣言文を書く必要があります。
`Sleep`はミリ秒単位で待機時間を指定できるので、1秒待機する場合は`1000`を指定します。
1秒は1000ミリ秒なので、`Sleep 1000`という書き方になります。
“`vba
Option Explicit
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
#Else
Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
#End If
Sub SleepOneSecond()
MsgBox “待機を開始します”
Sleep 1000
MsgBox “1秒経過しました”
End Sub
“`
宣言文のポイント
このコードで重要なのは、`Declare`文をプロシージャの中ではなく、標準モジュールの先頭などモジュールレベルに書くことです。
`#If VBA7 Then`は、Office 2010以降などVBA7環境に対応するための条件付きコンパイルです。
64bit版Officeでは、API宣言に`PtrSafe`が必要になるので、古い書き方のままだとコンパイルエラーになることがあります。
上記のように書いておけば、VBA7環境とそれ以前の環境をある程度分けて扱えます。
Sleepの特徴:ミリ秒単位で指定できる
`Sleep`の大きな特徴は、待機時間をミリ秒単位で指定できることです。
– 1秒なら`Sleep 1000`
– 0.5秒なら`Sleep 500`
– 0.1秒なら`Sleep 100`
のように、直感的に書けます。
処理間隔を細かく調整したい場合や、短時間のリトライ処理を作りたい場合には便利です。
Sleepの注意点
ただし、`Sleep`はWindowsの`kernel32`を呼び出すので、基本的にWindows環境向けの方法です。
Mac版Excelで同じコードをそのまま使うことはできないので、複数環境で使うマクロでは注意が必要です。
また、`Sleep`中はVBAの実行スレッドが停止するため、Excelが固まったように見えることがあります。
特に長い時間を指定すると、ユーザーから見ると「マクロが止まった」「Excelが応答していない」と感じやすくなります。
1秒程度なら大きな問題になりにくいですが、数十秒以上の待機を`Sleep`だけで書くのは避けたほうが無難です。
長く待つ必要がある場合は、短い`Sleep`を繰り返しながら条件を確認する、必要に応じて`DoEvents`を組み合わせる、といった設計にすると操作性を保ちやすくなります。
Application.WaitとSleep関数、どう使い分ける?
`Application.Wait`と`Sleep`は、どちらも「処理を一時停止する」という目的では同じように見えます。
でも実際には、使いやすさ、精度、対応環境、待機中の動きが違います。
結論:どっちを使えばいい?
初心者向けに結論を先に言うと、
– **Excel VBAだけで簡単に1秒待機したい** → `Application.Wait`
– **ミリ秒単位で細かく止めたい** → `Sleep`
が候補になります。
どちらが常に優れているというより、マクロの配布先や保守性、必要な待機精度に合わせて選ぶことが大切です。
それぞれの強みと弱み
比較すると、`Application.Wait`は宣言不要で書けるので、コードを見た人が理解しやすいのが強みです。
1秒、3秒、10秒のような秒単位の待機で十分な処理なら、まずはこちらを使うとよいでしょう。
一方、`Sleep`はAPI宣言が必要ですが、`Sleep 1000`のように待機時間を数値で指定でき、0.1秒や0.5秒といった細かい待機にも向いています。
ただし、Windows APIに依存するため、Mac環境やセキュリティポリシーが厳しい環境では使いにくい場合があります。
実務での使い分け表
実務での使い分けは、次のように考えると判断しやすくなります。
| 目的 | 向いている方法 | 理由 |
|—|—|—|
| 1秒だけ待ってから次の処理をしたい | Application.Wait | 宣言不要でわかりやすい |
| 0.1秒、0.5秒など細かく待ちたい | Sleep | ミリ秒単位で指定できる |
| Windows専用の社内マクロで短い待機を入れたい | Sleep | 短く直感的に書ける |
| Macでも使う可能性がある | Application.Wait | Windows APIに依存しない |
| 長時間待機しつつ操作性も考慮したい | 条件判定やDoEventsも検討 | 固定待機だけでは非効率になりやすい |
待機処理を万能策にしないこと
注意したいのは、待機処理を「エラー回避の万能策」として使わないことです。
たとえば、ファイルが作成されるまで待つ処理で毎回1秒待つだけでは、環境によってはまだファイルができていない可能性があります。
反対に、すでにファイルができているのに毎回1秒待つのはムダです。
こんなときは、1秒待機を入れるだけでなく、
– ファイルが存在するかを確認する
– 指定回数までリトライする
– 一定時間を超えたらエラーとして終了する
といった条件付きの待機処理にすると、より実務向きになります。
Application.Waitで時刻を直接指定する書き方は避けよう
`Application.Wait “19:00:00″`のように時刻を直接指定する書き方は、決まった時刻まで止めたい場合には使えますが、1秒待機の用途ではおすすめしません。
現在時刻より過去の時刻を指定した場合、意図しない待機になる可能性があるからです。
1秒待機なら、`Now + TimeValue(“00:00:01”)`のように「今から1秒後」を指定する書き方に統一すると、コードの意味が明確になります。
まとめ:1秒待機の基本形
最後に、1秒待機の基本形を整理しておきましょう。
Excel標準で簡単に書くなら
“`vba
Application.Wait Now + TimeValue(“00:00:01”)
“`
Windows環境でミリ秒単位の指定をしたいなら
宣言をしたうえで、
“`vba
Sleep 1000
“`
まとめ
Excel VBAで処理を一時停止する方法は、短いコードで実現できます。
でも、待機中はマクロが進まないので、入れすぎると処理速度や操作性に影響します。
1秒待機を使うときは、
– **なぜ待つのか**
– **1秒で十分なのか**
– **条件で判定できないか**
をあわせて考えることが、安定したVBAマクロを作るためのポイントです。
`Application.Wait`と`Sleep`関数の違いを理解しておけば、単なる時間調整だけでなく、外部処理との連携や画面更新待ちなどにも落ち着いて対応できるようになりますよ。
広告
