VBA(マクロ)の処理を一時停止するコード

スポンサーリンク

一時停止が必要となる場合

InternetExplorerやコマンドライン、その他のアプリケーションをVBAで操作するときには、命令を受け取ったそれぞれのアプリケーションが命令を実行するのにかかる時間の分、次の命令を受け付けられない場合があります。

本来は操作する側のアプリケーション(ExcelVBAなど)に、操作される側の状態を逐一認識させればよいのかもしれませんが、処理がものすごく複雑になるので個人で使用するVBA(マクロ)でそれを作成するのは現実的ではありません。

そんな時によく使われるのが、VBA(マクロ)の処理を一時停止するコードをアプリケーションに対する命令文の間に入れておく方法です。
VBAを使って操作したいアプリケーションが命令を実行するのにかかる時間をおおよそ予測して、それよりも長い時間VBAの処理を一時停止しておくという原始的な対応です(笑)
しかしこの原始的な対応はかなり便利で、他のアプリケーションを操作する際には必須のコードになります。

一時停止のVBAコード

VBAの処理を一時停止するコードは大きく2つあります。それぞれメリットデメリットがあります。

①Application.Waitコードを使用する(ExcelVBAのみ)

VBAに元々存在するコードなので事前に準備をする必要なく、処理を停止したいところに1行記載するだけで一時停止できるお手軽な方法です。
以下の形式でコードを記載することで一時停止を行います。下の例は1秒処理を停止してから再開するコードです。

Application.Wait Now + TimeValue(“00:00:01”)

②Sleep関数を使用する(WindowsAPI)

VBAの標準のコードではなく、WindowsAPIというWindowsに搭載されている関数をVBAで使用する方法です。細かい停止時間の調節が可能で、正確な時間一時停止しますが、事前に「Sleep関数を使用します」という意味のコードを記載しておく必要があります。
標準モジュールの宣言セクション(Subよりも上の部分)に以下のVBAコードを記載します。

Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)

※【追記】Sleep関数の宣言セクションの記載については32bit版、64bit版のどちらでもSleep関数がきちんと動作するように宣言セクションには下記のように書く方が良いようです。

#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib “kernel32” (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib “kernel32” (ByVal ms As Long)
#End If

あとは他のアプリエーションに対する2つ以上の命令と命令の間など、一時停止したいところで以下のようなコードを記載します。数字部分は停止時間を1/1000秒単位で記載します。よって1000と記載すれば1秒一時停止するということです。

Sleep 1000

全体の構成は以下のようになります。

Declare Sub Sleep Lib “kernel32” (ByVal dwMilliseconds As Long)
Sub IE操作()
命令文①
Sleep 1000
命令文②
End Sub

時間を細かく調節できるので私は基本Sleep関数を使います。1回の時間では大差がありませんが、繰り返しの処理で一時停止を500回行う場合、1秒待つのと0.5秒で済むのだと終了までに4分以上の差が出ます。

Sleepは重い処理をしたときにWindows自体に負荷がかかりにくくする場合にも使用されます。記載方法についてはまた別の機会にお伝えします。

コメント