VBA実行中にすこしだけ処理待ちしたい。
1秒待つ方法なら知ってるけどそれだと長すぎる。
複雑な処理を大量に行っていると、このような状況によく出くわすのではないでしょうか?
一般的にVBA上で指定時刻待つには
Application.Wait Now() + TimeValue(“00:00:01”)
というスキルをつかって、時刻経過を待ちます。
しかし、この手法では、1秒以下の時間を指定することができません。
というわけでこの記事では、先ほど紹介したApplication.Wait というスキルを応用することで、1秒以下の時間でも待てるようにする方法をご紹介していきます。
それでは早速やっていきましょう!
事前知識①:Application.Wait
まずはじめに今回の記事で紹介するスキル要素をご説明していきます。
まず始めはApplication.Wait についてです。
こちらはすでにご存じの方も多いと思いますが、このスキルを使うことで、指定した時間だけ経過を待つことが可能になります。
ここで注意していただきたいのは、このスキルは何秒間待て、という命令ではなく、この時刻が訪れるまで待て、という命令になっているということです。
つまり1秒待ちたいときは
Application.Wait Now() + TimeValue(“00:00:01”)
と記述して、現在時刻(Now())から1秒後(+ TimeValue(“00:00:01”))という時刻になるまで待てという命令を行う必要があります。
この先に紹介する1秒以下の時間を待つ場合でも、このApplication.Wait は活用しますのでぜひこの概念は覚えておきましょう。
事前知識②:Now()
先ほどの項目でも少し触れましたが、VBA上でNow()と実行するとその処理を実行した時刻を出力することができます。
たとえばVBA上で
MsgBox Now()
というコードを実行すると、
以下のような結果が出力されます。
この例では、このブログを書いている時刻が表示されています。
このNow()は上の画像にもあるように1秒以下の数値は出力されていません。
そのため、この記事の最重要項目である、1秒以下の時間を表現することは難しそうだということがわかります。
ではどうすればよいのか?
ここからがこの記事の本題です。
事前知識③:[Now()]
次は先ほど紹介したNow()を[]で囲ったらどうなるのかを見てみましょう。
VBA上で
MsgBox [Now() ]
を実行してみます。
すると以下のような結果が出力されました。
※このコードは2021/1/11 21:00に実行したものです。
(画像中の時刻をご確認ください。)
なにやら意味不明な数字が出力されましたね。
これは何を意味する数字なのでしょうか?
それを検証するために、実はこの記事を書く1日前のほぼ同じ時刻に、
MsgBox [Now() ]
を実行していました。
そのときの結果が以下です。
※このコードは2021/1/10 21:01に実行したものです。
(画像中の時刻をご確認ください。)
ここまでの状況を整理してみましょう。
2021/1/10 21:01にMsgBox [Now() ]を実行
⇒44206.8755967593
2021/1/11 21:00にMsgBox [Now() ]を実行
⇒44207.8753445602
小数点以下はほぼ同じ数値が出力されていますが、整数部分の数値が1だけ変わっていることがわかると思います。
もうお気づきだと思いますが、この数値はある日のある時刻を基準にして何日たったのかを計算しているものになります。
この数値は見ての通り、小数点以下10桁も表示されています。
これは何を意味しているかというとコンピュータは一日を10の10乗というとてつもなく細かい数に分割して時刻を数えることができるということです。
1日は86400秒ありますので、これを10の10乗で割ってみると・・・
8.64マイクロ秒!!
とてつもなく短い間隔で時刻を刻んでいるということですね。
この特性を使えば1秒以下の時刻でも待つことができそうですね。
1秒以下でも指定時間待つ方法
というわけでここからが本題。
◆1秒以下でも指定時間待つ方法
ここでwait_secには待ちたい秒数を指定することになります。
wait_sec=1としておけば1秒間
wait_sec=0.5としておけば0.5秒間
待つことが出来ます。
非常に説明が難解ですが、大まかにこの処理で何が行われているのかを説明すると
①[Now()]でコンピュータ独自基準の今を算出
②wait_sec / 86400でコンピュータ独自基準の待ちたい時間を算出
③これらを足すことでマクロ実行した瞬間からの待ちたい時刻を算出
④Application.Waitで③の時刻が訪れるのを待つ
という流れです。
まぁ正直、深く理解していなくても使えればOKなので、なんとなく理解していればOKです。
サンプルコードの紹介
最後に、この処理を実際に動かしてみましょう。
今回は以下のコードを準備しました。
◆処理の確認コード
Sub wait_test()
'待ち時間(秒)指定
wait_sec = 0.5
MsgBox "Start"
'待機開始
Application.Wait [Now()] + wait_sec / 86400
MsgBox "Finish"
End Sub
さっそく実行してみましょう。
実行するとまず、以下のメッセージがでます。
このOKを押すと待ち時間が始まります。
OKを押してみましょう。
測れないのでよくわかりませんが、感覚的に0.5秒後くらいに以下のメッセージが出ます。
いろいろ説明してきましたが、まぁエクセル上で厳密に0.5秒待ちたい、という状況はないでしょうから、状況に応じて適当に調整していただければよいと思います。
※上のコードのwait_secの数値を変更すればOKです。
おわりに
というわけで今回はVBA上で1秒以下の時間経過を待つ方法をご紹介しました。
必要に応じてぜひご活用ください。
このように私のブログではエクセルスキルはもちろん、様々なプログラミングスキルを紹介しています。ぜひ他の記事も見てみてください。
この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
それではまた!
コメント