【Excelマクロ】マクロの流れを止めずに処理を進める方法(DoEventsとは?)

VBAでマクロを作っていると、「処理が止まってしまってExcelがフリーズしたみたいになる…」という経験をされたことはありませんか?

実はこれ、処理が長くなったときにVBAがユーザーの操作や画面の更新を受け付けていないのが原因です。

そんなときに使えるのが、今回紹介する DoEvents という命令です。

名前だけ見ると難しそうに見えますが、役割はとてもシンプルで、マクロの「ちょっとした隙間」で外部からの操作(イベント)を受け付けられるようにする便利な仕組みです。

そもそも「処理が止まる」とはどういうことか?

マクロが動いている間、基本的にはExcelの画面更新やボタン操作は止まります

たとえば、ループで10,000件のデータを処理しているようなマクロを動かすと、Excelが固まったように見えることもあります。

なぜ固まったように見えるのか?

VBAは、処理中にOS(Windowsなど)からの操作要求を無視してしまうため、画面更新やマウス操作が反映されません。

つまり、「マクロは動いてるけど、Excelが反応してくれない」という状態になってしまうのです。

このような場面で DoEvents を使えば、マクロを止めずに他の操作も一時的に許可することができます。

DoEventsの基本的な使い方

では、実際のコードで DoEvents の役割を見てみましょう。

例1:DoEventsを使わないループ

Sub NoDoEvents()

    Dim i As Long

    For i = 1 To 1000000
        Cells(1, 1).Value = i
    Next i

    MsgBox "完了しました"

End Sub

このマクロは、セルA1に1から100万までの数を順番に表示していく処理です。

しかし実行してみると、セルA1の表示は途中では変わらず、最後にいきなり「1000000」になります

しかも、その間Excelはフリーズしたかのように見えます。

例2:DoEventsを使ったループ

Sub WithDoEvents()

    Dim i As Long

    For i = 1 To 1000000
        Cells(1, 1).Value = i
        DoEvents
    Next i

    MsgBox "完了しました"

End Sub

このマクロは、さきほどと処理内容は同じですが、ループの中で DoEvents を1行入れています。

すると、セルの値がリアルタイムで更新されるようになり、マウスで他のセルをクリックしたり、停止ボタンを押したりすることもできます。

DoEvents が、OSに「ちょっと他の処理も受け付けていいよ」と伝える役割を果たしています。

実務での使いどころと注意点

DoEvents はとても便利ですが、どこでも使っていいわけではありません。

正しく使うことで、マクロの印象や使いやすさが大きく変わってきます。

よくある活用場面

  • 処理中に「キャンセルボタン」を効かせたいとき
  • 途中経過のメッセージや表示を反映させたいとき
  • 画面が固まったように見えないようにしたいとき

たとえば、次のようなパターンです。

Sub LongProcess()

    Dim i As Long
    Dim cancelFlag As Boolean

    For i = 1 To 50000

        ' ここで途中キャンセルをチェック
        DoEvents
        If cancelFlag = True Then
            MsgBox "処理が中断されました"
            Exit Sub
        End If

        ' データの更新処理など
        Cells(i, 1).Value = i

    Next i

    MsgBox "完了しました"

End Sub

このように DoEvents を使えば、マクロ動作中でもキャンセルや操作の受け付けが可能になります。

注意点:使いすぎはパフォーマンス低下の原因に

一方で、DoEvents使いすぎると、処理が遅くなる原因になります。

なぜなら、DoEvents を通すたびにExcelが裏で「他にイベントがないか」を確認するため、ループのたびに1回ずつ待つような動作になってしまうからです。

適切な使い方のポイント

  • 毎ループではなく、一定の回数ごとに DoEvents を入れる
  • 処理が重い部分の途中経過だけに使う
  • 必要のない場所では入れない

たとえば、次のように書くとバランスがよくなります。

If i Mod 100 = 0 Then
  DoEvents
End If

これで100回に1回だけ DoEvents を実行し、処理が遅くなるのを防げます。

まとめ

VBAはとても強力な自動化ツールですが、動作中にExcelが反応しないと、ユーザーにとってはストレスになってしまいます。

そんなときこそ、DoEvents の出番です。

ほんの1行の追加で、「止まってるように見えるマクロ」から「ちゃんと動いてる安心マクロ」へと変化させることができます。

小さな工夫が、大きな使いやすさを生みます。

ぜひ一度、自分のマクロに DoEvents を取り入れて、違いを体感してみてください。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール