VB6・VBA関数メモ:DoEvents関数

DoEvents関数についてメモしておきます。

この関数は、処理中にOSに制御を戻す(待機中の処理を実行させる)ときに使用します。
無限ループや大量ループ時のハングアップ抑制に使ったりもします。
デバッグ中は、ループ中にブレイクポイントを付けたりできるので便利です。

しかし処理は安定しますが、処理時間が長くなってしまうことがあるので使いすぎは注意かもしれません。
それでも無限ループ対策の為に入れておいた方が安心なことも多い気がします。
(DoEvensを入れた場所では、無限ループ中でもEscやCtrl+Break、Alt+F4が効くので私はよく助けられています)

戻り値でVBアプリケーションのフォーム数を返します。
VBAのユーザフォームはカウントされるようですがExcel本体等はカウントされないようです。(当たり前か)


概要

DoEvents()
機能 OSに制御を一旦戻す
引数 なし
戻り値 VBで実行中のフォーム数 (Integer型)


使用例

説明 記述例 出力
OSに制御を戻す
(例では100回ループしたらOSに制御を戻す)
(デバッグ中であれば、ループ中でもブレイクポイントの設定可能)
Dim cnt   As Long
Dim t     As Double

cnt = 0
t = timer()
Do While cnt < 100000
    If cnt Mod 100 = 0 Then
        DoEvents
    End If
    cnt = cnt + 1
Loop

Debug.Print timer() - t
 0.109375 
・[DoEventsあり]ボタンでは描画しながら処理を行う
・[DoEventsなし]ボタンでは描画せず処理を行い処理完了後に描画
・[DoEventsあり]ボタンの処理中は[DoEventsなし]ボタンを押すことができる
'DoEventsあり
Private Sub CommandButton1_Click()
    Dim cnt As Long
    
    cnt = 0
    Do While cnt < 100000
        TextBox1.Text = cnt
        cnt = cnt + 1
	    If cnt Mod 100 = 0 Then
	        DoEvents
	    End If
    Loop
    TextBox1.Text = "完了"
End Sub

'DoEventsなし
Private Sub CommandButton2_Click()
    Dim cnt As Long
    
    cnt = 0
    Do While cnt < 100000
        TextBox2.Text = cnt
        cnt = cnt + 1
    Loop
    TextBox2.Text = "完了"
End Sub


動作検証

説明 記述例 出力
DoEventsを入れると処理は遅くなる
Dim cnt   As Long
Dim t     As Double

cnt = 0
t = timer()
Do While cnt < 100000
    cnt = cnt + 1
Loop

Debug.Print timer() - t
 0.015625
Dim cnt   As Long
Dim t     As Double

cnt = 0
t = timer()
Do While cnt < 100000
    DoEvents
    cnt = cnt + 1
Loop

Debug.Print timer() - t
 4.9296875


コメント
コメントする








    
この記事のトラックバックURL
トラックバック