次の方法で共有


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