|
▼作りたい初心者 さん:
>で、現時点ではリアルタイムな時刻表示をするにはどうしたらいいのか迷っています。
VBAの関数 Now関数または、ワークシート関数のNow()関数(VBA内では、[Now()]と記述)
この二つぐらいの投稿で十分だと思いますが、ちょっと私的新発見があったので
投稿します。
新規ブックにて
ユーザーフォームを作成してください(UserForm1)。
このUserForm1には、 ラベル(Label1)とコマンドボタン(CommandButton1)を
一つずつ配置してください。
UserForm1のモジュール
Option Explicit
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private 表示 As Boolean
'==============================================================
Private Sub CommandButton1_Click()
表示 = Not 表示
If 表示 Then
CommandButton1.Caption = "時刻表示中止"
dspclock
Else
CommandButton1.Caption = "時刻表示再開"
End If
End Sub
'================================================================
Sub dspclock()
Do While 表示
Label1.Caption = Now()
DoEvents
Loop
End Sub
'===============================================================
Private Sub UserForm_Activate()
CommandButton1 = True
End Sub
'=================================================================
Private Sub UserForm_Terminate()
表示 = False
End Sub
標準モジュールに
Sub test()
UserForm1.Show
End Sub
これでtestを実行して試してみてください
時計表示がされると思います。
このプロフラムに近い物を理由は不明ですが、10年以上前に作った覚えがあります。
Win2000+Excel2000か2002だったと思います。
私的新発見とは・・・。
時刻をラベルに表示し、あたかも時計が動いているように見せるためにラベルに時刻を表示し続けるのがポイントだという事はちょっとVBAを学べはわかります。
プロシジャーで言うと、
Sub dspclock()
Do While 表示
Label1.Caption = Now()
DoEvents
Loop
End Sub
これなんですが、
この中で Doevents という記述がありますが、これ入れないとUserForm1は、真っ白のままで何も表示されない状態になってしまいます。
そこでワンクッションのつもりでDoeventsをはさむと見事にデジタル時計が表示される
のですが・・・・。
Excel2000Or2002の時、作ったものだと Doeventsだけを入れてループさせると
CPUの占有率が100%になってしまう現象が見られました。
時計を表示させるぐらいで100%ではやばい ということでAPIのSleepをDoeventsと
一緒に使う事で占有率は、まあいいだろうという程度に下がりました。
この時の経験等で DoeventsとSleepは、セットで使う癖が今でも付いています。
今回の質問で投稿した内容、Doeventsだけでも
CPU占有率は25%程度だったことが私的発見でした。
10年前に作成したストップウォッチでも同様の結果でした。
Win7+Excel2010で試した結果です。
因みに
Sub dspclock()
Do While 表示
Label1.Caption = Now()
DoEvents
Sleep 50
Loop
End Sub
なんてすると、占有率は、0%〜2%程度でした。
βさんのコード時計表示中に閉じるボタンクリックでコードが終わらない可能性がありますよ!!
|
|