今回のサンプルは、Excel2002/Excel2003/Excel2007で動作を確認しています。Excel2010(64bit)にはプログレスバーコントロールが実装されていません。
今月の相談
 温度環境試験装置を使って電子部品の電気的特性試験をしています。一定時間設定温度で放置した後、温度が安定したところで測定をします。今、キッチンタイマーを使って、放置時間が経過したら手動で測定プログラムを走らせていますが、ラボは機械の音がうるさいので聞き逃すことが多く、タイマーを作ることにしました。ボタンをクリックしたら、一定の時間待機して、その後測定プログラムを走らせようとしました。しかし、全く使い物になりません。どうすればいいでしょうか。

リスト1●タイマープログラム 失敗作
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

「先生、これはいったい?」
「うむ、メッセージボックスを使ったタイマーじゃな」
「それくらい見ればわかります」
「こりゃ失敬」
「このマクロのどこが駄目なんですか?」
「動かしてみればわかる」
「わかりました。ポチ・・・ありゃりゃメッセージボックスに表示される数字が変化しませんね」

図1●カウントアップする?メッセージボックス
図1●カウントアップする?メッセージボックス

「[OK]ボタンをクリックしてみたまえ」
「はい!ポチっとな」
「おぉ、数字が変わりました・・・けど、もしかして、これって?」
「うむ、ゲール君の想像した通りじゃ。放置時間が過ぎるまで、延々とメッセージボックスの[OK]ボタンをクリックしなければならない」
「ってことは?」
「自動とはほど遠い」
「ですよねぇ。これだったらピーピータイマーと睨めっこしていた方がましです」
「なんじゃ?そのピーピータイマーというのは」
「時間を設定してスタートボタンを押し、設定時間が経過したら、ピーピー鳴るタイマーですよ」
「むむぅ・・・それは、一般的にキッチンタイマーと呼ばれておるようじゃが?」

「で、先生、これってどうにかなるんですか?」
「なるとも、ありますとも。メッセージボックスではどうにもならんが、ユーザーフォームを使えばどうにかなる」
「わぉ!どうしてメッセージボックスじゃ駄目なんですか?」
「メッセージボックスを表示すると、ユーザーがメッセージボックスのどれかのボタンをクリックするまで画面は変化しない。プログラムもそこで止まったまま。つまり、刻々と減っていく残り時間、或いは増えていく経過時間を表示することはできないんじゃよ」
「なるほど」
「ユーザーフォームにはそのような制限はない。と、言うよりも、目的が違うからな。タイマーのような表示は可能じゃ。しかし、ちとテクニックっちゅうか知識が必要になるがの」
「知識?」
「そうじゃ、ユーザーフォームのラベルに残り時間を表示するとしよう」
「はい」

「ゲール君は、どうやってタイマーをスタートさせ、その残り時間をユーザーフォームのラベルに表示させるかのう?」
「ユーザーフォームにコマンドボタンを配置して、ユーザーがそのコマンドボタンをクリックしたらタイマーをスタートさせます」
「うむ、それも一つの方法じゃが、患者さんの目的とは少しずれておるのぉ」
「そうですか?」
「患者さんは、シート上のボタンをクリックするとタイマーが起動し、カウントダウンが終了したら測定のマクロを起動したいと言っておる」
「なるほど」
「従って、ユーザーフォームを使用するのであれば、シート上のボタンをクリックしたらユーザーフォームを表示すると同時にタイマーを起動しなければならない」
「そっかぁ」
「ゲール君のアイデアでは、ユーザーフォームが表示された後に、コマンドボタンをクリックしなければならないから、手間が一つ多い」
「そうですね。何か方法はあるんですか?」
「ヒントはイベントドリブンじゃ」
「イベリコ豚のステーキしか頭に浮ばない」
「わしはUserForm_Initializeイベントと、UserForm_Activateイベントを使おうと思う」

「あぁ、思い出しました。UserForm_Initializeイベントはユーザーフォームが表示される前に発生するイベントで、UserForm_Activateイベントはユーザーフォームが表示されると同時に発生するイベントですよね」
「プランができたら、実践じゃ」
「はい、マクロをお願いします」
「うむ、まずはユーザーフォームを作らねばならん」
「はい」
「ユーザーフォームを挿入したら、その上にラベルとコマンドボタンを一つずつ配置する」
「はい」

図2●タイマーに使用するユーザーフォーム
図2●タイマーに使用するユーザーフォーム
[画像のクリックで拡大表示]

「ユーザーフォームができたら、UserForm_Initializeイベントで実行するプロシジャを作る」
「お願いします」
「うむ、ちちんぷいぷいの・・・えい!」