退出受保护的视图时,对象模型调用可能会从 WorkbookOpen 事件失败

现象

假设出现了下面这种情景:

  • 你有一个 Excel 加载项(VBA、COM 或 VSTO),用于捕获 WorkbookOpen 事件并从此事件处理程序向 Excel 发出对象模型调用。

  • 在受保护的视图中打开工作簿(由于从 Internet 打开工作簿、电子邮件附件等),然后选择“ 启用编辑”。

  • WorkbookOpen事件处理程序进行的一些对象模型调用失败,Sheet.Activate运行时错误 1004 - 对象方法失败。

原因

单击“启用编辑”会将工作簿从受保护的视图转换为普通视图。 转换时,在 WorkbookOpen 关闭受保护的视图工作簿之前触发该事件,从而导致对象模型调用失败。

解决方法

可以通过以下任一方法解决此问题:

  • 如果打开工作簿的位置受信任,请将该位置添加到 Excel 的受信任位置。

  • 将对象模型调用延迟到WorkbookActivate事件外部WorkbookOpen

Status

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