時計をつくってみました。
フォーム画面に現在の日時が1秒ごとに表示され、その表示や停止をワークシート上のスイッチで操作できます。
他の仕事をさせているのに平行してこれを表示しておくと、なんとなく安心感が得られます。ただし、ここでは OnTime 割り込みを使っているので、時計が表示されている間は、1秒ごとに画面がちょっとチラつきます。
表示するユーザーフォームとして ClockForm という名前のフォームを作成しました。配置したコントロールは、ClockLabel という名前のラベルのみが必須です。ここに現在の日時が表示されます。
目立つようにちょっと大きめ(Width=430 程度)で作りましたが、用途によってはもっと小さいほうがよい場合、時刻だけ表示したい場合、さらに分ごとの表示でよい場合など、状況に応じて調整します。分ごとの表示でよい場合は、割り込みのタイミング(timeInterval)も"00:01:00"でよいので、画面のチラつきの影響はほとんどなくなります。
ただし、秒ごとであればこれで十分といえますが、たとえば分ごとの場合はこのままでは具合がよくありません。
なぜでしょう? スタート時点の時刻が仮に"10:05:30"などだったりすると、毎分30秒のところで表示が切り替わることになるからです。それで、スタートを正時(つまり、秒="00")になるまで待つ操作を、ShowClock() にいれるか、あるいは showTime() の nextTime の秒部分を 00 にする操作を加えるか、ちょっとした工夫が必要になります。
標準モジュール 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時間とか)ごとに時報音を出すとかすると、より時計らしくなります。発声するかどうかのスイッチをユーザーフォームに配置しておけばよいでしょう。実用的かどうかは別として。
また、ユーザーフォーム上でインターバル時間を入力し、タイマーとして利用することも簡単にできそうです。その際、時刻表示は、現在の時刻か経過時間かを選べるようなスイッチを追加しておくと便利です。これは、実用的かもしれません。
こんな感じでしょうか。時計/タイマーのユーザーフォームが表示されたイメージです。「時計に切替」のボタンをクリックすることでフォームが時計部分だけに縮小され、フォームのキャプションが「タイマー」から「時計」に切り替わります。