PR

【VBA】一定間隔でプロシージャを繰り返し実行する

これで楽に!?VBA活用
記事内に広告が含まれています。

こんにちは、Ryoです。
時間指定で実行するには以前の投稿記事のようにApplicationオブジェクトのOnTimeメソッドを使用しますが、応用すると一定時間おきに処理を繰り返したいような場合でも活用することができます。今回はその内容について書いていきたいと思います。

スポンサーリンク

1.サンプル概要

「実行」ボタンはメッセージを表示する「TestSample1」プロシージャを実行しますが、実行する度に次の実行時刻を7秒後に設定しているので、一定時間おきにメッセージ表示が繰り返されます。

また、メッセージボックスを閉じるには表示されるOKボタンや右上の×を押しても良いですが、自動的に閉じるようにWindows Scripting HostのPopupメソッドを利用しています。

「中止」ボタンは繰り返し実行されている「TestSample1」プロシージャを止める為に使用しますので、クリックすることで処理を中止しメッセージボックスを表示します。

以前の記事でApplicationオブジェクトのOnTimeメソッドやWSHのPopupメソッドなども書いているのですが、今回はそれらを組み合わせて一定時間おきに処理を実行する場合のサンプルになります。

私は今までPawerPoint2010を使用していたのですが、今回新たにPowerPoint2019を購入したので、その録画機能を使用して今回のサンプル動作を記録したものが以下になります。簡単な操作で記録できてとても便利なので、今後機会があれば使っていきたいと思います。

 

2.サンプルコード

◆一定間隔で処理を実行

'複数プロシージャで使用可能とする為、日付型変数
'ResTimeをモジュールレベル変数として宣言
 Private ResTime As Date

Sub RegularInterval()

 '変数ResTimeに現在の7秒後の時刻を格納
  ResTime = Now + TimeValue("00:00:07")
 
 'ApplicationオブジェクトのOnTimeメソッドを使用
 'EarliestTime : 実行時刻(本サンプルでは現時刻から7秒後)
 'Procedure : 実行プロシージャ名でRegularIntervalを
 '        指定することで繰り返し処理とする
  Application.OnTime EarliestTime:=ResTime, _
  Procedure:="RegularInterval"
 
 '「TestSample1」プロシージャの呼び出し
  TestSample1

End Sub

このサンプルコードで行っている処理は、各プロシージャで共有する変数を宣言すること、一定時間おきに処理を繰り返すことになります。

先ず日付型変数のResTimeはモジュールレベルの変数として宣言することで、モジュール内の各プロシージャで共有することができます。その変数ResTimeに現在時刻(Now)から7秒後(+TimeValue(“00:00:07”))の時刻を格納します。

次にApplicationオブジェクトのOnTimeメソッドを使用して実行時刻(EarliestTime)に変数ResTime、実行プロシージャ名(Procedure)に現プロシージャ名「RegularInterval」を指定することで、設定した7秒を一定間隔として同プロシージャが繰り返し実行される形になります。

この記述後にメッセージ表示を行う「TestSample1」の呼び出しを行うことで、設定した一定間隔(7秒毎)にメッセージボックスが表示されるということです。

◆メッセージボックス表示/自動的に閉じる

Sub TestSample1()
'**メッセージを表示し、自動的に閉じる処理を行う**
 
  Dim ws_msg As Object
 
 'WSH(Windows Scripting Host)Shellオブジェクトを使用
  Set ws_msg = CreateObject("WScript.Shell")
 
 'WSHのPopupメソッドを利用して表示する
 '構文 : WSHobject.Popup(strText,[nSecondsToWait],[strTitle],[nType])
 '     strText : MsgBoxで表示する文字列、省略不可
 '   nSecondsToWait : MsgBoxを自動的に閉じるまでの時間、省略可
 '         strTitle : MsgBoxに表示するタイトル、省略可
 '            nType : アイコンやボタンの種類、省略可
  ws_msg.Popup "約7秒間隔でメッセージを表示しています。", 1, _
  "Info", vbInformation
  
 '注記)上記でnSecondsToWaitを 1 としていますが、実際は実行すると
 '   閉じるまでの時間にはバラツキがあり、設定値以上の秒数を
 '      要したりするので正確性には欠けるようです。
  
 'オブジェクトへの参照解除
  Set ws_msg = Nothing

End Sub

ここではメッセージボックスを表示させる処理を行っていますが、一定時間おきに繰り返し表示されるものなので、毎回OKボタンや×をクリックしてメッセージボックスを消すのも煩わしいと思いPopupメソッドを利用して自動的に閉じる形にしているものです。

自動的に閉じる必要などがなければメッセージ表示だけなので、以下でOKです。

Sub TestSample2()

 MsgBox "約7秒間隔でメッセージを表示しています。"
 
End Sub

構文などはサンプルコード内のコメントに記載した通りですが、MsgBoxを自動的に閉じるまでの時間を指定するnSecondsToWaitは設定値に対して実行時間にバラつきがあるようです。ただ使用環境によっても変わりますので、あくまで目安として設定すると良いと思います。

ここまでのサンプルで使用したApplicationオブジェクトのOnTimeメソッドやWSHのPopupメソッドについては以前に投稿した記事内で触れていますので、よろしければご参考までに。

≪OnTimeメソッドなど≫

【VBA】指定時間に処理の実行/ファイル更新日時を取得する
こんにちは、Ryoです。 VBAを使って処理したい内容によっては、一定時間経過後にコード(プロシージャ)実行させたいケースもあるかもしれませんので、現在時刻を取得してTime Value関数で経過させたい時間を加算し、時間経過後に上書き保存...

≪Popupメソッドなど≫

【VBA】処理の実行を指定した時間待機させる
こんにちは、Ryoです。 通常の処理では使用頻度が低いと思いますが、外部機器との通信制御などを行う際に送受信の間など、一時的に処理を中断(待機)させたいケースもあるかと思います。 このような場合はWaitメソッドを使って指定した時間、処理を...

◆処理の中止(停止)

Sub Cancel1()

'RegularIntervalプロシージャの実行を中断させますので、
'「Schedule」に「False」を指定します。
 Application.OnTime EarliestTime:=ResTime, _
 Procedure:="RegularInterval", Schedule:=False
 
 MsgBox "「TestSample1」の実行を中止しました。", vbInformation

End Sub

一定時間おきに処理を実行している「RegularInterval」プロシージャを停止させますので、Procedureは同様にRegularInterval、Scheduleには「False」を指定することで次の7秒後に予定されていた実行を停止させることができます。

3.まとめ

MsgBoxで表示させること自体は難しくないのですが、その表示自体に何か変化をつけたかったりした場合は今回の記事のような方法も1つの手段かと思います。



当然ながらメッセージ表示以外にも色々用途はあると思いますので、何か一定時間毎に処理を実行したいようなことがあれば検討されてみると良いと思います。

以上、一定の間隔毎にプロシージャを繰り返し実行する方法についてでした!今回の記事が何かの参考になれば幸いです。

Ryo

タイトルとURLをコピーしました