Lỗi Gặp Phải
Bạn đang làm việc trong Excel — mở file có liên kết ngoài, chạy macro VBA, hoặc kích hoạt tự động hóa từ ứng dụng khác — và đột nhiên Excel treo với hộp thoại sau:
Microsoft Excel is waiting for another application to complete an OLE action.
Nhấn OK sẽ tắt hộp thoại trong chốc lát, nhưng nó lại xuất hiện trở lại. Đôi khi Excel tự phục hồi sau 30 giây. Những lần khác nó bị khóa hoàn toàn và bạn phải buộc tắt tiến trình.
Nguyên Nhân
OLE (Object Linking and Embedding) là cơ chế Windows cho phép Excel giao tiếp với các ứng dụng khác — Word, PowerPoint, hệ thống ERP cũ, hoặc bất kỳ ứng dụng nào đã đăng ký COM. Khi Excel gửi yêu cầu OLE mà ứng dụng đích không phản hồi trong thời gian chờ cho phép, Excel hiển thị hộp thoại này thay vì treo im lặng.
Các nguyên nhân thường gặp:
- Ứng dụng đích đang có hộp thoại modal mở (hộp thoại lưu, hộp lỗi, hộp thoại nâng quyền UAC) đang chặn vòng lặp thông điệp của nó
- Một COM add-in trong Excel đang chặn thông điệp
- Liên kết DDE (cơ chế Office cũ hơn) tới ứng dụng không còn phản hồi DDE
- Mã VBA tự động hóa mở hoặc thao tác Excel từ tiến trình bên ngoài mà không giải phóng các đối tượng COM đúng cách
- Tăng tốc phần cứng gây ra sự cố hiển thị làm chặn bơm thông điệp
Cách Khắc Phục Từng Bước
Bước 1: Kiểm Tra Hộp Thoại Bị Ẩn
Bắt đầu từ thanh taskbar. Một hộp thoại đang mở trong Word hoặc PowerPoint sẽ chặn giao tiếp COM cho toàn bộ bộ Office — kể cả Excel.
Nhấn Alt+Tab và tìm bất kỳ cửa sổ Office nào có hộp thoại chưa được xử lý. Chấp nhận hoặc đóng nó. Nếu bạn đang tự động hóa Excel từ tiến trình bên ngoài, hãy đảm bảo tiến trình đó cũng không có lời nhắc nào đang chặn.
Bước 2: Vô Hiệu Hóa COM Add-ins
Add-ins thường là nguyên nhân gây ra lỗi này. Chế độ an toàn sẽ cho bạn biết ngay liệu có add-in nào là thủ phạm không:
excel.exe /safe
Chạy lệnh này từ Win+R. Nếu không có lỗi trong chế độ an toàn, một add-in chính là thủ phạm. Để tìm add-in nào:
- Vào File → Options → Add-ins
- Ở phía dưới, đặt Manage thành COM Add-ins, nhấn Go
- Bỏ chọn tất cả add-ins và nhấn OK
- Bật lại từng add-in một, tái hiện lỗi sau mỗi lần bật
Bước 3: Vô Hiệu Hóa DDE Cho File Được Liên Kết
DDE là giao thức Office cũ hơn dùng cho giao tiếp giữa các ứng dụng. Khi Excel cố liên lạc với ứng dụng nguồn qua DDE mà ứng dụng đó không còn hoặc không phản hồi, nó sẽ treo chờ đợi.
Vào File → Options → Advanced, cuộn xuống phần General, và chọn "Ignore other applications that use Dynamic Data Exchange (DDE)".
Điều này ngăn Excel gửi yêu cầu DDE khi mở file. Một tác dụng phụ: nhấp đôi vào file Excel trong Explorer sẽ không hoạt động theo cách thông thường — bạn sẽ cần mở file từ bên trong Excel.
Bước 4: Sửa Mã VBA Tự Động Hóa
Mã tự động hóa điều khiển Excel từ bên ngoài — Python, C#, hoặc VBA trong một ứng dụng Office khác — cần nhường quyền điều khiển lại cho Windows định kỳ. Giữ các tham chiếu COM mở quá lâu mà không nhường quyền chính là nguyên nhân kích hoạt hộp thoại OLE.
Mẫu sai — giữ Excel bận trong khi thực hiện công việc:
' From an external VBA macro (e.g., in Word)
Dim xl As Object
Set xl = CreateObject("Excel.Application")
xl.Workbooks.Open "C:\data\report.xlsx"
' ... long-running operations without yielding ...
xl.Quit
Mẫu đúng — làm Excel hiển thị, nhường quyền thường xuyên, giải phóng đối tượng đúng cách:
Dim xl As Object
Dim wb As Object
Set xl = CreateObject("Excel.Application")
xl.Visible = True ' Keeps the message pump active
xl.DisplayAlerts = False ' Suppresses blocking dialogs
Set wb = xl.Workbooks.Open("C:\data\report.xlsx", UpdateLinks:=0)
' Yield to Windows message loop between heavy operations
DoEvents
Application.Wait Now + TimeValue("00:00:02")
wb.Save
wb.Close False
' Release COM objects explicitly
Set wb = Nothing
xl.Quit
Set xl = Nothing
Ý nghĩa của từng thay đổi:
xl.Visible = True— Excel ẩn sẽ làm trì trệ bơm thông điệp của chính nó. Làm nó hiển thị giữ cho nó phản hồi.UpdateLinks:=0— bỏ qua hộp thoại "cập nhật liên kết?", vốn sẽ chặn quá trình tự động hóa giữa chừngDoEvents— nhường quyền điều khiển để Windows có thể xử lý các thông điệp đang chờ- Đặt các đối tượng thành
Nothing— giải phóng tham chiếu COM để Excel thoát mà không để lại tiến trình ẩn
Bước 5: Nếu Tự Động Hóa Từ Python (win32com)
win32com của Python thường gặp lỗi này. Nguyên tắc tương tự: giữ Excel hiển thị và luôn dọn dẹp các đối tượng COM trong khối finally:
import win32com.client
import time
import pythoncom
pythoncom.CoInitialize()
try:
xl = win32com.client.Dispatch("Excel.Application")
xl.Visible = True # Critical: keeps message pump alive
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) # Give Excel time to process
wb.Save()
wb.Close(False)
xl.Quit()
finally:
del wb, ws, xl
pythoncom.CoUninitialize()
Bước 6: Vô Hiệu Hóa Tăng Tốc Đồ Họa Phần Cứng
Ít rõ ràng hơn, nhưng đáng thử trên các phiên RDP và máy ảo. Tăng tốc phần cứng có thể làm trì trệ vòng lặp thông điệp của Excel trong các môi trường này.
Vào File → Options → Advanced, cuộn xuống phần Display, và chọn "Disable hardware graphics acceleration". Khởi động lại Excel và kiểm tra.
Bước 7: Kết Thúc Các Tiến Trình Nền Bị Treo
Một lần crash trước đó đôi khi để lại EXCEL.EXE mồ côi đang giữ khóa COM. Hãy kết thúc nó trước khi khởi động lại:
# PowerShell — kill all Excel processes
Get-Process -Name EXCEL -ErrorAction SilentlyContinue | Stop-Process -Force
# Then relaunch Excel normally
Kiểm Tra Sau Khi Sửa
- Kích hoạt thủ công: Mở file hoặc chạy tự động hóa đã gây ra lỗi trước đây. Không có hộp thoại nghĩa là cách sửa đã có hiệu quả.
- Script tự động hóa: Chạy script từ đầu đến cuối và xác nhận nó thoát gọn gàng — không có
EXCEL.EXEmồ côi trong Task Manager sau đó. - Kiểm tra Task Manager: Sau khi tự động hóa hoàn tất, mở Task Manager → tab Details. Nếu thấy
EXCEL.EXEcòn tồn tại nghĩa là các đối tượng COM chưa được giải phóng đúng cách — quay lại Bước 4.
Tham Khảo Nhanh
- Hộp thoại ẩn trong ứng dụng khác →
Alt+Tab, đóng nó lại - Xung đột add-in → khởi động
excel.exe /safe, tìm add-in lỗi - Liên kết DDE → tắt DDE trong Advanced Options
- Mã tự động hóa → đặt
Visible = True, dùngDoEvents, giải phóng đối tượng COM - Sự cố hiển thị → vô hiệu hóa tăng tốc đồ họa phần cứng
- Tiến trình ẩn → kết thúc bằng PowerShell, khởi động lại
Cách sửa Visible = True giải quyết được khoảng 80% các tình huống tự động hóa. Nếu bạn gặp lỗi trong Excel khi dùng thủ công chứ không phải từ script? Add-in hoặc đường dẫn DDE hầu như luôn là câu trả lời.

