プログラミング

【VBA】Sleep関数/Waitメソッドとコンパイルエラー

今日は、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関数でコンパイルエラーになる落とし穴は
わたしも以前はまってしまったので
頭の片隅で覚えておくと他でも役に立つことがあるかもしれません

読んでくださった皆さんにとって、少しでもお役に立てると嬉しいです🍎

ABOUT ME
姫りんご
お金と簿記の教育で、日本の社会を1ミリでも前へ進めたい🍀お金の教育を考えるコミュニティ【#マネリテDAO】&【#大河内薫マネリテ戦略室】運営スタッフ⭐挫折しない簿記学習アプリ【#Funda簿記】メンター🧸💎日商簿記2級|2級FP技能士|不動産投資家|#FUJIFILMに恋してる|himeringo902.eth