VBAで指定した秒数だけ処理を止める方法【Sleep関数(API)】
マクロを作成していると「ここで処理を○○秒止めたいな」という場面に出くわすことがあります。
Excelマクロの場合は「Application.Wait メソッド」を使うことで指定した時間処理を止めることができます。(リンクをクリックするとMicrosoftのページに飛びます)
しかしExcel以外のマクロの場合、このメソッドは用意されていないため利用することができません。
という訳で今回はWindows APIの「Sleep関数」というのを利用してマクロの処理を止める方法を解説していきます。今回学ぶことのできる内容は以下のとおりです。
Sleep関数を使ってマクロの処理を止める方法
Sleep関数とは
Sleep関数とは指定したミリ秒だけ処理を止めることのできる関数です。(※1000ミリ秒=1秒)
Sleep関数はVBAで用意されているものではなくWindows API(Application Programming Interface)の中にある関数です。Windows APIとは簡単にいえばWindowsに用意されている機能がまとまっているセットのようなものです。
VBAを使ってこのWindows APIを呼び出すことで、Windowsに用意されている様々な機能を使用することができます。(たとえばWindowsのシステム効果音を鳴らしたり、キーボードの入力を取得したりすることができます)
Windows APIをよく知らない方は「なんか難しそう」と感じると思いますがコードの内容はあまり難しいものではないので、VBAがある程度理解できている方であればすぐに理解することができます。
ちなみに名前からわかると思いますが、Windows APIではWindowsの機能を呼び出しているだけので基本的にはWindows以外のOSでは使用することはできません。
Sleep関数の使い方
Sleep関数を使うにははじめに「Windous APIのSleep関数を使うよ」と宣言する必要があります。
※宣言をしないとSleep関数は使えずエラーになるので書き忘れに注意しましょう。
使用しているWindowsが32bitか64bitかによって宣言時に書く内容が変わってきます。
以下のどちらかをコードの一番初め(Option Explicitの次の行あたり)に書いておくことで、そのモジュール内でSleep関数を使うことができるようになります。
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As LongPtr)
Private Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
※操作環境のbitと構文があっていないとエラーになるので注意しましょう。
上記のどちらを書けばいいかわからない場合は以下のコードをコピペして、モジュールの最上部に書いておきましょう。
1 2 3 4 5 |
#If Win64 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) #Else Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) #End If |
この構文を書いておくことで自動的に使うことのできる方の構文が使用されます。
VBE上では以下のように使えない方の構文が赤色で表示されますが、実行に影響はありません。
Sleep関数の構文
Sleep関数の構文は非常にシンプルで以下のように書きます。
Sleep 指定のミリ秒数
Sleep関数で扱う時間の単位は1秒の1/1000である「ミリ秒」です。
そのため構文で指定する時間もミリ秒単位で指定します。
たとえば3秒だけ処理を止めたければ「Sleep 3000」、10秒だけ処理を止めたければ「Sleep 10000」というように入力します。もちろん秒だけでなく「Sleep 500」と書いて500ミリ秒(1秒の半分)だけ処理を止めることもできます。
Sleep関数サンプルコード
実際にVBAマクロとして使用する場合は以下のように書きます。
以下のコードでは初めにメッセ―ジボックスが立ち上がり、「OK」ボタンをおすと3秒間だけ処理が止まります。そして3秒後に再び処理が再開しメッセージが表示されるというマクロになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Option Explicit #If Win64 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongPtr) #Else Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) #End If '-------------------------------------------------------------------------------------' Sub CATMain() MsgBox "「ザ・ワールド」ッ! 時よ止まれ!" Sleep 3000 'OKを押してから3秒間処理が止まる MsgBox "そして時は動き出す" End Sub |
※実行するのは「Sub CATMain()」です。つまりはVBEから実行する場合は「Sub CATMain()~End Sub」の間のどこかにカーソルをフォーカスしてから実行しましょう。
そこにシビれる!あこがれるゥ!
まとめ
今回はWindows APIの「Sleep関数」を使った処理を止める方法についてでした。
Sleep関数自体あまり使用する機会が多いものではないかもしれませんが、こういった操作も行うことができるという具体例の1つとして頭に入れておくといつか役に立つと思います。
今回やったようにWindows APIを呼び出すことで、処理を止めるだけでなく本来VBAだけではできなかった様々な操作を行うことができるようになります。
特にCATIAマクロはExcelマクロと比べ使える機能が少ない(気がする)ので、Windows APIの知識もインプットしておくとより幅広い範囲のマクロを作成することができます。
Windows APIでできる他の操作は「VBA API」で調べれば様々なサイトで解説しているのでそれらも参考にしてみるといいと思います。(ほとんどの場合Excel向けに解説していますが、APIの使い方はどれも共通なのでCATIAでも使えるはずです)
CATIAマクロを本気で勉強するなら