エラーの内容
Excelで作業中に — 外部リンクのあるファイルを開いたり、VBAマクロを実行したり、別のアプリから自動化を起動したりしたとき — 突然Excelが次のダイアログとともにハングします:
Microsoft Excel is waiting for another application to complete an OLE action.
OKをクリックすると一時的に消えますが、またすぐに表示されます。30秒後にExcelが自動的に回復することもありますが、完全にフリーズして強制終了せざるを得ない場合もあります。
発生原因
OLE(オブジェクトのリンクと埋め込み)は、ExcelがWord、PowerPoint、レガシーERPシステム、またはCOM登録済みアプリなど他のアプリケーションと通信するためのWindowsのメカニズムです。ExcelがOLEリクエストを送信し、送信先がタイムアウト時間内に応答しない場合、Excelはサイレントにハングする代わりにこのダイアログを表示します。
主な原因:
- 対象アプリに保存プロンプト、エラーボックス、UAC昇格ダイアログなどのモーダルダイアログが開いており、メッセージループをブロックしている
- Excel内のCOMアドインがメッセージを横取りしている
- 既に応答しないアプリケーションへのDDEリンク(旧Officeのメカニズム)
- 外部プロセスからExcelを開いたり操作したりするVBA自動化コードで、COMオブジェクトが適切に解放されていない
- ハードウェアアクセラレーションによるレンダリングの問題がメッセージポンプをブロックしている
手順を追った修正方法
手順1:非表示のダイアログボックスを確認する
まずタスクバーを確認します。WordやPowerPointで開いたままのダイアログは、ExcelもふくめたOfficeスイート全体のCOM通信をブロックします。
Alt+Tabを押して、未解決のダイアログがあるOfficeウィンドウを探してください。承認または閉じてください。外部プロセスからExcelを自動化している場合は、そのプロセス側にも開いたままのプロンプトがないか確認してください。
手順2:COMアドインを無効にする
アドインがこの問題を引き起こすことはよくあります。セーフモードで起動すれば、アドインが原因かどうかをすぐに判断できます:
excel.exe /safe
Win+Rから実行します。セーフモードでエラーが出なければ、アドインが原因です。どれが問題かを特定するには:
- ファイル → オプション → アドインに移動する
- 下部の管理でCOMアドインを選択し、設定をクリックする
- すべてのアドインのチェックを外してOKをクリックする
- 一つずつ再度有効にし、それぞれの後でエラーを再現する
手順3:リンクファイルのDDEを無効にする
DDEはOfficeのアプリ間通信用の旧プロトコルです。ExcelがDDE経由でソースアプリへの接続を試みたとき、そのアプリが存在しないか応答しない場合、Excelは待機したままハングします。
ファイル → オプション → 詳細設定に移動し、全般までスクロールして、**「Dynamic Data Exchange (DDE)を使う他のアプリケーションを無視する」**にチェックを入れます。
これにより、ファイルを開く際にExcelがDDEリクエストを送信しなくなります。副作用として、エクスプローラーからExcelファイルをダブルクリックして開く通常の方法が機能しなくなり、Excel内からファイルを開く必要があります。
手順4:VBA自動化コードを修正する
PythonやC#、または別のOfficeアプリのVBAなど、外部からExcelを操作する自動化コードは、定期的にWindowsへ制御を戻す必要があります。COMの参照を長時間保持したまま制御を戻さないことが、OLEダイアログのトリガーになります。
悪いパターン — 処理中にExcelを占有し続ける:
' 外部VBAマクロ(Wordなど)からの例
Dim xl As Object
Set xl = CreateObject("Excel.Application")
xl.Workbooks.Open "C:\data\report.xlsx"
' ... 制御を戻さない長時間の処理 ...
xl.Quit
修正済みパターン — Excelを表示状態にし、定期的に制御を戻し、オブジェクトを適切に解放する:
Dim xl As Object
Dim wb As Object
Set xl = CreateObject("Excel.Application")
xl.Visible = True ' メッセージポンプをアクティブに保つ
xl.DisplayAlerts = False ' ブロッキングダイアログを抑制する
Set wb = xl.Workbooks.Open("C:\data\report.xlsx", UpdateLinks:=0)
' 重い処理の合間にWindowsのメッセージループへ制御を戻す
DoEvents
Application.Wait Now + TimeValue("00:00:02")
wb.Save
wb.Close False
' COMオブジェクトを明示的に解放する
Set wb = Nothing
xl.Quit
Set xl = Nothing
各変更の効果:
xl.Visible = True— 非表示のExcelは自身のメッセージポンプを停滞させます。表示状態にすることで応答性を維持します。UpdateLinks:=0— 「リンクを更新しますか?」ダイアログをスキップし、自動化の途中でブロックされるのを防ぎますDoEvents— 制御を返し、Windowsがキューに入ったメッセージを処理できるようにします- オブジェクトを
Nothingに設定 — COMの参照を解放し、ゴーストプロセスを残さずExcelを終了させます
手順5:Pythonから自動化している場合(win32com)
Pythonのwin32comではこのエラーが頻発します。原則は同じです:Excelを表示状態にし、finallyブロックで必ずCOMオブジェクトをクリーンアップしてください:
import win32com.client
import time
import pythoncom
pythoncom.CoInitialize()
try:
xl = win32com.client.Dispatch("Excel.Application")
xl.Visible = True # 重要:メッセージポンプを生かし続ける
xl.DisplayAlerts = False
wb = xl.Workbooks.Open(
r"C:\data\report.xlsx",
UpdateLinks=0
)
ws = wb.Sheets(1)
ws.Range("A1").Value = "Updated"
time.sleep(1) # Excelが処理する時間を確保する
wb.Save()
wb.Close(False)
xl.Quit()
finally:
del wb, ws, xl
pythoncom.CoUninitialize()
手順6:ハードウェアグラフィックスアクセラレーションを無効にする
あまり知られていませんが、RDPセッションや仮想マシンでは試す価値があります。ハードウェアアクセラレーションはこれらの環境でExcelのメッセージループを停滞させることがあります。
ファイル → オプション → 詳細設定に移動し、表示までスクロールして、**「ハードウェアのグラフィックアクセラレータを使用しない」**にチェックを入れます。Excelを再起動してテストしてください。
手順7:ハングしたバックグラウンドプロセスを終了する
以前のクラッシュによって、COMロックを保持した孤立したEXCEL.EXEが残っている場合があります。再起動前に終了させてください:
# PowerShell — すべてのExcelプロセスを終了する
Get-Process -Name EXCEL -ErrorAction SilentlyContinue | Stop-Process -Force
# その後、通常通りExcelを再起動する
修正の確認
- 手動でのトリガー:以前エラーが発生したファイルを開くか、自動化を実行します。ダイアログが表示されなければ修正成功です。
- 自動化スクリプト:スクリプトをエンドツーエンドで実行し、クリーンに終了することを確認します — タスクマネージャーに孤立した
EXCEL.EXEが残っていないことを確かめてください。 - タスクマネージャーの確認:自動化終了後、タスクマネージャー → 詳細タブを開きます。
EXCEL.EXEが残っている場合は、COMオブジェクトが適切に解放されていません — 手順4に戻ってください。
クイックリファレンス
- 別アプリに非表示のダイアログがある →
Alt+Tabで確認して閉じる - アドインの競合 →
excel.exe /safeで起動し、問題のアドインを特定する - DDEリンク → 詳細オプションでDDEを無効にする
- 自動化コード →
Visible = Trueに設定し、DoEventsを使用し、COMオブジェクトを解放する - レンダリングの問題 → ハードウェアグラフィックスアクセラレーションを無効にする
- ゾンビプロセス → PowerShellで終了し、再起動する
Visible = Trueの修正は、自動化シナリオの約80%でこの問題を解決します。スクリプトからではなく、インタラクティブなExcelでエラーが発生している場合は、アドインかDDEのパスがほぼ間違いなく原因です。

