【VBA】指定時間だけ待つ方法!1秒以下(ミリ秒)でも指定可能!

f:id:yshgs_elec:20210111222054j:plain

 

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()

というコードを実行すると、

以下のような結果が出力されます。

VBA上でNow()を表示した結果

この例では、このブログを書いている時刻が表示されています。

 

このNow()は上の画像にもあるように1秒以下の数値は出力されていません。

そのため、この記事の最重要項目である、1秒以下の時間を表現することは難しそうだということがわかります。

 

ではどうすればよいのか?

ここからがこの記事の本題です。

 

スポンサーリンク

事前知識③:[Now()]

次は先ほど紹介したNow()を[]で囲ったらどうなるのかを見てみましょう。

VBA上で

MsgBox [Now() ]

を実行してみます。

 

すると以下のような結果が出力されました。

VBA上で[Now()]を表示した結果

※このコードは2021/1/11 21:00に実行したものです。

(画像中の時刻をご確認ください。)

なにやら意味不明な数字が出力されましたね。

 

これは何を意味する数字なのでしょうか?

 

それを検証するために、実はこの記事を書く1日前のほぼ同じ時刻に、

MsgBox [Now() ]

を実行していました。

 

そのときの結果が以下です。

VBA上で[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秒以下でも指定時間待つ方法

Application.Wait [Now()] + wait_sec / 86400

ここで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秒まったあとの出力結果

いろいろ説明してきましたが、まぁエクセル上で厳密に0.5秒待ちたい、という状況はないでしょうから、状況に応じて適当に調整していただければよいと思います。

※上のコードのwait_secの数値を変更すればOKです。

スポンサーリンク

おわりに

というわけで今回はVBA上で1秒以下の時間経過を待つ方法をご紹介しました。

必要に応じてぜひご活用ください。

 

このように私のブログではエクセルスキルはもちろん、様々なプログラミングスキルを紹介しています。ぜひ他の記事も見てみてください。

 

この記事が役に立ったという方は、ぜひ応援よろしくお願いします。

↓ 応援ボタン

にほんブログ村 IT技術ブログ VBAへ
にほんブログ村

それではまた!

コメント

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