Cómo agregar dinámicamente y ejecutar una macro VBA desde Visual Basic

Se aplica a: Microsoft Office Excel 2007Microsoft Office Professional Edition 2003Microsoft Office Excel 2003

Resumen


Al automatizar un producto de Office desde Visual Basic, puede ser útil mover la parte de código en Microsoft Visual Basic para Aplicaciones en un módulo (VBA) que se puede ejecutar en el espacio de proceso del servidor. Esto puede aumentar la velocidad de ejecución total de la aplicación y ayudar a aliviar los problemas si el servidor sólo lleva a cabo una acción cuando se realiza una llamada en curso.

En este artículo se muestra cómo agregar dinámicamente un módulo de VBA a una aplicación de Office en ejecución desde Visual Basic y, a continuación, llamar a la macro para rellenar un hoja de cálculo en proceso.

Más información


En el ejemplo siguiente muestra cómo insertar un módulo de código en Microsoft Excel, pero puede utilizar la misma técnica para Word y PowerPoint porque ambos incorporan el mismo motor VBA.

El ejemplo utiliza un archivo de texto estático para el módulo de código que se inserta en Excel. Es aconsejable tener en cuenta al cambiar el código en un archivo de recursos que puede compilar en la aplicación y, a continuación, extraer en un archivo temporal cuando sea necesario en tiempo de ejecución. Esto haría que el proyecto resulte más fácil de redistribución.

A partir de Microsoft Office XP, un usuario debe conceder acceso al modelo de objetos VBA para que funcione cualquier código de automatización escrito para manipular VBA. Se trata de una nueva característica de seguridad de Office XP. Para obtener más información, consulte el siguiente artículo de Knowledge base:
282830 se ha denegado el acceso mediante programación al proyecto de VBA de Office XP

Pasos para generar el ejemplo

  1. Primero, cree un nuevo archivo de texto llamado KbTest.bas (sin la extensión .txt). Este es el módulo de código que se insertará en Excel en tiempo de ejecución.
  2. En el archivo de texto, agregue las siguientes líneas de código:
       Attribute VB_Name = "KbTest"

    ' Your Microsoft Visual Basic for Applications macro function takes 1
    ' parameter, the sheet object that you are going to fill.

    Public Sub DoKbTest(oSheetToFill As Object)
    Dim i As Integer, j As Integer
    Dim sMsg As String
    For i = 1 To 100
    For j = 1 To 10

    sMsg = "Cell(" & Str(i) & "," & Str(j) & ")"
    oSheetToFill.Cells(i, j).Value = sMsg
    Next j
    Next i
    End Sub
  3. Guarde el archivo de texto en el directorio C:\KbTest.bas y cierre el archivo.
  4. Inicie Visual Basic y cree un proyecto estándar. Se creará Form1 de forma predeterminada.
  5. En el menú proyecto , haga clic enreferenciasy, a continuación, seleccione la versión de la biblioteca de tipo adecuado que permite utilizar el enlace anticipado a Excel.

    Por ejemplo, seleccione uno de los siguientes:
    • Para Microsoft Office Excel 2007, seleccione la biblioteca 12.0.
    • En Microsoft Office Excel 2003, seleccione la biblioteca 11.0.
    • Para Microsoft Excel 2002, seleccione la biblioteca 10.0.
    • En Microsoft Excel 2000, seleccione la biblioteca 9.0.
    • Para Microsoft Excel 97, seleccione la biblioteca 8.0.
  6. Agregue un botón a Form1 y coloque el código siguiente en el controlador para el evento Click del botón:
       Private Sub Command1_Click()
    Dim oXL As Excel.Application
    Dim oBook As Excel.Workbook
    Dim oSheet As Excel.Worksheet
    Dim i As Integer, j As Integer
    Dim sMsg As String

    ' Create a new instance of Excel and make it visible.
    Set oXL = CreateObject("Excel.Application")
    oXL.Visible = True

    ' Add a new workbook and set a reference to Sheet1.
    Set oBook = oXL.Workbooks.Add
    Set oSheet = oBook.Sheets(1)

    ' Demo standard Automation from out-of-process,
    ' this routine simply fills in values of cells.
    sMsg = "Fill the sheet from out-of-process"
    MsgBox sMsg, vbInformation Or vbMsgBoxSetForeground

    For i = 1 To 100
    For j = 1 To 10
    sMsg = "Cell(" & Str(i) & "," & Str(j) & ")"
    oSheet.Cells(i, j).Value = sMsg
    Next j
    Next i

    ' You're done with the first test, now switch sheets
    ' and run the same routine via an inserted Microsoft Visual Basic
    ' for Applications macro.
    MsgBox "Done.", vbMsgBoxSetForeground
    Set oSheet = oBook.Sheets.Add
    oSheet.Activate

    sMsg = "Fill the sheet from in-process"
    MsgBox sMsg, vbInformation Or vbMsgBoxSetForeground

    ' The Import method lets you add modules to VBA at
    ' run time. Change the file path to match the location
    ' of the text file you created in step 3.
    oXL.VBE.ActiveVBProject.VBComponents.Import "C:\KbTest.bas"

    ' Now run the macro, passing oSheet as the first parameter
    oXL.Run "DoKbTest", oSheet

    ' You're done with the second test
    MsgBox "Done.", vbMsgBoxSetForeground

    ' Turn instance of Excel over to end user and release
    ' any outstanding object references.
    oXL.UserControl = True
    Set oSheet = Nothing
    Set oBook = Nothing
    Set oXL = Nothing

    End Sub
  7. Para Excel 2002 y versiones posteriores de Excel, debe activar acceso el proyecto de VBA. Para ello, utilice uno de los métodos siguientes:
    • En Excel 2007, haga clic en el Botón de Microsoft Officey, a continuación, haga clic en Opciones de Excel. Haga clic en Centro de confianzay, a continuación, haga clic en Configuración del centro de confianza. Haga clic en Configuración de macros, haga clic para activar la casilla de verificación Confiar en el acceso al modelo de objetos de proyectos VBA y, a continuación, haga clic en Aceptar dos veces.
    • En Excel 2003 y en versiones anteriores de Excel, elija Macro en el menú Herramientas y, a continuación, haga clic en seguridad. En el cuadro de diálogo seguridad , haga clic en la ficha Fuentes de confianza y, a continuación, haga clic para activar la casilla de verificación Confiar en el acceso al proyecto de Visual Basic .
  8. Ejecute el proyecto de Visual Basic.

Referencias


Para obtener más información sobre la automatización de Office desde Visual Basic, consulte el sitio de soporte de desarrollo de Office en la siguiente dirección: