Behandeln von Ereignissen für Excel mithilfe von Visual Basic .NET

Zusammenfassung

In diesem schrittweisen Artikel wird beschrieben, wie Sie Microsoft Office Excel 2003- und Microsoft Office Excel 2007-Ereignisse von einem Automatisierungsclient behandeln, den Sie mithilfe von Visual Basic .NET entwickeln.

Erstellen eines Ereignishandlers

Sie können einen Ereignishandler mit Microsoft Visual Basic .NET 2003 oder mit Visual Basic .NET 2002 auf eine der folgenden Arten erstellen. Wie Sie einen Ereignishandler mit Visual Basic .NET erstellen, hängt davon ab, wie Sie den Ereignishandler Ereignissen zuordnen möchten:

  • In der Regel erstellen Sie einen Ereignishandler mithilfe des Handles-Schlüsselworts mit dem WithEvents-Schlüsselwort. Wenn Sie eine Variable mithilfe des WithEvents-Schlüsselworts deklarieren, stellt Visual Basic .NET zur Laufzeit automatisch eine Verbindung mit den Ereignissen dieses Objekts her. Um ein bestimmtes Ereignis für dieses Objekt zu behandeln, fügen Sie den entsprechenden Handler mithilfe der Klassenliste und der Methodenliste der .NET-Umgebung von Visual Studio hinzu, während Sie sich in der Codeansicht befinden.
  • Mit dem AddHandler-Schlüsselwort bietet Visual Basic .NET eine zweite Möglichkeit zum Behandeln von Ereignissen. Mit dem AddHandler-Schlüsselwort und dem RemoveHandler-Schlüsselwort können Sie die Ereignisbehandlung für ein bestimmtes Ereignis dynamisch starten und beenden.

Erstellen des Visual Basic .NET-Automatisierungsclients

Die folgenden Schritte veranschaulichen, wie Sie excel-Ereignisse über einen Automatisierungsclient, der mit Visual Basic .NET entwickelt wird, in beiden Fällen behandeln:

  1. Starten Sie Visual Studio .NET 2002 oder Visual Studio .NET 2003. Klicken Sie im Menü Datei auf Neu, und klicken Sie dann auf Projekt. Wählen Sie unter "Visual Basic-Projekte" die Option "Windows-Anwendung" aus.

    Standardmäßig wird Form1 erstellt.

  2. Fügen Sie einen Verweis auf die Microsoft Excel-Objektbibliothek hinzu. Gehen Sie dazu wie folgt vor:

    1. On the Project menu, click Add Reference.
    2. Suchen Sie auf der Registerkarte COM nach der Microsoft Excel 11.0-Objektbibliothek, und klicken Sie dann auf "Auswählen".
    3. Klicken Sie im Dialogfeld "Verweise hinzufügen" auf "OK", um Ihre Auswahl zu übernehmen. Wenn Sie aufgefordert werden, Wrapper für die ausgewählten Bibliotheken zu generieren, klicken Sie auf "Ja".
  3. Wählen Sie im Menü "Projekt " die Option "Modul hinzufügen" aus. Wählen Sie in der Liste der Vorlagen "Modul" aus, und klicken Sie dann auf "Öffnen". Fügen Sie den folgenden Code in das neue Modul ein:

       '==================================================================
       '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. Fügen Sie dem Projekt ein weiteres Modul hinzu, und fügen Sie dann den folgenden Code in das Modul ein:

       '==================================================================
       '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. Fügen Sie am Anfang von "Module1.vb" und "Module2.vb" Folgendes hinzu:

    Imports Microsoft.Office.Interop
    

    Hinweis Der genaue Name für den Office-Namespace kann je nach Version der primären Office-Interopassembly (PIA) variieren, die beim Hinzufügen des Verweises zur Lösung im globalen Assemblycache (GAC) registriert ist. Wenn Sie eine Buildfehlermeldung für diese Anweisung erhalten, überprüfen Sie den Namen, wie er in Projektmappen-Explorer (unter Verweise) angezeigt wird, und ändern Sie dann den Namen entsprechend.

  6. Doppelklicken Sie in Projektmappen-Explorer auf "Form1.vb", um das Formular in der Entwurfsansicht anzuzeigen.

  7. Wählen Sie im Menü "Ansicht " die Toolbox aus, um die Toolbox anzuzeigen, und fügen Sie formular1 zwei Schaltflächen hinzu. Ändern Sie die Text-Eigenschaft von Button1, indem Sie "Use WithEvents" eingeben. Ändern Sie dann die Text-Eigenschaft von Button2, indem Sie "Stellvertretungen verwenden" eingeben.

  8. Wählen Sie im Menü "Ansicht " die Option "Code " aus, um das Codefenster für das Formular anzuzeigen. Fügen Sie den Click-Ereignishandlern für die Schaltflächen den folgenden Code hinzu:

    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
    

Testen des Codes

  1. Drücken Sie STRG+ALT+O, um das Ausgabefenster anzuzeigen.

  2. Drücken Sie F5, um das Programm zu erstellen und auszuführen.

  3. Klicken Sie im Formular auf "WithEvents verwenden".

    Das Programm startet Excel und erstellt dann eine Arbeitsmappe mit drei Arbeitsblättern.

  4. Fügen Sie beliebige Daten zu Zellen auf einem oder mehreren Arbeitsblättern hinzu. Drücken Sie nach jeder Änderung die EINGABETASTE. Überprüfen Sie das Ausgabefenster in Visual Studio .NET, um zu überprüfen, ob die Ereignishandler aufgerufen werden.

  5. Beenden Sie Excel.

  6. Klicken Sie im Formular auf "Stellvertretungen verwenden".

    Auch hier startet das Programm Excel und erstellt dann eine Arbeitsmappe mit mehreren Arbeitsblättern.

  7. Fügen Sie beliebige Daten zu Zellen auf einem oder mehreren Arbeitsblättern hinzu. Drücken Sie nach jeder Änderung die EINGABETASTE. Überprüfen Sie das Ausgabefenster in Visual Studio .NET, um zu überprüfen, ob die Ereignishandler aufgerufen werden.

  8. Beenden Sie Excel, und schließen Sie dann das Formular, um die Debugsitzung zu beenden.

Problembehandlung

Beim Testen des Codes wird möglicherweise die folgende Fehlermeldung angezeigt:

Eine unbehandelte Ausnahme vom Typ 'System.InvalidCastException' ist in interop.excel.dll

Zusätzliche Informationen: Keine solche Schnittstelle unterstützt

References

Weitere Informationen zur Microsoft Office-Entwicklung mit Visual Studio .NET finden Sie auf der folgenden Microsoft Developer Network (MSDN)-Website:

Microsoft Office-Entwicklung mit Visual Studio

Weitere Informationen zum Automatisieren von Excel aus Visual Basic .NET erhalten Sie, indem Sie auf die folgende Artikelnummer klicken, um den Artikel in der Microsoft Knowledge Base anzuzeigen:

302094 HOWTO: Automatisieren von Excel aus Visual Basic .NET zum Ausfüllen oder Abrufen von Daten in einem Bereich mithilfe von Arrays