wanna.jp VBAリファレンス
Top > VBA関数リファレンス > VBA DoEventsで画面フリーズを回避!Excel「応答なし」を防ぎユーザー体験を向上させる実用テクニック

VBA DoEventsで画面フリーズを回避!Excel「応答なし」を防ぎユーザー体験を向上させる実用テクニック

VBAで長時間かかる処理を実行中、Excelが突然「応答なし」となり、画面が真っ白にフリーズしてしまう経験はありませんか?ユーザーを不安にさせ、時には強制終了に追い込まれるこの現象は、開発者にとって頭の痛い問題です。

しかし、この問題を劇的に改善し、ユーザーにスムーズな操作感を提供できる強力な関数がVBAには存在します。それが DoEvents 関数です。本記事では、VBAの DoEvents 関数を使って重いループ処理中にExcelのフリーズを防ぐ実用的な方法と、その利用における重要な「落とし穴」について、VBAエキスパートの視点から詳しく解説します。

【実務コード】コピペで動く!DoEventsを使ったフリーズ回避ループ処理

まずは、DoEvents を組み込んだ典型的なループ処理のコードをご覧ください。このコードは、膨大な回数のループ処理を実行しながら、Excelが応答し続けることを可能にします。実際にコードを実行し、処理中にExcelの別シートをクリックしたり、ウィンドウを動かしたりしてみてください。

Sub LongRunningProcessWithDoEvents()
    Const TOTAL_ITERATIONS As Long = 1000000 ' 処理回数を増やし、効果を実感しやすく
    Dim i As Long
    Dim startTime As Double
    Dim messageText As String

    ' 処理開始時刻を記録
    startTime = Timer

    ' パフォーマンス向上のための設定(任意だが推奨)
    Application.ScreenUpdating = False ' 画面更新を停止
    Application.Calculation = xlCalculationManual ' 再計算を停止(VBAでセルを操作する場合)

    Debug.Print "--- 処理開始 ---"

    For i = 1 To TOTAL_ITERATIONS
        ' ここに時間のかかる実際の処理を記述します。
        ' 例: 複雑な計算、データベースからの大量データ取得、セルへの書き込みなど
        ' Cells(i, 1).Value = "データ " & i ' セル操作をコメントアウト、動作確認を優先

        ' DoEventsを呼び出すタイミングを制御
        ' 例: 1000回に1回、DoEventsを呼び出す
        If i Mod 1000 = 0 Then
            DoEvents ' ここでOSに制御を明け渡し、Excelが応答できるようにする
            ' オプション: ステータスバーに進捗を表示してユーザーに安心感を与える
            Application.StatusBar = "処理中... " & Format(i / TOTAL_ITERATIONS, "0.0%")
        End If
    Next i

    ' パフォーマンス設定を元に戻す
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.StatusBar = False ' ステータスバーをクリア

    ' 処理終了時刻と所要時間を表示
    messageText = "処理が完了しました!" & vbCrLf & _
                  "所要時間: " & Format(Timer - startTime, "0.00") & "秒"
    MsgBox messageText, vbInformation, "処理完了"

    Debug.Print "--- 処理終了 ---"
End Sub

DoEventsの仕組みと「落とし穴」:賢い使い方で速度と安定を両立

DoEvents関数は、実行中のVBAマクロを一時停止し、OS(Windows)に対して他の処理を実行する機会を与えるものです。これにより、Excelは画面の再描画や他のアプリケーションイベント(マウス操作、キーボード入力など)への応答が可能となり、ユーザーはExcelがフリーズしているわけではないと認識できます。これは、まさに「応答なし」状態を回避するための特効薬のように見えますが、その機能には重要な「落とし穴」があります。

まとめ:DoEventsを使いこなし、プロフェッショナルなVBAを

DoEvents関数は、VBAにおけるユーザー体験を大きく左右する強力なツールです。適切に使用することで、重い処理中に発生する「応答なし」状態を回避し、ユーザーに安心感と快適な操作を提供できます。しかし、その効果と引き換えに発生するパフォーマンスコストを理解し、無闇な多用は避けるべきです。

進捗表示の更新時など、ユーザーとのインタラクションが必要な最小限のタイミングでDoEventsを組み込み、賢く利用することで、あなたはよりプロフェッショナルでユーザーフレンドリーなVBAアプリケーションを開発できるでしょう。ぜひ、今回の知識をあなたのVBA開発に活かし、ストレスフリーなExcel業務環境を実現してください。

VBAでの業務効率化、悩み解決します

「このマクロ、もっと速くならないかな?」「エラーが消えない…」
Access/VBA専門のwanna.jpにご相談ください。

無料相談はこちら