表示が高速で切替わる場合の画面更新方法|DoEvents,Repaint:Access

フォームにタイマーやカウントなどを高速表示させた場合、対処しない場合画面には何も表示されません。ここではそのような場合、画面を更新する2種類の方法を紹介します。

1つは「DoEvents」を使います。DoEventsとは、ループなどで長時間連続処理をしている場合に、制御をOSに戻し他の処理を実行させる関数です。

もう一つは「Repaint」です。Repaintとはフォームを再描画させるメソッドです。




BackHome BackTips Backメニュー

■ タイマーをカウントダウンし表示するフォームの作成

下のようなフォームを作成しました。
スタートのコマンドボタンをクリックすると、カウントダウンの数値をテキストボックスに表示します。
タイマーをカウントダウンし表示するフォーム

■ 秒単位でカウントダウンするAccess VBAの作成

10秒カウントダウンしテキストボックスに表示する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です。
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です。
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を使用した方がいいようです。
コマンドボタンとテキストボックスがともに正常に表示された


BackHome BackTips Backメニュー

Copyright(C) FeedSoft