Sub AFTER2MINUTE()
Dim T1 As Single
T1 = Timer
Do
DoEvents
MsgBox Timer - T1
If Timer - T1 > 5 Then
Exit Do
End If
Loop
Call meas
End Sub
Sub meas()
MsgBox "カウント終了"
End Sub
「先生、これはいったい?」
「うむ、メッセージボックスを使ったタイマーじゃな」
「それくらい見ればわかります」
「こりゃ失敬」
「このマクロのどこが駄目なんですか?」
「動かしてみればわかる」
「わかりました。ポチ・・・ありゃりゃメッセージボックスに表示される数字が変化しませんね」
「[OK]ボタンをクリックしてみたまえ」
「はい!ポチっとな」
「おぉ、数字が変わりました・・・けど、もしかして、これって?」
「うむ、ゲール君の想像した通りじゃ。放置時間が過ぎるまで、延々とメッセージボックスの[OK]ボタンをクリックしなければならない」
「ってことは?」
「自動とはほど遠い」
「ですよねぇ。これだったらピーピータイマーと睨めっこしていた方がましです」
「なんじゃ?そのピーピータイマーというのは」
「時間を設定してスタートボタンを押し、設定時間が経過したら、ピーピー鳴るタイマーですよ」
「むむぅ・・・それは、一般的にキッチンタイマーと呼ばれておるようじゃが?」
「で、先生、これってどうにかなるんですか?」
「なるとも、ありますとも。メッセージボックスではどうにもならんが、ユーザーフォームを使えばどうにかなる」
「わぉ!どうしてメッセージボックスじゃ駄目なんですか?」
「メッセージボックスを表示すると、ユーザーがメッセージボックスのどれかのボタンをクリックするまで画面は変化しない。プログラムもそこで止まったまま。つまり、刻々と減っていく残り時間、或いは増えていく経過時間を表示することはできないんじゃよ」
「なるほど」
「ユーザーフォームにはそのような制限はない。と、言うよりも、目的が違うからな。タイマーのような表示は可能じゃ。しかし、ちとテクニックっちゅうか知識が必要になるがの」
「知識?」
「そうじゃ、ユーザーフォームのラベルに残り時間を表示するとしよう」
「はい」
「ゲール君は、どうやってタイマーをスタートさせ、その残り時間をユーザーフォームのラベルに表示させるかのう?」
「ユーザーフォームにコマンドボタンを配置して、ユーザーがそのコマンドボタンをクリックしたらタイマーをスタートさせます」
「うむ、それも一つの方法じゃが、患者さんの目的とは少しずれておるのぉ」
「そうですか?」
「患者さんは、シート上のボタンをクリックするとタイマーが起動し、カウントダウンが終了したら測定のマクロを起動したいと言っておる」
「なるほど」
「従って、ユーザーフォームを使用するのであれば、シート上のボタンをクリックしたらユーザーフォームを表示すると同時にタイマーを起動しなければならない」
「そっかぁ」
「ゲール君のアイデアでは、ユーザーフォームが表示された後に、コマンドボタンをクリックしなければならないから、手間が一つ多い」
「そうですね。何か方法はあるんですか?」
「ヒントはイベントドリブンじゃ」
「イベリコ豚のステーキしか頭に浮ばない」
「わしはUserForm_Initializeイベントと、UserForm_Activateイベントを使おうと思う」
「あぁ、思い出しました。UserForm_Initializeイベントはユーザーフォームが表示される前に発生するイベントで、UserForm_Activateイベントはユーザーフォームが表示されると同時に発生するイベントですよね」
「プランができたら、実践じゃ」
「はい、マクロをお願いします」
「うむ、まずはユーザーフォームを作らねばならん」
「はい」
「ユーザーフォームを挿入したら、その上にラベルとコマンドボタンを一つずつ配置する」
「はい」
「ユーザーフォームができたら、UserForm_Initializeイベントで実行するプロシジャを作る」
「お願いします」
「うむ、ちちんぷいぷいの・・・えい!」