category name  »  page title date

時計の表示

時計をつくってみました。
フォーム画面に現在の日時が1秒ごとに表示され、その表示や停止をワークシート上のスイッチで操作できます。
他の仕事をさせているのに平行してこれを表示しておくと、なんとなく安心感が得られます。ただし、ここでは OnTime 割り込みを使っているので、時計が表示されている間は、1秒ごとに画面がちょっとチラつきます。

表示するユーザーフォームとして ClockForm という名前のフォームを作成しました。配置したコントロールは、ClockLabel という名前のラベルのみが必須です。ここに現在の日時が表示されます。
目立つようにちょっと大きめ(Width=430 程度)で作りましたが、用途によってはもっと小さいほうがよい場合、時刻だけ表示したい場合、さらに分ごとの表示でよい場合など、状況に応じて調整します。分ごとの表示でよい場合は、割り込みのタイミング(timeInterval)も"00:01:00"でよいので、画面のチラつきの影響はほとんどなくなります。

ただし、秒ごとであればこれで十分といえますが、たとえば分ごとの場合はこのままでは具合がよくありません。
なぜでしょう? スタート時点の時刻が仮に"10:05:30"などだったりすると、毎分30秒のところで表示が切り替わることになるからです。それで、スタートを正時(つまり、秒="00")になるまで待つ操作を、ShowClock() にいれるか、あるいは showTime() の nextTime の秒部分を 00 にする操作を加えるか、ちょっとした工夫が必要になります。

この時計を、必要に応じて表示したり隠したりするためのスイッチを、ワークシート上に配置しました。スイッチの Shape には適当な名前をつけて、マクロとして ShowClock() を登録しておきます。隣に、スイッチの現在の機能を示すためのテキストボックスを配置して、その名前を SwitchCaption としておきます。
以下、このスイッチをクリックするたびに、時計が表示されたり、隠されたりします。

標準モジュール         ShowClock()

Public ShowClockFlag As Boolean
Private Const showTimeProc = "showTime"
Private Const timeInterval = "00:00:01"
Private nextTime As Date
Private Const switchCaption = "SwitchCaption"

'--- 時計の表示
Public Sub ShowClock()
    ShowClockFlag = Not ShowClockFlag
    toggleCaption
    If Not ShowClockFlag Then
        On Error Resume Next
        Application.OnTime nextTime, showTimeProc, , False
        Unload ClockForm
        Exit Sub
    End If
    ClockForm.Show vbModeless
    showTime
End Sub
'--- 1秒ごとの割り込み
Private Sub showTime()
    ClockForm.ClockLabel.Caption = Now
    nextTime = Now + timeValue(timeInterval)
    Application.OnTime nextTime, showTimeProc
End Sub
'--- スイッチ表示の切り替え
Private Sub toggleCaption()
Dim txt
    txt = "表示": If ShowClockFlag Then txt = "隠す"
    ActiveSheet.Shapes(switchCaption).TextFrame.Characters.text = txt
End Sub

toggleCaption() は、スイッチをクリックするごとに表示を切り替えますが、ユーザーフォームを X で閉じた場合にはそのことを知らないので、「隠す」のままになってしまいます。それでは面白くないので、ユーザーフォーム ClockForm に次の終了前イベント処理を追加しました。

ユーザーフォーム ClockForm

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    ShowClockFlag = True
    ShowClock
End Sub

拡張の楽しみ

1秒ごとにチクタク音を出すとか、一定時間(1分とか1時間とか)ごとに時報音を出すとかすると、より時計らしくなります。発声するかどうかのスイッチをユーザーフォームに配置しておけばよいでしょう。実用的かどうかは別として。

また、ユーザーフォーム上でインターバル時間を入力し、タイマーとして利用することも簡単にできそうです。その際、時刻表示は、現在の時刻か経過時間かを選べるようなスイッチを追加しておくと便利です。これは、実用的かもしれません。
こんな感じでしょうか。時計/タイマーのユーザーフォームが表示されたイメージです。「時計に切替」のボタンをクリックすることでフォームが時計部分だけに縮小され、フォームのキャプションが「タイマー」から「時計」に切り替わります。