Udostępnij za pośrednictwem


Jak obsługiwać zdarzenia dla programu Excel przy użyciu platformy .NET w języku Visual Basic

Podsumowanie

W tym artykule krok po kroku opisano sposób obsługi zdarzeń programu Microsoft Office Excel 2003 i Microsoft Office Excel 2007 z klienta usługi Automation opracowywanego przy użyciu programu Visual Basic .NET.

Tworzenie programu obsługi zdarzeń

Program obsługi zdarzeń można utworzyć za pomocą programu Microsoft Visual Basic .NET 2003 lub Visual Basic .NET 2002 w jeden z następujących sposobów. Sposób tworzenia programu obsługi zdarzeń za pomocą platformy .NET w języku Visual Basic zależy od tego, jak chcesz skojarzyć procedurę obsługi zdarzeń ze zdarzeniami:

  • Zazwyczaj program obsługi zdarzeń jest tworzone przy użyciu słowa kluczowego Handles ze słowem kluczowym WithEvents. W przypadku deklarowania zmiennej przy użyciu słowa kluczowego WithEvents program Visual Basic .NET automatycznie łączy się ze zdarzeniami tego obiektu w czasie wykonywania. Aby obsłużyć określone zdarzenie dla tego obiektu, dodaj odpowiedni program obsługi przy użyciu listy Klasy i listy Metody środowiska .NET programu Visual Studio, gdy jesteś w widoku kodu.
  • Za pomocą słowa kluczowego AddHandler platforma .NET w języku Visual Basic zapewnia drugi sposób obsługi zdarzeń. Słowo kluczowe AddHandler i słowo kluczowe RemoveHandler umożliwiają dynamiczne uruchamianie i zatrzymywanie obsługi zdarzeń dla określonego zdarzenia.

Tworzenie klienta programu .NET Automation w języku Visual Basic

W poniższych krokach pokazano, jak używać obu sposobów obsługi zdarzeń programu Excel z poziomu klienta usługi Automation opracowanego przy użyciu platformy .NET w języku Visual Basic:

  1. Uruchom program Visual Studio .NET 2002 lub Visual Studio .NET 2003. W menu Plik kliknij pozycję Nowy, a następnie kliknij pozycję Projekt. W obszarze Projekty Visual Basic wybierz pozycję Aplikacja systemu Windows.

    Domyślnie tworzony jest formularz Form1.

  2. Dodaj odwołanie do biblioteki obiektów programu Microsoft Excel. Aby to zrobić, wykonaj następujące kroki.

    1. W menu Projekt kliknij pozycję Dodaj odwołanie.
    2. Na karcie COM znajdź bibliotekę obiektów programu Microsoft Excel 11.0, a następnie kliknij pozycję Wybierz.
    3. Kliknij przycisk OK w oknie dialogowym Dodawanie odwołań , aby zaakceptować wybrane opcje. Jeśli zostanie wyświetlony monit o wygenerowanie otok dla wybranych bibliotek, kliknij przycisk Tak.
  3. W menu Project (Projekt ) wybierz pozycję Dodaj moduł. Na liście szablonów wybierz pozycję Moduł, a następnie kliknij pozycję Otwórz. Wklej następujący kod w nowym 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. Dodaj kolejny moduł do projektu, a następnie wklej następujący kod w 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. Dodaj następujące elementy na początku modułów Module1.vb i Module2.vb:

    Imports Microsoft.Office.Interop
    

    Uwaga Dokładna nazwa przestrzeni nazw pakietu Office może się różnić w zależności od wersji podstawowego zestawu międzyoperacyjnego (PIA) pakietu Office zarejestrowanego w globalnej pamięci podręcznej zestawów (GAC) po dodaniu odwołania do rozwiązania. Jeśli zostanie wyświetlony komunikat o błędzie kompilacji w tej instrukcji, sprawdź nazwę wyświetlaną w Eksplorator rozwiązań (w obszarze Odwołania), a następnie zmień nazwę odpowiednio.

  6. W Eksplorator rozwiązań kliknij dwukrotnie plik Form1.vb, aby wyświetlić formularz w widoku projektu.

  7. W menu Widok wybierz pozycję Przybornik , aby wyświetlić przybornik, a następnie dodaj dwa przyciski do formularza Form1. Zmień właściwość Text przycisku Button1, wpisując polecenie Użyj funkcji WithEvents. Następnie zmień właściwość Text przycisku Button2, wpisując polecenie Użyj delegatów.

  8. W menu Widok wybierz pozycję Kod , aby wyświetlić okno Kod formularza. Dodaj następujący kod do procedur obsługi zdarzeń Click dla przycisków:

    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
    

Testowanie kodu

  1. Naciśnij klawisze CTRL+ALT+O, aby wyświetlić okno Dane wyjściowe.

  2. Naciśnij klawisz F5, aby skompilować i uruchomić program.

  3. W formularzu kliknij pozycję Użyj funkcji WithEvents.

    Program uruchamia program Excel, a następnie tworzy skoroszyt z trzema arkuszami.

  4. Dodaj dowolne dane do komórek w co najmniej jednym arkuszu. Naciśnij klawisz ENTER po każdej zmianie. Sprawdź okno Dane wyjściowe w programie Visual Studio .NET, aby sprawdzić, czy są wywoływane programy obsługi zdarzeń.

  5. Zamknij program Excel.

  6. W formularzu kliknij pozycję Użyj delegatów.

    Ponownie program uruchamia program Excel, a następnie tworzy skoroszyt z wieloma arkuszami.

  7. Dodaj dowolne dane do komórek w co najmniej jednym arkuszu. Naciśnij klawisz ENTER po każdej zmianie. Sprawdź okno Dane wyjściowe w programie Visual Studio .NET, aby sprawdzić, czy są wywoływane programy obsługi zdarzeń.

  8. Zamknij program Excel, a następnie zamknij formularz, aby zakończyć sesję debugowania.

Rozwiązywanie problemów

Podczas testowania kodu może zostać wyświetlony następujący komunikat o błędzie:

W interop.excel.dllwystąpił nieobsługiwany wyjątek typu "System.InvalidCastException"

Dodatkowe informacje: Taki interfejs nie jest obsługiwany

Informacje

Aby uzyskać dodatkowe informacje na temat programowania pakietu Microsoft Office w programie Visual Studio .NET, odwiedź następującą witrynę sieci Web Microsoft Developer Network (MSDN):

Programowanie pakietu Microsoft Office przy użyciu programu Visual Studio

Aby uzyskać dodatkowe informacje na temat automatyzowania programu Excel z programu Visual Basic .NET, kliknij następujący numer artykułu, aby wyświetlić artykuł w bazie wiedzy Microsoft Knowledge Base:

302094 HOWTO: automatyzowanie programu Excel z platformy .NET w języku Visual Basic w celu wypełnienia lub uzyskania danych w zakresie przy użyciu tablic