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 を取り入れて、違いを体感してみてください。
