結束受保護的檢視時,物件模型呼叫可能會從 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
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應