L'automatisation Excel échoue à la deuxième exécution du code


Cet article peut contenir des liens vers des informations en langue anglaise (pas encore traduites).

Symptômes


Lorsque vous exécutez un code qui utilise Automation pour contrôler Microsoft Excel, l'une des erreurs suivantes peut se produire :

Dans Microsoft Excel 97 et les versions ultérieures d'Excel, vous recevez l'un des messages d'erreur suivants :
Message d'erreur 1
Erreur d'exécution '1004' :
La méthode '<nom_méthode>' de l'objet '_Global' a échoué
Message d'erreur 2
Erreur définie par l'application ou par l'objet
Dans Microsoft Excel 95, l'un des messages d'erreur suivants s'affiche :
Message d'erreur 1
Erreur d'exécution '-2147023174'
Erreur Automation OLE
Message d'erreur 2
Erreur d'exécution '462' :
Le serveur distant n'existe pas ou n'est pas disponible.

Cause


Visual Basic a défini une référence à Excel en raison d'une ligne de code qui appelle un objet, une méthode ou une propriété Excel sans qualifier cet élément avec une variable objet Excel. Visual Basic ne libère pas cette référence tant que vous ne quittez pas le programme. Cette référence dévoyée interfère avec un code Automation si le code est exécuté plusieurs fois.

Résolution


Pour résoudre ce problème, modifiez le code de sorte que chaque appel à un objet, une méthode ou une propriété Excel soit qualifié avec la variable objet appropriée.

Statut


Ce comportement est inhérent au produit.

Plus d'informations


Pour automatiser Microsoft Excel, vous définissez une variable objet qui fait habituellement référence à l'objet application Excel ou classeur Excel. Vous pouvez ensuite définir d'autres variables objet faisant référence à un objet classeur, plage ou d'autres objets du modèle d'objets de Microsoft Excel. Lorsque vous rédigez un code en vue d'utiliser un objet, une méthode ou une propriété Excel, vous devez toujours faire précéder l'appel par la variable objet appropriée. Dans le cas contraire, Visual Basic définira sa propre référence à Excel. Celle-ci peut provoquer des problèmes lorsque vous essayez d'exécuter le code d'automation à plusieurs reprises. Notez que même si la ligne de code commence par la variable objet, un appel peut être effectué à un objet, une méthode ou une propriété Excel au milieu de la ligne de code sans être précédé d'une variable objet.

Les étapes suivantes expliquent comment reproduire ce problème et le corriger.

Procédure pour reproduire le problème

  1. Démarrez un nouveau projet EXE standard dans Visual Basic. Form1 est créé par défaut.
  2. Dans le menu Projet, cliquez sur Références, puis recherchez la version d'Excel que vous souhaitez automatiser dans la Bibliothèque d'objets.
  3. Placez un contrôle Bouton de commande sur Form1.
  4. Copiez l'exemple de code ci-dessous dans la fenêtre de code de Form1.
          Option Explicit

    Private Sub Command1_Click()
    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Add
    Set xlSheet = xlBook.Worksheets("Sheet1")
    xlSheet.Range(Cells(1, 1), Cells(10, 2)).Value = "Hello"
    xlBook.Saved = True
    Set xlSheet = Nothing
    Set xlBook = Nothing
    xlApp.Quit
    Set xlApp = Nothing
    End Sub
  5. Dans le menu Exécuter, cliquez sur Démarrer ou appuyez sur F5 pour démarrer le programme.
  6. Cliquez sur le contrôle Bouton de commande. Aucune erreur ne se produit. Toutefois, une référence à Excel a été créée et n'a pas été libérée.
  7. Cliquez sur le contrôle Bouton de commande à nouveau. Notez que l'un des messages d'erreur mentionnés dans la section « Symptômes » de cet article s'affiche.

    Remarque Le message d'erreur se produit parce que le code fait référence à la méthode de la cellule sans faire précéder l'appel par la variable objet xlSheet.
  8. Arrêtez le projet et modifiez la ligne de code suivante :
    xlSheet.Range(Cells(1,1),Cells(10,2)).Value = "Hello"
    de façon à ressembler à la ligne suivante :
    xlSheet.Range(xlSheet.Cells(1,1),xlSheet.Cells(10,2)).Value = "Hello"
  9. Exécutez à nouveau le programme. Notez que vous pouvez désormais exécuter le code plusieurs fois sans qu'un message d'erreur s'affiche.

Références


Pour plus d'informations, cliquez sur les numéros ci-dessous pour afficher les articles correspondants de la Base de connaissances Microsoft.

167223 Le fichier d'Aide sur Microsoft Office 97 Automation est disponible

189618 Le message d'erreur « Erreur d'exécution '-2147023174' (800706ba) » ou « Erreur d'exécution '462' » s'affiche lorsque vous exécutez le code Visual Basic qui utilise l'automation pour contrôler Word