本ページには広告が含まれています。

VBA DoEvents 関数 占領中の制御をOSに返します

Excel VBAの「DoEvents 関数」について解説します。

スポンサーリンク

DoEvents 関数とは

Excel VBA の DoEvents 関数は、プログラムが占領している制御をOS(オペレーティングシステム)に返します。

ループ処理や重い計算など時間のかかる処理を実行している場合、ユーザーの操作に反応しなくなってしまうことがあります。VBAは一度に一つの処理しかできないため、実行中のコードがユーザー操作(クリック・キー入力・スクロール・描画更新など)を受け付けなくなっている状態です。そんな時に活躍するのが DoEvents です。

DoEvents 関数の構文や実際の使い方(保留されているイベントを即座に実行させることができるようにする方法)について具体的に解説していきたいと思います。

DoEvents 関数(Visual Basic for Applications リファレンス)

DoEvents 関数を使ったサンプルがある過去記事の一覧を別タブに表示します。

スポンサーリンク

構文(引数と戻り値)

Excel VBAの関数を使いこなすには、関数の構文を正しく理解しておくことが重要です。

構文

DoEvents()

引数

DoEvents 関数に引数はありません
そのため、DoEvents() のように括弧付きで書くこともできますが、括弧なしで記述されることが多いです。

戻り値

DoEvents 処理中に発生したイベントの数を表す整数値(Integer)を返します。
通常は DoEvents を呼び出すだけで戻り値を使いません。ユーザー操作の応答性維持が目的であれば、戻り値を無視して問題ありませんが、次のように必要に応じてログやデバッグ目的で取得することも可能です。

この戻り値は単に「何件処理されたか」の目安を示すものです。処理の成否や状態を示すものではありません。

解説(使用例)

DoEvents 関数の使い方について、サンプルコードを使って解説します。

DoEvents 関数の主な使用例

DoEvents 関数の使用例を紹介します。

基本的な使用例

次の例は、ループ処理中に DoEvents を入れることで応答可能にします。

'■DoEvents関数サンプル1(基本的な使用例)
Sub DoEvents_Sample_01()
  Dim i As Long
  For i = 1 To 100000
    Cells(1, 1).Value = i 'A1セルに書き込み
    DoEvents  '←OSに処理を渡して応答可能に
  Next i
End Sub

仮に DoEvents をコメントアウトして実行させた場合、マウスポインターは処理中の表示になり、クリックなどの操作を行うと最悪フリーズしてしまいます。

実践的な使用例(DoEvents 使用回数調整)

Application.StatusBar を使って、Excelの左下ステータスバーに進捗を表示します。

'■DoEvents関数サンプル2(実践的な使用例)
Sub DoEvents_Sample_02()
  Dim i As Long
  Dim maxTimes As Long
  maxTimes = 100000 '最大処理件数を設定
  'ステータスバーに文字列を表示
  Application.StatusBar = "処理開始..."
  For i = 1 To maxTimes
    Cells(1, 1).Value = i 'A1セルに書き込み
    '進捗率を計算して表示
    If i Mod 1000 = 0 Then  '更新頻度を設定
      Application.StatusBar = "進捗状況: " _
                & Format(i / maxTimes, "0%")
      DoEvents '←制御をOSに渡し表示も更新
    End If
  Next i
  MsgBox "処理が完了しました。", vbInformation
  'ステータスバーを元に戻す
  Application.StatusBar = False
End Sub

割り算の余りを求めるMOD演算子の割り切れるタイミングで DoEvents することで回数を100回に絞っています。同時に進捗状況の数値(%)表示を更新しています。

このようにすることで、最適なタイミングで DoEvents を使用することができます。DoEvents は非常に便利な関数ですが、使いすぎると逆効果になることもあります。最適なタイミングで使うようコードを調整することが必要です。

最後に Application.StatusBar = False でステータスバーを元の状態に戻します。
必ず Application.StatusBar = False を入れ忘れないようにしましょう。

DoEvents 関数を使ったサンプルがある過去記事の一覧を別タブに表示します。
このリンククリックで DoEvents を使っている過去記事の一覧を表示できます。いろいろなサンプルコードがあるので是非参考にご覧ください。(プログレスバーを使う例やキャンセルボタンで処理中断を可能にする例など)

注意点:DoEventsのデメリット

  • 処理が不安定化する可能性
    • DoEvents の間に他のイベント(例:ボタン押下)を受け取るため、意図しないタイミングでコードが動作する可能性があります。
  • パフォーマンスの低下
    • ループのたびに DoEvents を呼び出すことになるので、回数が多い場合には処理速度が低下することがあります。

おわりに

VBA の DoEvents 関数は、VBA実行中「処理の合間にOSに譲る」ことでユーザーからの応答性を保つことができるようにします。

しかし、DoEvents の使いどころには注意が必要です。

  • 適している例
    • 長いループ処理中の UI 応答を維持したいとき
    • キャンセルボタンなどのユーザー操作を受け付けたいとき
    • フォームの描画更新が必要なとき(例:プログレスバーなど)
  • 避けるべき例
    • クリティカルな処理中(例:ファイル書き込み、データベース更新)
    • イベントの再入が危険なとき(例:同じ処理が二重に走る可能性がある)

以上、この解説が少しでもみなさまのお役に立てたなら幸いです(^^;

VBAの関数一覧はこちらからご参照ください。

スポンサーリンク
スポンサーリンク

VBAサンプルファイルダウンロードページのご案内

このページで使用したサンプルファイルの登録はありません(^^;
ページ内のコードをコピーしてご利用ください。

ダウンロードページへのリンクは下のカードクリックでジャンプできます。
よろしければご利用ください!