Cómo controlar eventos para Excel mediante Visual Basic .NET

Resumen

En este artículo paso a paso se describe cómo controlar eventos de Microsoft Office Excel 2003 y Microsoft Office Excel 2007 desde un cliente de Automation que desarrolle mediante Visual Basic .NET.

Creación de un controlador de eventos

Puede crear un controlador de eventos con Microsoft Visual Basic .NET 2003 o con Visual Basic .NET 2002 de cualquiera de las siguientes maneras. La forma de crear un controlador de eventos con Visual Basic .NET depende de cómo quiera asociar el controlador de eventos a eventos:

  • Normalmente, se crea un controlador de eventos mediante la palabra clave Handles con la palabra clave WithEvents. Al declarar una variable mediante la palabra clave WithEvents, Visual Basic .NET se conecta automáticamente a los eventos de ese objeto en tiempo de ejecución. Para controlar un evento específico para ese objeto, agregue el controlador correspondiente mediante la lista Clase y la lista Método del entorno de Visual Studio .NET mientras se encuentra en la vista Código.
  • Con la palabra clave AddHandler, Visual Basic .NET proporciona una segunda manera de controlar eventos. La palabra clave AddHandler y la palabra clave RemoveHandler permiten iniciar y detener el control de eventos de un evento específico dinámicamente.

Creación del cliente de Automatización de .NET de Visual Basic

En los pasos siguientes se muestra cómo usar cualquier manera de controlar eventos de Excel desde un cliente de Automation que se desarrolla mediante Visual Basic .NET:

  1. Inicie Visual Studio .NET 2002 o Visual Studio .NET 2003. En el menú Archivo, haga clic en Nuevo y, a continuación, haga clic en Proyecto. En Proyectos de Visual Basic, seleccione Aplicación windows.

    De forma predeterminada, se crea Form1.

  2. Agregue una referencia a la biblioteca de objetos de Microsoft Excel. Para ello, siga estos pasos:

    1. On the Project menu, click Add Reference.
    2. En la pestaña COM , busque Biblioteca de objetos de Microsoft Excel 11.0 y haga clic en Seleccionar.
    3. Haga clic en Aceptar en el cuadro de diálogo Agregar referencias para aceptar las selecciones. Si recibe un mensaje para generar contenedores para las bibliotecas que seleccionó, haga clic en .
  3. En el menú Proyecto , seleccione Agregar módulo. En la lista de plantillas, seleccione Módulo y, a continuación, haga clic en Abrir. Pegue el código siguiente en el nuevo módulo:

       '==================================================================
       '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. Agregue otro módulo al proyecto y pegue el código siguiente en el módulo:

       '==================================================================
       '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. Agregue lo siguiente a la parte superior de Module1.vb y Module2.vb:

    Imports Microsoft.Office.Interop
    

    Nota El nombre exacto del espacio de nombres de Office puede diferir en función de la versión del ensamblado de interoperabilidad principal de Office (PIA) registrado en la caché global de ensamblados (GAC) cuando se agrega la referencia a la solución. Si recibe un mensaje de error de compilación en esta instrucción, compruebe el nombre tal como aparece en Explorador de soluciones (en Referencias) y, a continuación, cambie el nombre según corresponda.

  6. En Explorador de soluciones, haga doble clic en Form1.vb para mostrar el formulario en la vista Diseño.

  7. En el menú Ver , seleccione Cuadro de herramientas para mostrar el cuadro de herramientas y, a continuación, agregue dos botones a Form1. Cambie la propiedad Text de Button1 escribiendo Usar WithEvents. A continuación, cambie la propiedad Text de Button2 escribiendo Usar delegados.

  8. En el menú Ver , seleccione Código para mostrar la ventana Código del formulario. Agregue el código siguiente a los controladores de eventos Click para los botones:

    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
    

Comprobación del código

  1. Presione CTRL+ALT+O para mostrar la ventana Salida.

  2. Presione F5 para compilar y ejecutar el programa.

  3. En el formulario, haga clic en Usar conEvents.

    El programa inicia Excel y, a continuación, crea un libro con tres hojas de cálculo.

  4. Agregue datos a las celdas de una o varias hojas de cálculo. Presione la tecla ENTRAR después de cada cambio. Examine la ventana Salida de Visual Studio .NET para comprobar que se llama a los controladores de eventos.

  5. Salga de Excel.

  6. En el formulario, haga clic en Usar delegados.

    De nuevo, el programa inicia Excel y, a continuación, crea un libro con varias hojas de cálculo.

  7. Agregue datos a las celdas de una o varias hojas de cálculo. Presione la tecla ENTRAR después de cada cambio. Examine la ventana Salida de Visual Studio .NET para comprobar que se llama a los controladores de eventos.

  8. Salga de Excel y cierre el formulario para finalizar la sesión de depuración.

Solución de problemas

Al probar el código, puede recibir el siguiente mensaje de error:

Se produjo una excepción no controlada del tipo "System.InvalidCastException" en interop.excel.dll

Información adicional: No se admite dicha interfaz

Referencias

Para obtener información adicional sobre el desarrollo de Microsoft Office con Visual Studio .NET, visite el siguiente sitio web de Microsoft Developer Network (MSDN):

Desarrollo de Microsoft Office con Visual Studio

Para obtener información adicional sobre la automatización de Excel desde Visual Basic .NET, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:

302094 HOWTO: Automatizar Excel desde Visual Basic .NET para rellenar u obtener datos en un rango mediante matrices