Partager via


Les appels de modèle objet peuvent échouer à partir de l’événement WorkbookOpen lors de la sortie de la vue protégée

Symptômes

Examinez le cas suivant :

  • Vous disposez d’un complément Excel (VBA, COM ou VSTO) qui capture l’événement WorkbookOpen et effectue des appels de modèle objet dans Excel à partir de ce gestionnaire d’événements.

  • Vous ouvrez un classeur en mode protégé (en raison de l’ouverture du classeur à partir d’Internet, de la pièce jointe par e-mail, etc.) et sélectionnez Activer la modification.

  • Certains appels de modèle objet (par exemple) Sheet.Activateeffectués à partir du WorkbookOpen gestionnaire d’événements échouent avec une erreur d’exécution 1004 - Échec de la méthode d’objet.

Cause

En cliquant sur Activer la modification , le classeur passe de l’affichage protégé à la vue normale. Lors de la transition, l’événement WorkbookOpen est déclenché avant la fermeture du classeur d’affichage protégé, ce qui entraîne un échec lors des appels de modèle objet.

Résolution

Vous pouvez contourner le problème en effectuant les opérations suivantes :

  • Si l’emplacement à partir duquel les classeurs sont ouverts est approuvé, ajoutez cet emplacement aux emplacements approuvés d’Excel.

  • Différer les appels du modèle objet vers l’extérieur de l’événement à WorkbookActivate l’événementWorkbookOpen.

État

Microsoft a confirmé qu’il s’agit d’un problème dans les produits Microsoft répertoriés dans la section « S’applique à ».

Plus d’informations

Voici un exemple de code VBA qui montre comment différer les appels de modèle objet à l’événement 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