Partager via


Comment gérer des événements pour Excel à l’aide de Visual Basic .NET

Résumé

Cet article pas à pas explique comment gérer les événements Microsoft Office Excel 2003 et Microsoft Office Excel 2007 à partir d’un client Automation que vous développez à l’aide de Visual Basic .NET.

Créer un gestionnaire d’événements

Vous pouvez créer un gestionnaire d’événements avec Microsoft Visual Basic .NET 2003 ou Visual Basic .NET 2002 de l’une des manières suivantes. La façon dont vous créez un gestionnaire d’événements avec Visual Basic .NET dépend de la façon dont vous souhaitez associer le gestionnaire d’événements aux événements :

  • En règle générale, vous créez un gestionnaire d’événements à l’aide du mot clé Handles avec le mot clé WithEvents. Lorsque vous déclarez une variable à l’aide du mot clé WithEvents, Visual Basic .NET se connecte automatiquement aux événements de cet objet au moment de l’exécution. Pour gérer un événement spécifique pour cet objet, ajoutez le gestionnaire approprié à l’aide de la liste de classes et de la liste de méthodes de l’environnement Visual Studio .NET lorsque vous êtes en mode Code.
  • Avec le mot clé AddHandler, Visual Basic .NET fournit une deuxième façon de gérer les événements. Le mot clé AddHandler et le mot clé RemoveHandler vous permettent de démarrer et d’arrêter dynamiquement la gestion des événements pour un événement spécifique.

Créer le client Visual Basic .NET Automation

Les étapes suivantes montrent comment utiliser les deux façons de gérer les événements Excel à partir d’un client Automation développé à l’aide de Visual Basic .NET :

  1. Démarrez Visual Studio .NET 2002 ou Visual Studio .NET 2003. Dans le menu Fichier, cliquez sur Nouveau, puis sur Projet. Sous Projets Visual Basic, sélectionnez Application Windows.

    Par défaut, Form1 est créé.

  2. Ajoutez une référence à la bibliothèque d’objets Microsoft Excel. Pour cela, procédez comme suit :

    1. Dans le menu Projet, cliquez sur Ajouter une référence.
    2. Sous l’onglet COM, recherchezla bibliothèque d’objets Microsoft Excel 11.0, puis cliquez sur Sélectionner.
    3. Cliquez sur OK dans la boîte de dialogue Ajouter des références pour accepter vos sélections. Si vous recevez une invite pour générer des wrappers pour les bibliothèques que vous avez sélectionnées, cliquez sur Oui.
  3. Dans le menu Projet , sélectionnez Ajouter un module. Dans la liste des modèles, sélectionnez Module, puis cliquez sur Ouvrir. Collez le code suivant dans le nouveau module :

       '==================================================================
       'Demonstrates Using a Delegate for Event Handling
       '==================================================================
    
    Private xlApp As Excel.Application
       Private xlBook As Excel.Workbook
       Private xlSheet1 As Excel.Worksheet
       Private xlSheet2 As Excel.Worksheet
       Private xlSheet3 As Excel.Worksheet
       Private EventDel_BeforeBookClose As Excel.AppEvents_WorkbookBeforeCloseEventHandler
       Private EventDel_CellsChange As Excel.DocEvents_ChangeEventHandler
    
    Public Sub UseDelegate()
          'Start Excel and then create a new workbook.
          xlApp = CreateObject("Excel.Application")
          xlBook = xlApp.Workbooks.Add()
          xlBook.Windows(1).Caption = "Uses WithEvents"
    
    'Get references to the three worksheets.
          xlSheet1 = xlBook.Worksheets.Item(1)
          xlSheet2 = xlBook.Worksheets.Item(2)
          xlSheet3 = xlBook.Worksheets.Item(3)
          CType(xlSheet1, Excel._Worksheet).Activate()
    
    'Add an event handler for the WorkbookBeforeClose event of the
          'Application object.
          EventDel_BeforeBookClose = New Excel.AppEvents_WorkbookBeforeCloseEventHandler( _
                AddressOf BeforeBookClose)
          AddHandler xlApp.WorkbookBeforeClose, EventDel_BeforeBookClose
    
    'Add an event handler for the Change event of both Worksheet 
          'objects.
          EventDel_CellsChange = New Excel.DocEvents_ChangeEventHandler( _
                AddressOf CellsChange)
          AddHandler xlSheet1.Change, EventDel_CellsChange
          AddHandler xlSheet2.Change, EventDel_CellsChange
          AddHandler xlSheet3.Change, EventDel_CellsChange
    
    'Make Excel visible and give the user control.
          xlApp.Visible = True
          xlApp.UserControl = True
       End Sub
    
    Private Sub CellsChange(ByVal Target As Excel.Range)
          'This is called when a cell or cells on a worksheet are changed.
          Debug.WriteLine("Delegate: You Changed Cells " + Target.Address + " on " + _
                            Target.Worksheet.Name())
       End Sub
    
    Private Sub BeforeBookClose(ByVal Wb As Excel.Workbook, ByRef Cancel As Boolean)
          'This is called when you choose to close the workbook in Excel.
          'The event handlers are removed and then the workbook is closed 
          'without saving changes.
          Debug.WriteLine("Delegate: Closing the workbook and removing event handlers.")
          RemoveHandler xlSheet1.Change, EventDel_CellsChange
          RemoveHandler xlSheet2.Change, EventDel_CellsChange
          RemoveHandler xlSheet3.Change, EventDel_CellsChange
          RemoveHandler xlApp.WorkbookBeforeClose, EventDel_BeforeBookClose
          Wb.Saved = True 'Set the dirty flag to true so there is no prompt to save.
       End Sub
    
  4. Ajoutez un autre module au projet, puis collez le code suivant dans le module :

       '==================================================================
       'Demonstrates Using WithEvents for Event Handling
       '==================================================================
    
    Private WithEvents xlApp As Excel.Application
       Private xlBook As Excel.Workbook
       Private WithEvents xlSheet1 As Excel.Worksheet
       Private WithEvents xlSheet2 As Excel.Worksheet
       Private WithEvents xlSheet3 As Excel.Worksheet
    
    Public Sub UseWithEvents()
          'Start Excel and then create a new workbook.
          xlApp = CreateObject("Excel.Application")
          xlBook = xlApp.Workbooks.Add()
          xlBook.Windows(1).Caption = "Uses WithEvents"
    
    'Get references to the three worksheets.
          xlSheet1 = xlBook.Worksheets.Item(1)
          xlSheet2 = xlBook.Worksheets.Item(2)
          xlSheet3 = xlBook.Worksheets.Item(3)
          CType(xlSheet1, Excel._Worksheet).Activate()
    
    'Make Excel visible and give the user control.
          xlApp.Visible = True
          xlApp.UserControl = True
       End Sub
    
    Private Sub xlApp_WorkbookBeforeClose(ByVal Wb As Excel.Workbook, _
         ByRef Cancel As Boolean) Handles xlApp.WorkbookBeforeClose
          Debug.WriteLine("WithEvents: Closing the workbook.")
          Wb.Saved = True 'Set the dirty flag to true so there is no prompt to save
       End Sub
    
    Private Sub xlSheet1_Change(ByVal Target As Excel.Range) Handles xlSheet1.Change
          Debug.WriteLine("WithEvents: You Changed Cells " + Target.Address + " on Sheet1")
       End Sub
    
    Private Sub xlSheet2_Change(ByVal Target As Excel.Range) Handles xlSheet2.Change
          Debug.WriteLine("WithEvents: You Changed Cells " + Target.Address + " on Sheet2")
       End Sub
    
    Private Sub xlSheet3_Change(ByVal Target As Excel.Range) Handles xlSheet3.Change
          Debug.WriteLine("WithEvents: You Changed Cells " + Target.Address + " on Sheet3")
       End Sub
    
  5. Ajoutez ce qui suit en haut de Module1.vb et Module2.vb :

    Imports Microsoft.Office.Interop
    

    Note Le nom exact de l’espace de noms Office peut différer en fonction de la version de l’assembly PIA (Primary Interop Assembly) Office inscrit dans le Global Assembly Cache (GAC) lorsque la référence est ajoutée à la solution. Si vous recevez un message d’erreur de génération sur cette instruction, vérifiez le nom tel qu’il apparaît dans Explorateur de solutions (sous Références), puis modifiez le nom comme il convient.

  6. Dans Explorateur de solutions, double-cliquez sur Form1.vb pour afficher le formulaire en mode Création.

  7. Dans le menu Affichage , sélectionnez Boîte à outils pour afficher la boîte à outils, puis ajoutez deux boutons à Form1. Modifiez la propriété Text de Button1 en tapant Use WithEvents. Modifiez ensuite la propriété Texte de Button2 en tapant Utiliser des délégués.

  8. Dans le menu Affichage , sélectionnez Code pour afficher la fenêtre Code du formulaire. Ajoutez le code suivant aux gestionnaires d’événements Click pour les boutons :

    Private Sub Button1_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles Button1.Click
            UseWithEvents()
        End Sub
    
    Private Sub Button2_Click(ByVal sender As System.Object, _
          ByVal e As System.EventArgs) Handles Button2.Click
            UseDelegate()
        End Sub
    

