Protected View を終了すると、WorkbookOpen イベントからオブジェクト モデルの呼び出しが失敗する場合があります
現象
以下のシナリオについて考えてみます。
WorkbookOpen
イベントをキャプチャし、このイベント ハンドラーからオブジェクト モデルを Excel に呼び出す Excel アドイン (VBA、COM、または VSTO) があります。保護されたビューでブックを開き (インターネットや電子メールの添付ファイルなどからブックを開いているため)、 [編集可能な編集] を選択します。
WorkbookOpen
イベント ハンドラーから行われている一部のオブジェクト モデル呼び出し (たとえば、Sheet.Activate
) は、ランタイム エラー 1004 - オブジェクトのメソッドが失敗して失敗しました。
原因
[編集可能な編集]をクリックすると保護されたビューから通常のビューにブックが切り替わります。 遷移中、保護されたビュー ブックが閉じられる前に 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