你有一个 Excel 加载项 (VBA、COM 或 VSTO) ,用于捕获
WorkbookOpen
事件并从此事件处理程序将对象模型调用到 Excel。
在受保护的视图 (中打开工作簿,因为从 Internet 打开工作簿、电子邮件附件等) 并选择
“启用编辑
”。
某些对象模型调用 (例如,从
WorkbookOpen
事件处理程序进行的 Sheet.Activate) 失败,运行时错误 1004 - 对象方法失败。
单击
“启用编辑”
可将工作簿从受保护的视图转换为普通视图。 在转换时,
WorkbookOpen
在保护视图工作簿关闭之前触发事件,导致对象模型调用失败。
可以通过以下任一方式解决此问题:
如果工作簿的打开位置受信任,请将该位置添加到 Excel 的受信任位置。
将对象模型调用延迟到事件外部
WorkbookOpen
的事件
WorkbookActivate
。
Microsoft 已经确认这是一个列于“适用范围”部分的 Microsoft 产品问题。
下面是一个示例 VBA 代码,演示如何推迟对事件的
WorkbookActivate
对象模型调用。
Option Explicit
Public WithEvents oApp As Excel.Application
Private bDeferredOpen As Boolean
Private Sub oApp_WorkbookActivate(ByVal Wb As Workbook)
If bDeferredOpen
Then bDeferredOpen = False Call WorkbookOpenHandler(Wb)
End If End Sub
Private Sub oApp_WorkbookOpen(ByVal Wb As Workbook)
Dim oProtectedViewWindow As ProtectedViewWindow On Error Resume Next 'The below line will throw error (Subscript out of range)
if the workbook is not opened in protected view.
Set oProtectedViewWindow = oApp.ProtectedViewWindows.Item(Wb.Name) On Error GoTo 0 'Reset error handling
If oProtectedViewWindow Is Nothing
Then bDeferredOpen = False Call WorkbookOpenHandler(Wb)
Else 'Delay open actions till the workbook gets activated. bDeferredOpen = True
End If End Sub
Private Sub WorkbookOpenHandler(ByVal Wb As Workbook)'The actual workbook open event handler code goes here...
End Sub