Обработка событий для Excel с помощью Visual Basic .NET

Аннотация

В этой пошаговой статье описывается обработка событий Microsoft Office Excel 2003 и Microsoft Office Excel 2007 из клиента службы автоматизации, который разрабатывается с помощью Visual Basic .NET.

Создание обработчика событий

Обработчик событий можно создать с помощью Microsoft Visual Basic .NET 2003 или Visual Basic .NET 2002 одним из следующих способов. Способ создания обработчика событий с помощью .NET в Visual Basic зависит от того, как вы хотите связать обработчик событий с событиями:

  • Как правило, обработчик событий создается с помощью ключевого слова Handles с ключевым словом WithEvents. При объявлении переменной с помощью ключевого слова WithEvents visual Basic .NET автоматически подключается к событиям этого объекта во время выполнения. Чтобы обработать определенное событие для этого объекта, добавьте соответствующий обработчик с помощью списка классов и списка методов среды Visual Studio .NET во время работы в представлении кода.
  • С помощью ключевого слова AddHandler visual Basic .NET предоставляет второй способ обработки событий. Ключевое слово AddHandler и ключевое слово RemoveHandler позволяют запускать и останавливать обработку событий для определенного события динамически.

Создание клиента службы автоматизации Visual Basic .NET

Ниже показано, как использовать любой из способов обработки событий Excel из клиента службы автоматизации, разработанного с помощью Visual Basic .NET:

  1. Запустите Visual Studio .NET 2002 или Visual Studio .NET 2003. В меню Файл выберите команду Создать, а затем выберите Проект. В разделе "Проекты Visual Basic" выберите приложение Windows.

    По умолчанию создается Form1.

  2. Добавьте ссылку на библиотеку объектов Microsoft Excel. Для этого выполните следующие действия:

    1. On the Project menu, click Add Reference.
    2. На вкладке COM найдите библиотеку объектов Microsoft Excel 11.0 и нажмите кнопку "Выбрать".
    3. Нажмите кнопку " ОК" в диалоговом окне "Добавление ссылок", чтобы принять выбранные параметры. Если появится запрос на создание оболок для выбранных библиотек, нажмите кнопку "Да".
  3. В меню "Проект " выберите " Добавить модуль". В списке шаблонов выберите " Модуль" и нажмите кнопку " Открыть". Вставьте следующий код в новый модуль:

       '==================================================================
       '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. Добавьте в проект еще один модуль, а затем вставьте в него следующий код:

       '==================================================================
       '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. Добавьте следующий код в начало module1.vb и Module2.vb:

    Imports Microsoft.Office.Interop
    

    Примечание Точное имя пространства имен Office может отличаться в зависимости от версии основной сборки взаимодействия Office (PIA), зарегистрированной в глобальном кэше сборок (GAC) при добавлении ссылки в решение. Если в этой инструкции появляется сообщение об ошибке сборки, проверьте имя, которое отображается в Обозреватель решений (в разделе "Ссылки"), а затем измените имя соответствующим образом.

  6. В Обозреватель решений дважды щелкните Form1.vb, чтобы отобразить форму в режиме конструктора.

  7. В меню "Вид " выберите панель элементов , чтобы отобразить панель элементов, а затем добавьте две кнопки в Form1. Измените свойство Text объекта Button1, введя команду Use WithEvents. Затем измените свойство Text элемента Button2, введя команду "Использовать делегаты".

  8. В меню " Вид" выберите "Код" , чтобы отобразить окно "Код" для формы. Добавьте следующий код в обработчики событий Click для кнопок:

    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
    

Проверка кода

  1. Нажмите клавиши CTRL+ALT+O, чтобы отобразить окно вывода.

  2. Нажмите клавишу F5, чтобы выполнить сборку и запуск программы.

  3. В форме щелкните "Использовать WithEvents".

    Программа запускает Excel, а затем создает книгу с тремя листами.

  4. Добавьте любые данные в ячейки на одном или нескольких листах. После каждого изменения нажмите клавишу ВВОД. Проверьте окно вывода в Visual Studio .NET, чтобы проверить, вызываются ли обработчики событий.

  5. Закройте Excel.

  6. В форме нажмите кнопку "Использовать делегаты".

    Снова программа запускает Excel, а затем создает книгу с несколькими листами.

  7. Добавьте любые данные в ячейки на одном или нескольких листах. После каждого изменения нажмите клавишу ВВОД. Проверьте окно вывода в Visual Studio .NET, чтобы проверить, вызываются ли обработчики событий.

  8. Закройте Excel и закройте форму, чтобы завершить сеанс отладки.

Устранение неполадок

При проверке кода может появиться следующее сообщение об ошибке:

Необработанное исключение типа System.InvalidCastException возникло в interop.excel.dll

Дополнительные сведения: такой интерфейс не поддерживается

Ссылки

Дополнительные сведения о разработке Microsoft Office с помощью Visual Studio .NET см. на следующем веб-сайте Microsoft Developer Network (MSDN):

Разработка Microsoft Office с помощью Visual Studio

Чтобы получить дополнительные сведения об автоматизации Excel из Visual Basic .NET, щелкните следующий номер статьи, чтобы просмотреть статью в базе знаний Майкрософт:

302094 HOWTO: автоматизация Excel из Visual Basic .NET для заполнения или получения данных в диапазоне с помощью массивов