【2026年9月最新】ExcelVBAのDoEventsとは?処理を途中で止める・キャンセルボタンを作る使い方を非エンジニアにもわかりやすく解説
「業務マクロを実行したら、Excelの画面が真っ白になって「応答なし」と表示され、何もできなくなった」「大量データの処理中に固まってしまい、途中で止めることもできず、終わるまで待つしかなかった」——ExcelVBAで作られた業務マクロを運用していると、こうした場面に一度は遭遇するはずです。
こうした「処理中の応答なし」「途中で止められない」という問題を解決する代表的な仕組みが、この記事のテーマであるDoEventsです。名前だけ聞くと地味な機能に見えますが、業務マクロの「使い勝手」と「安全性」を大きく左右する重要な仕組みです。
この記事では、DoEventsが何をしているのか、キャンセルボタンの作り方、多用したときに起きる思わぬ罠まで、非エンジニアの経営者・管理職の方にも分かる言葉で解説します。後半では、弊社(株式会社GENAI)がAIエージェント「Claude Code」を使って、こうした業務マクロの改修をどう運用しているかも紹介します。
この記事を最後まで読むと、次の6つが明確になります。
01 WHY IT MATTERS 経営者・管理職が「マクロが固まる」問題で困る理由 処理中に何もできなくなる「応答なし」は、業務停止に直結する
業務マクロを運用している職場では、次のような相談が定期的に発生します。
こうした問題の背景には、多くの場合「マクロの実行中、Windowsからの操作(クリックやキー入力など)を受け付ける仕組みが働いていない」という、VBAの処理の性質が関係しています。
📚 用語解説
応答なし(Not Responding):アプリケーションが処理に専念していて、マウスクリックやキー入力といった操作を一時的に受け付けられない状態。Windowsが「このアプリは反応していません」と判断して表示するメッセージで、必ずしも処理が停止しているとは限らず、裏で計算が進行中のケースも多い。
「処理に時間がかかる業務マクロ」を運用している部署がある場合、「処理中に安全に中断できる仕組みがあるか」を一度確認しておく価値があります。特に大量データを扱う経理・在庫管理・顧客リスト処理のマクロは、この仕組みの有無で現場の使い勝手が大きく変わります。
1-1. 「固まって見える」のと「本当に停止している」のは別問題
大量データを処理するループ処理の最中は、VBAはひたすら計算に専念しており、Windowsからの操作要求(メッセージ)を受け取る余裕がありません。この状態が続くとWindowsは「応答なし」と判断し、あたかも壊れたかのような見た目になります。実際には処理は正常に進んでいることも多いのですが、担当者からすると「本当に動いているのか、壊れたのか」が分からず、強制終了してしまう、というトラブルが起こりがちです。
次章から、この問題を解決するDoEventsという仕組みを具体的に見ていきます。
02 THE BASICS DoEventsとは何か——OSに一瞬だけ制御を返す仕組み マクロの実行中でも、Windowsの操作を受け付けられるようにする
DoEventsは、VBAの実行中にWindows(OS)に処理を一時的に返し、溜まっている操作要求(クリック・キー入力・画面の再描画など)を処理させるための命令です。DoEventsを実行した箇所で処理はごくわずかに中断し、Windows側の未処理の要求を片付けた後、すぐにVBAの続きの処理へ戻ってきます。
📚 用語解説
DoEvents(ドゥーイベンツ):VBAのコード実行中に、一瞬だけOS(Windows)に制御を渡し、溜まっているクリックやキー入力などの操作要求を処理させる命令。処理が終わると自動的にVBAのコードの続きに戻る。長時間かかるループ処理の中に挟むことで、処理中でも画面の操作を受け付けられるようにする。
📚 用語解説
メッセージ(Windowsメッセージ):マウスクリック・キー入力・ウィンドウの再描画要求など、OSがアプリケーションに送る「これから処理してほしいこと」の通知。通常のアプリは常にこのメッセージを受け取って反応するが、VBAが計算処理に専念している間はこのメッセージの受け取りが後回しになる。
最もシンプルな例は次のようになります。
Sub ProcessWithoutDoEvents()
Dim i As Long
For i = 1 To 1000000
' 重い処理(ここでは仮に空ループ)
Cells(1, 1).Value = i
Next i
MsgBox "完了しました"
End Sub
Sub ProcessWithDoEvents()
Dim i As Long
For i = 1 To 1000000
Cells(1, 1).Value = i
If i Mod 1000 = 0 Then
DoEvents ' 1000回に1回、OSに操作を処理させる
End If
Next i
MsgBox "完了しました"
End Sub
前者(DoEventsなし)は、100万回のループが終わるまでExcelは一切の操作を受け付けず、「応答なし」の表示が出やすくなります。後者(DoEventsあり)は、1000回に1回OSに処理を戻すため、実行中でも画面が再描画され、他の操作の受け付けも可能になります。
03 CANCEL BUTTON キャンセルボタンで処理を安全に止める実装 DoEventsと組み合わせて「途中で止められるマクロ」を作る
DoEventsの最も実務的な使いどころが、「処理中でも押せるキャンセルボタン」の実装です。DoEventsを挟まないと、ボタンをクリックしてもその操作要求がVBAに伝わらず、キャンセルボタンが機能しません。
基本的な実装パターンは、「フラグ(目印となる変数)」を用意し、ボタンが押されたらフラグを立て、ループ内でフラグを確認して処理を打ち切るという流れです。
' 標準モジュール
Public CancelFlag As Boolean
Sub StartProcess()
Dim i As Long
CancelFlag = False
For i = 1 To 1000000
Cells(i Mod 100 + 1, 1).Value = i
If i Mod 500 = 0 Then
DoEvents ' キャンセルボタンのクリックを受け付ける
If CancelFlag = True Then
MsgBox "処理を中断しました"
Exit Sub
End If
End If
Next i
MsgBox "処理が完了しました"
End Sub
' キャンセルボタン(UserFormやシート上のボタン)のクリックイベント
Sub CancelButton_Click()
CancelFlag = True
End Sub
この仕組みのポイントは、DoEventsを実行するたびにOSがボタンのクリックを検知し、CancelFlagという変数にTrueをセットしてくれるところにあります。ループ側は定期的にこのフラグを確認するだけで、安全に処理を打ち切ることができます。
開始
CancelFlag
=False
DoEvents
操作要求を
受け付ける
キャンセル
クリック
CancelFlag
=True
安全に
中断
Exit Sub
DoEventsは1回呼ぶだけでもわずかに処理時間がかかるため、100万回のループすべてで呼ぶと逆に大幅に遅くなります。上記の例のように「Nの倍数のときだけ呼ぶ(例: 500回に1回)」という間引き方が実務では定番です。
04 PITFALLS DoEventsを多用したときに起きる「二重実行」の罠 便利な機能ほど、副作用も理解しておく必要がある
ここが、この記事で最も重要な注意点です。DoEventsは「溜まっている操作要求をすべて処理する」という性質上、想定外の操作まで受け付けてしまうことがあります。
DoEventsを呼んだ瞬間、ユーザーが(誤って、あるいは処理が遅いと感じて)同じ実行ボタンを連打すると、1つ目の処理が終わっていないのに、2つ目の同じマクロが動き出してしまうことがあります。これを「二重実行」「再入(re-entrancy)」と呼び、同じセルへの書き込みが競合したり、変数の値が想定外に書き換わったりする不具合の原因になります。
📚 用語解説
二重実行(再入・re-entrancy):1つのマクロの実行が完了する前に、同じマクロ(または関連する別の処理)がもう一度呼び出されてしまう現象。DoEventsによってOSへの制御が戻るタイミングで、ユーザーの操作やタイマーなどをきっかけに発生する。データの不整合や予期しないエラーの原因になりやすい。
| 対策 | 内容 |
|---|---|
| 実行中は関連ボタンを無効化する | 処理開始時にボタンのEnabledをFalseにし、完了後にTrueへ戻す |
| 実行中フラグを立てる | IsRunningのようなフラグを用意し、実行中の再呼び出しを弾く(If IsRunning Then Exit Sub) |
| DoEventsの呼び出し頻度を減らす | 毎回ではなく、一定間隔(Nの倍数)でのみ呼び出す |
| Application.ScreenUpdating = Falseと併用する | 画面の再描画を止めて処理速度を上げつつ、必要な箇所だけDoEventsで応答性を確保する |
Public IsRunning As Boolean
Sub SafeStartProcess()
If IsRunning Then
MsgBox "既に処理が実行中です"
Exit Sub
End If
IsRunning = True
' ここに本来の処理(DoEventsを含むループ等)を書く
IsRunning = False
End Sub
このように「実行中かどうかを示すフラグ」を用意し、二重に呼ばれても即座に抜けるガード処理を入れておくことで、DoEventsの利便性を活かしつつ、二重実行のリスクを避けられます。
05 CTRL+BREAK Ctrl+Break(手動中断)とDoEventsの違い 「その場で止める」操作と「止められる仕組みを作る」設計の違い
「マクロを途中で止める」という目的に対して、DoEventsを使ったキャンセルボタンとは別に、Ctrl+Breakキーという手動の中断方法も存在します。両者は目的も使う場面も異なるため、整理しておきます。
📚 用語解説
Ctrl+Break:VBAのマクロ実行中にキーボードでCtrlキーとBreak(Pause)キーを同時に押すと、実行中のコードを強制的に中断し、どの行で止まったかを示すデバッグ画面(中断モード)に入る機能。開発者がその場でコードの状態を確認する用途に使われる。
| 方法 | 目的 | 想定するユーザー | DoEventsとの関係 |
|---|---|---|---|
| Ctrl+Break | 開発者がその場でコードを緊急停止し、デバッグしたい | 開発者・VBAに詳しい担当者 | DoEventsを挟んでいなくても機能する場合が多い(ただし挟んでいる方が反応しやすい) |
| DoEvents + キャンセルボタン | 一般の利用者が、意図した安全な手順で処理を中断したい | マクロを日常的に使う一般業務担当者 | DoEventsが機能の前提そのもの |
Ctrl+Breakは「非常停止ボタンを外部から押す」ような操作で、突然コードの途中で止まるため、データの整合性が保証されません(書き込みの途中で止まる可能性がある)。一方、DoEvents+キャンセルボタンの仕組みは、あらかじめ「安全に止まれる場所」をコード側で設計しておく点が根本的に異なります。
理想的な業務マクロは、利用者が「Ctrl+Breakって何ですか」と質問しなくて済むように、画面上に分かりやすい「キャンセル」ボタンが用意されている状態です。DoEventsはその実現に欠かせない部品です。
06 COMMON PITFALLS 業務マクロ運用でよくある落とし穴 早見表 専門知識がなくても確認できる観点
非エンジニアの担当者でも、以下の観点で業務マクロのセルフチェックが可能です。
| 確認したいこと | 確認方法の例 |
|---|---|
| 大量データを処理するマクロに「キャンセルボタン」があるか | 担当者やAIに「途中で止める手段があるか」を確認する |
| 「応答なし」表示が出たときに何が起きているか説明できるか | 処理中に画面が固まる仕様なのか、異常なのかを事前に確認しておく |
| ボタンの連打で二重に処理が走らないか | 実行中にボタンが無効化される、または警告が出る作りになっているか確認する |
| Ctrl+Breakで中断した場合のデータ影響が説明されているか | 緊急停止した場合に、途中データが残るリスクを担当者が理解しているか確認する |
DoEventsを入れて画面の応答性を確保しても、その裏でボタンの連打による二重実行が起きていれば、データの不整合という別の問題が発生します。「固まらなくなった」ことと「安全に運用できている」ことは、必ずしもイコールではありません。
6-1. 「担当者ごとに対処法が違う」問題も見逃せない
複数の担当者が同じマクロを使っている職場では、「固まったら強制終了する人」と「Ctrl+Breakで様子を見る人」が混在するという問題がよく起こります。強制終了はデータの保存前に処理を止めてしまうリスクがあり、対処法が統一されていないと、思わぬデータ消失につながることがあります。
AIエージェントにマクロの改修を一元化して依頼することの隠れた利点は、こうした「対処法が担当者ごとにバラつく」問題そのものを構造的に防げることです。キャンセルボタンという「正しい止め方」を一度実装しておけば、以降は誰が使っても同じ安全な手順で中断できます。
6-2. Application.ScreenUpdatingとの合わせ技
DoEventsとセットで覚えておきたいのがApplication.ScreenUpdatingです。こちらはDoEventsとは逆に、処理中の画面の再描画を一時的に止めて、処理速度そのものを上げるための設定です。目的が異なる2つの仕組みを混同すると、「速くしたいのか、止められるようにしたいのか」の設計判断がぶれてしまいます。
| 仕組み | 目的 | 効果 |
|---|---|---|
| DoEvents | 処理中でも操作を受け付けられるようにする | 応答性が上がる(体感の速度は変わらない) |
| Application.ScreenUpdating = False | 画面の再描画を止めて処理そのものを速くする | 処理が速くなる(ただし画面は更新されない) |
Sub FastAndSafeProcess()
Application.ScreenUpdating = False ' 再描画を止めて処理を高速化
Dim i As Long
For i = 1 To 1000000
Cells(1, 1).Value = i
If i Mod 500 = 0 Then
DoEvents ' キャンセルボタンの操作は受け付ける
If CancelFlag = True Then Exit For
End If
Next i
Application.ScreenUpdating = True ' 必ず元に戻す
End Sub
Application.ScreenUpdating = Falseを実行したまま処理がエラーで中断すると、Excel全体の画面が更新されないままになってしまいます。エラー処理(On Error)と組み合わせて、必ずTrueに戻す処理を実行する設計にしておくことが重要です。
この2つを組み合わせることで、「処理は高速に進めつつ、必要なタイミングだけ操作を受け付ける」という、実務で最もバランスの良いマクロが実現できます。「重い処理を速くしたい」という相談と「途中で止められるようにしたい」という相談は別の要望であり、それぞれに対応する仕組みが異なる点を押さえておくと、AIへの改修依頼もより的確になります。
07 GENAI CASE STUDY 【独自データ】GENAI社内、業務マクロの改修をClaude Codeにどこまで任せているか 二重実行防止まで含めた改修を、AIエージェントに依頼する運用
ここからは、弊社(株式会社GENAI)の実運用データを紹介します。弊社ではClaude Max 20xプラン(月額$200・約30,000円)を契約し、経営・営業・広告・開発・経理・秘書業務まで全社的にAIエージェント「Claude Code」を活用しています。
| 項目 | 内容 |
|---|---|
| 契約プラン | Claude Max 20x(月$200 / 約30,000円) |
| 利用開始 | 2025年後半〜 |
| マクロ改修関連の用途 | 既存VBAマクロへのキャンセル機能追加、二重実行防止ガードの実装、処理速度の改善 |
| 担当体制 | 専任のVBA開発者を新規に雇わず、既存メンバー+Claude Codeで対応 |
弊社では、既存の業務マクロを改修する際、Claude Codeに「このマクロに、途中で止められるキャンセルボタンをつけて」といった日本語での依頼をするだけで、内部的にDoEventsを含む改修コードを組み立ててもらっています。「二重実行が起きないか」まで含めて自動的にチェックしてもらうのが、弊社の標準的な運用です。
「止められる
ようにして」
と依頼
Claude Codeが
DoEventsと
フラグを実装
二重実行防止の
ガードも
合わせて追加
人間が
動作を
確認
この運用の利点は、「DoEventsを入れれば入れるほど良い」という誤った理解を、AIが標準的な対策(間引き呼び出し・二重実行防止フラグ)を踏まえた上で回避してくれる点にあります。人間が「止められるようにしたい」という目的を伝えるだけで、実装の細部と品質管理はAIに任せられます。
7-1. 「困りごとを言語化する」だけで済む依頼の仕方
弊社の実務では、マクロ改修に関する依頼のほとんどが「何に困っていて、どうなってほしいか」を一言で伝えるだけで完結しています。「処理中に画面が固まって不安」「途中でやめられるようにしたい」といった、非エンジニアでも自然に使える言葉で十分にAIへ意図が伝わります。
📚 用語解説
困りごとの言語化:「処理中に固まって見える」「途中で止められない」といった、現象そのものを専門用語を使わずに説明すること。原因(DoEventsの不足等)や実装方法を知らなくても、この困りごとを正確に伝えられれば、AIエージェントが適切な改修方法を提案してくれる。
08 CONCLUSION まとめ ── 「止められる設計」が業務マクロの信頼性を決める 技術の詳細を知らなくても、リスクは管理できる
この記事では、ExcelVBAのDoEventsが何をしているのか、キャンセルボタンの実装、多用したときの二重実行の罠、Ctrl+Breakとの違い、そして弊社GENAIがAIエージェント「Claude Code」を使ってマクロ改修をどう運用しているかを紹介しました。最後にポイントを振り返ります。
「処理中に止められるようにする」という要望は一見単純ですが、その裏側には二重実行のリスクという、経験のある開発者でも見落としやすい落とし穴が潜んでいます。技術の詳細を全て理解する必要はありませんが、「便利な機能には副作用もある」と知っているだけで、改修の依頼の質が上がります。
小さな不便を放置せず、「安全に止められる仕組み」まで含めて早めに改善する習慣を持つことが、業務マクロの信頼性を守る確実な一歩です。
「固まる」「止められない」業務マクロ、AIで安全な仕組みに作り直しませんか?
キャンセル機能の追加から、二重実行防止・処理速度の改善・業務プロセス全体の自動化まで。
Claude Codeを使った「安心して使える業務マクロ」の作り方を、実例ベースでご提案します。
ここから先の進め方は、大きく2つあります。
自社で回せるようになりたい方は、AI鬼管理でClaude Code/Codexの使い方から業務設計・社内定着まで伴走を受けながら、社内に仕組みを作る道があります。
覚えるより任せたい方は、AI社員AIKATAでこの記事のような定型業務を丸ごと預ける道があります。料金は月30万円の月額定額、追加費用は0円です。
どちらが合うかは、業務量と社内体制次第です。無料相談・無料適合診断で、貴社の場合はどちらが向くかからご相談いただけます。
NEXT STEP
この記事の内容を、あなたのビジネスで
実践してみませんか?
よくある質問
Q. DoEventsを入れると、マクロの処理速度は遅くなりますか?
A. DoEventsの呼び出し自体にわずかな処理時間がかかるため、ループのすべての回で呼ぶと体感できるほど遅くなることがあります。実務では「Nの倍数のときだけ呼ぶ」ように間引くのが定番の対策です。
Q. DoEventsを入れているのに、キャンセルボタンが反応しません
A. DoEventsの呼び出し頻度が少なすぎる(間引きすぎている)か、キャンセルボタンのクリックイベントでフラグを正しく立てられていない可能性があります。まずはDoEventsを呼ぶ頻度を増やして反応するか確認し、フラグの変数がグローバル(Public)に正しく宣言されているかも確認してください。
Q. 「二重実行」が起きているかどうか、どうやって確認できますか?
A. 同じマクロのボタンを連打したときに、想定より多くの処理が実行されている、あるいはデータが重複して書き込まれている場合は二重実行が疑われます。実行中フラグ(IsRunningのような変数)を使ったガード処理を入れることで、事前に防止できます。
Q. Ctrl+Breakで中断した場合、データはどうなりますか?
A. Ctrl+Breakはコードの実行をその場で強制的に止めるため、書き込みの途中だった場合はデータが中途半端な状態で残る可能性があります。一般利用者向けには、Ctrl+Breakに頼らず、あらかじめキャンセルボタンなど「安全に止まれる」仕組みを用意しておくことが望ましいです。
Q. 非エンジニアでも、マクロに「途中で止める機能」を追加する依頼はできますか?
A. できます。「このマクロを、途中で止められるようにしてほしい」という要望を伝えるだけで十分です。DoEventsやフラグといった実装の詳細は、Claude CodeのようなAIエージェントに任せることができます。
Q. Claude Codeに業務マクロの改修を依頼する場合、専門知識は必要ですか?
A. 不要です。「処理中に画面が固まって困っている」「途中でやめられるようにしたい」といった感覚的な言葉で伝えるだけで、Claude CodeがDoEventsや二重実行防止を含む改修コードを組み立て、日本語で説明してくれます。最終確認・承認だけ人間が行う運用で十分に回せます。
Claude Codeで業務自動化を90日で叩き込む
経営者向けの伴走型パーソナルトレーニング
AI鬼管理/AI社員AIKATAへのお問い合わせ
この記事を読んで気になった方へ。
専門スタッフが、御社に最適な
業務自動化・業務代行プランを無料でご提案します。