Test du code

  1. Appuyez sur Ctrl+Alt+O pour afficher la fenêtre Sortie.

  2. Appuyez sur F5 pour générer et exécuter le programme.

  3. Dans le formulaire, cliquez sur Utiliser WithEvents.

    Le programme démarre Excel, puis crée un classeur avec trois feuilles de calcul.

  4. Ajoutez des données à des cellules dans une ou plusieurs feuilles de calcul. Appuyez sur la touche Entrée après chaque modification. Examinez la fenêtre Sortie dans Visual Studio .NET pour vérifier que les gestionnaires d’événements sont appelés.

  5. Quittez Excel.

  6. Dans le formulaire, cliquez sur Utiliser les délégués.

    Là encore, le programme démarre Excel, puis crée un classeur avec plusieurs feuilles de calcul.

  7. Ajoutez des données à des cellules dans une ou plusieurs feuilles de calcul. Appuyez sur la touche Entrée après chaque modification. Examinez la fenêtre Sortie dans Visual Studio .NET pour vérifier que les gestionnaires d’événements sont appelés.

  8. Quittez Excel, puis fermez le formulaire pour mettre fin à la session de débogage.

Résolution des problèmes

Lorsque vous testez le code, vous pouvez recevoir le message d’erreur suivant :

Une exception non gérée de type « System.InvalidCastException » s’est produite dans interop.excel.dll

Informations supplémentaires : Aucune interface de ce type n’est prise en charge

References

Pour plus d’informations sur le développement Microsoft Office avec Visual Studio .NET, visitez le site web Microsoft Developer Network (MSDN) suivant :

Développement Microsoft Office avec Visual Studio

Pour plus d’informations sur l’automatisation d’Excel à partir de Visual Basic .NET, cliquez sur le numéro d’article suivant pour afficher l’article dans la Base de connaissances Microsoft :

302094 HOWTO : Automatiser Excel à partir de Visual Basic .NET pour remplir ou obtenir des données dans une plage à l’aide de tableaux