2022年6月 プログラムの話 その1 | 初めての犬飼い日記

初めての犬飼い日記

シゲという名前の保護犬を飼うことになったアラフォーオッサンの記録です

 
久しぶりに EXCEL VBA のお話です。
EXCEL を使っていて…
 
定期的に自動で処理を繰り返してくれたらいいのになぁ…真顔
 
なんてことを思ったことはないでしょうか?
 
まぁ、普通に EXCEL を使っている分には必要のない機能ですし、考えた事もないという人の方が多いかとは思います。
 
今回、お客さんから「他のシステムで集計したデータを定期的に読み込んで、EXCEL のシートに表示してほしい」という依頼がありまして、「そんなことできたかなぁ…?」と思いながら調べてみると、それっぽい方法を見つけたんですよ。
 

 

はい、というわけで作ってみました。

A1のセルに表示されている時刻が勝手に進んでいるのが見えるかと思います。

表示されている数式を見ていただくと分かるかと思いますが、現時刻を表示しているだけです。

通常は再計算をしない限り、時刻表示が更新されることはありません。

 

逆に考えれば、定期的に再計算を実行して表示内容を更新してやれば、あたかも時計のように時刻を表示することができるということになります。

 

今回、追加したモジュールに下記のソースコードを記述してあります。

 
1秒ごとに処理を繰り返す
' 次の呼び出しタイミングを保持する為のグローバル変数
Private NextTime As Date

' 定期的に呼び出される関数
Public Sub TimerEvent()

    ' 次回イベント発生の時間として、現時刻から1秒後の時刻を作成する
    NextTime = Now + TimeValue("00:00:01")
    
    ' 呼び出し時刻と、呼び出す関数(今回は自身)を設定する
    Application.OnTime EarliestTime:=NextTime, Procedure:="TimerEvent"

    ' Sheet1を再計算して時刻を更新する
    Sheet1.Calculate

End Sub
 
詳しくはソースコード内にコメントしてありますが、Application.OnTime というのを利用しています。ザックリと説明すると、処理を実行する時刻を予約する関数…だと思ってもらえればいいです。
 
このソースコードの意味は…
 
①:今から1秒先の時刻を計算する
 
②:1秒後に TimerEvent 関数を呼び出す予約をする
 
③:Sheet1を再計算して時刻表示を更新する
 
こういう感じです。
①~③までの処理が終了したあとに、予約した時間に再び①から順次処理がおこなわれるというわけです。
 
これを応用すれば、1時間ごとに処理したい…ということも実現可能となります。