\Excelショートカット集もらえる/
【VBA】Sleep関数・Waitメソッドの使い方 |VBAで処理を一時停止する方法を解説します
今回はWaitメソッドおよびSleep関数をご紹介します。これらの関数はプログラムの実行を指定された時間だけ一時停止するために使用されます。
コピペで使用できるサンプルコードを紹介するとともに、Sleep/Waitの違いは何か、も解説していきます。
- VBA初学者
- VBAでプログラムを一時停止させるやり方を知りたい
- VBAのSleep関数、Waitメソッドの使い方を知りたい
本記事で使用するサンプルファイルはこちらからダウンロードできます。
Sleep関数とWaitメソッドの用途
WaitメソッドおよびSleep関数は、他のタスクを待つためにプログラムを一時停止する必要がある場合に使用されます。
他のタスクの完了に必要な最大時間を調べ、コード内でその時間だけ実行を停止することができます。
例えば、他の実行ファイルを実行するVBAコードがあり、その実行ファイルを実行した後、その実行ファイルが完了するのを待ってコードを続行する必要があるとします。
そこで、まずその実行ファイルを起動し、例えば10秒(この実行ファイルの実行に必要な最大時間)待たせた後、再び実行を継続するようなコードを書くことができます。
Sleep関数
Sleep関数は実は、WindowsのDLLファイル(*1)の中に存在する機能で、VBAの関数ではありませんが、WindowsのSleep APIを呼び出すことで、VBAのコードでこの関数を使用することができます。
*1:Windowsのプログラムファイルの種類の一つで、様々なアプリケーションプログラムで使用される汎用的な機能を収録したプログラムのこと。
Sleep 停止時間
ここで、「停止時間」は実行を一時停止する時間をミリ秒単位で指定します。
それでは、VBAのSleep関数の例を見てみましょう。
Sleep関数のサンプルプログラム
例 1: プログラムの実行を 30 秒間停止する
Option Explicit
#If VBA7 Then
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) 'For 64 Bit Systems
#Else
Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds as Long) 'For 32 Bit Systems
#End If
Sub SleepTest1()
MsgBox "実行開始"
Sleep 30000 '停止させる秒数(ミリ秒)
MsgBox "実行再開"
End Sub
Sleep関数はWindowsの関数なので、使用する前にモジュール内のコードの上にAPIの名前を宣言する必要があります。操作環境が64ビットなのか32ビットなのかで関数の宣言の仕方が変わります。IF文によって操作環境が64ビット・32ビットのどちらでもSleep関数が使えるようにしています。
例 2: InputBoxを使用して、ユーザー定義の時間だけコードを遅延させる
ユーザーがメッセージボックス内で入力した秒数だけ、コードの実行を遅延させることができます。
Sub SleepTest2()
On Error GoTo InvalidRes
Dim i As Integer
i = InputBox("コードを一時停止する秒数を入力してください。") 'InputBoxで停止したい秒数を入力
Sleep i * 1000 '秒をミリ秒に
MsgBox (i & " 秒停止")
Exit Sub
InvalidRes: 'エラー発生時はメッセージボックスでInvalid valueと表示
MsgBox "Invalid value"
End Sub
実行すると・・・
画像のようなメッセージボックスが表示され、停止させたい秒数を入力するとその秒数だけコードは停止します。停止後次のようなメッセージが表示されます。
※画像は停止秒数を5秒に設定したとき
Waitメソッド
Waitメソッドは、指定の時刻までマクロを停止させるApplicationオブジェクト(*2)のメソッドです。
*2:アプリケーション(Excel)全体の処理・設定を操作するためのオブジェクト。
Application.Wait “再開時刻”
ここで、「再開時刻」はマクロを再開させる時間を指定します。「再開時刻」 は常にMicrosoft Excelの時間形式である必要があります。(例:午後3時30分の場合は15:30:00)
Waitメソッドのサンプルプログラム
Waitメソッドのサンプルプログラムを見ていきましょう。
例 1: 午後 7 時までプログラムを一時停止する
Sub WaitTest1()
Application.Wait "19:00:00"
MsgBox ("7PMに再開")
End Sub
例 2: プログラムの実行を 30 秒間停止する
Sub WaitTest2()
Application.Wait (Now + TimeValue("0:00:30"))
MsgBox ("30秒後に再開")
End Sub
例 3: プログラムの実行をミリ秒単位で停止する
Waitメソッドで停止時間をミリ秒単位で停止するには以下のように書きます。
Application.Wait [Now()] + Time/ 86400000
Now関数を[ ]で囲むことで現在の時刻からミリ秒単位で停止させることができます。「Time」に停止させたい秒数(ミリ秒)を指定します。86400000は1日をミリ秒に直した値です。
以下はプログラムの実行をミリ秒単位で停止するサンプルコードです。実行すると、「Start」と表示されてから100ミリ秒後に「Finish」というメッセージが表示されます。
Sub WaitTest3()
Dim i As Long
i = 100 '停止させたい時間(ミリ秒)
MsgBox "Start"
Application.Wait [Now()] + i / 86400000
MsgBox "Finish"
End Sub
Sleep関数とWaitメソッドの違い
この2つの関数のコードの実行を停止させるという機能は同じですが、Sleep関数はExcel全体をフリーズさせます。つまりSleepは、一時停止中はExcel が応答せず、またスリープ機能を停止する方法もありません。Waitメソッドは一時停止中に Excel をフリーズさせません。つまり遅延の間、Excel ワークブックで作業を続けることができます。またWaitメソッドはいつでも中断できます。
まとめ
今回はSleep関数とWaitメソッドの使い方を解説しました。
どちらもプログラムを一時停止するときに使用しますが、違いとしては、WaitメソッドはExcelをフリーズさせないが、Sleep関数では一時停止中にExcelは応答しないことが挙げられます。ただしSleep関数の方がよりシンプルなコードでミリ秒単位で停止時間を指定できます。用途によって使い分けしましょう。
「今回学んだような業務効率化を極めたい」
「もっとVBAを勉強したい」
「VBAを効率的に学ぶにはどの講座が良いのだろう・・・」
そんな方にはユースフルの公式LINEがオススメです!元伊藤忠商事経理でExcel実務のプロ、長内孝平(おさ)が運営しており
- VBAを含むExcel無料講義動画480分
- ExcelPro講座VBAコースにも使える!講座割引クーポン
などLINE会員限定の豪華4大特典を無料でプレゼント中です!ぜひコチラ↓の画像をタップして受け取ってくださいね!