こんにちは、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メソッドなど≫

≪Popupメソッドなど≫

◆処理の中止(停止)
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