今日は、VBAで処理の実行を一時停止する方法について紹介します
VBAで処理の実行を一時停止する2つの方法
VBAで処理の実行を一時停止するには、以下2つの方法があります
- Sleep関数
- Waitメソッド
この2つの方法の主な使い分けはこのようになります
指定秒数だけ停止したい→Sleep関数
指定時刻まで停止したい→Waitメソッド
ミリ秒単位で停止したい→Sleep関数
ただし、『指定秒数だけ指定したい』と『指定時刻まで停止したい』は
それぞれ指定時刻までの残り時間を秒数に変換すれば相互に使うことが可能です
現在時刻が10:00:00で10:00:05まで5秒間停止したい場合
→方法①:Sleep関数で「5秒間」停止する
→方法②:Waitメソッドで「10:00:05」まで停止する
Waitメソッドは細かい単位での時刻指定は出来ないので
ミリ秒単位で指定したい場合はSleep関数を使う必要があります
相互に使うことは出来るけれど、Sleep関数のほうが汎用性が高いですね
Sleep関数の使い方
Sleep関数を使用するための宣言
Sleep関数はVBAの関数ではなくWindows APIと呼ばれるライブラリの関数なので
『Sleep関数を使用します』と宣言する処理が必要になりますが
64bit版と32bit版で書き方が異なります
■64bit版の場合
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
■32bit版の場合
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
※赤字にした部分に差分があるので注意しましょう
インターネット検索で『VBA Sleep関数』などと調べると
何年も前の古い情報も沢山見つかって
32bit版の情報しか書いていない場合があるので
落とし穴にはまりやすいポイントです!
64bit版を使っているのに32bit版の書き方をしてしまうと
コンパイルエラーになってしまいます
Sleep関数に限らずコンパイルエラーになってしまったときには
調べた情報が古くないか確認するようにしましょう
Sleep関数の書式
関数を呼び出す書式は64bit版、32bit版で共通です
Sleep ミリ秒
使用例:64bit版の場合
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr) Sub sample()Sleep 5000
MsgBox "5秒経過しました"
End Sub
使用例:32bit版の場合
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long) Sub sample()Sleep 5000
MsgBox "5秒経過しました"
End Sub
補足:PtrSafe属性とLongPtr型について
Twitterでご指摘をいただいたので、補足を追記させていただきます
「PtrSafe属性」および「LongPtr型」の指定は64bit版の場合必須ですが
Excel 2010以降では32bit版で指定しても問題無いようです
あいにく32bit版のExcelを保有していないので
実際に使用可能か試すことは出来ていないのですが
もし確認できた方がいらっしゃれば
コメントやTwitterで教えていただけると嬉しいです♬
参考:PtrSafe属性
Declare ステートメントが 64 ビットと互換性があることを示します。この属性は 64 ビット システムでは必須です。
参考:LongPtr型
LongPtr は、32 ビット環境では Long に変換され、64 ビット環境では LongLong に変換されるので、実際のデータ型ではありません。 LongPtr を使用すると、32 ビット環境と 64 ビット環境の両方で実行できる移植性のあるコードを作成できます。
Waitメソッドの使い方
Waitメソッドの書式
Waitメソッドの書式は以下の通りです
Application.Wait "処理を開始させる時間"
使用例:指定日時まで一時停止する場合
Sub sample()Application.Wait "10:00:00"
MsgBox "10時になりました"
End Sub
使用例:指定秒数だけ一時停止する場合
Sub sample()Application.Wait Now() + TimeValue("00:00:05")
MsgBox "5秒経過しました"
End Sub
まとめ
VBAで処理の実行を一時停止する方法について紹介しました
いかがでしたか?
Sleep関数でコンパイルエラーになる落とし穴は
わたしも以前はまってしまったので
頭の片隅で覚えておくと他でも役に立つことがあるかもしれません
読んでくださった皆さんにとって、少しでもお役に立てると嬉しいです🍎