フォームにタイマーやカウントなどを高速表示させた場合、対処しない場合画面には何も表示されません。ここではそのような場合、画面を更新する2種類の方法を紹介します。
1つは「DoEvents」を使います。DoEventsとは、ループなどで長時間連続処理をしている場合に、制御をOSに戻し他の処理を実行させる関数です。
もう一つは「Repaint」です。Repaintとはフォームを再描画させるメソッドです。
■ タイマーをカウントダウンし表示するフォームの作成
下のようなフォームを作成しました。
スタートのコマンドボタンをクリックすると、カウントダウンの数値をテキストボックスに表示します。
■ 秒単位でカウントダウンするAccess VBAの作成
10秒カウントダウンしテキストボックスに表示するVBAです。
・コマンドボタンのクリックイベントを作成します。
・コマンドボタンの標題を「実行中!」にし、終了すると「スタート」に戻します。
・lval = 10で10秒を設定しています。
・Timer関数で現在の秒数を取得します。
・Doループで秒数を、開始時点の秒数からカウントダウンします。
Private Sub コマンド0_Click()
Dim lval As Long
Dim stimer As Single
lval = 10
Me!コマンド0.Caption = "実行中!"
stimer = Timer
Do Until Timer > stimer + lval
Me!テキスト1 = Int(lval - (Timer - stimer))
Loop
Me!コマンド0.Caption = "スタート"
End Sub
コマンドボタンをクリックし実行した画面です。
コマンドボタンの標題もテキストボックスも変化がありませんが、フォーム位置の移動などが受け付けられず動作していることは分かります。
■ DoEvnsとRepaintを追加したAccess VBAの作成
DoEventsを追加したVBAです。
Private Sub コマンド0_Click()
Dim lval As Long
Dim stimer As Single
lval = 10
Me!コマンド0.Caption = "実行中!"
stimer = Timer
Do Until Timer > stimer + lval
Me!テキスト1 = Int(lval - (Timer - stimer))
DoEvents
Loop
Me!コマンド0.Caption = "スタート"
End Sub
Repaintを追加したVBAです。
Private Sub コマンド0_Click()
Dim lval As Long
Dim stimer As Single
lval = 10
Me!コマンド0.Caption = "実行中!"
stimer = Timer
Do Until Timer > stimer + lval
Me!テキスト1 = Int(lval - (Timer - stimer))
Me.Repaint
Loop
Me!コマンド0.Caption = "スタート"
End Sub
実行結果です。
コマンドボタンとテキストボックスがともに正常に表示され、カウントダウンも表示されました。
ただRepaintの場合、画面のチラツキが発生しました。
今回のループのように何回も実行する場合は、チラツキのないDoEventsを使用した方がいいようです。