共用方式為


結束受保護的檢視時,物件模型呼叫可能會從 WorkbookOpen 事件失敗

徵狀

請試想下列案例:

  • 您有一個 Excel 載入宏 (VBA、COM 或 VSTO) ,可擷取 WorkbookOpen 事件,並從此事件處理程式對 Excel 進行物件模型呼叫。

  • 您在受保護的檢視 (中開啟活頁簿,因為從因特網開啟活頁簿、電子郵件附件等 ) ,然後選取 [ 啟用編輯]

  • 有些物件模型呼叫 (例如,從 WorkbookOpen 事件處理程式進行的 Sheet.Activate) 失敗,並出現運行時錯誤 1004 - Object 的方法失敗。

原因

按兩下 [ 啟用編輯] 會將活頁簿從受保護的檢視轉換為一般檢視。 轉換時,會在 WorkbookOpen 關閉保護檢視活頁簿之前引發事件,導致物件模型呼叫失敗。

解決方案

您可以透過下列其中一種方式來解決此問題:

  • 如果活頁簿開啟所在的位置是受信任的,請將該位置新增至 Excel 的 [信任的位置]。

  • 將物件模型對事件外部的 WorkbookOpen 呼叫延遲為 WorkbookActivate 事件。

狀態

Microsoft 已確認<適用於>一節所列的 Microsoft 產品確實有上述問題。

其他相關資訊

以下是示範如何延遲物件模型呼叫事件的 WorkbookActivate 範例 VBA 程序代碼。

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