Resumen

Al automatizar un producto Office desde Visual Basic, puede ser útil mover parte del código a un módulo de Microsoft Visual Basic para Aplicaciones (VBA) que puede ejecutarse dentro del espacio de proceso del servidor. Esto puede aumentar la velocidad de ejecución general de la aplicación y ayudar a solucionar problemas si el servidor solo realiza una acción cuando se realiza una llamada en proceso.

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

Más información

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

El ejemplo usa un archivo de texto estático para el módulo de código que se inserta en Excel. Es posible que desee mover el código a un archivo de recursos que puede compilar en la aplicación y, a continuación, extraerlo en un archivo temporal cuando sea necesario en tiempo de ejecución. Esto haría que el proyecto sea más manejable para su re-distribución.

A partir Microsoft Office XP, un usuario debe conceder acceso al modelo de objetos de VBA antes de que funcione cualquier código de automatización escrito para manipular VBA. Esta es una nueva característica de seguridad con Office XP. Para obtener más información, consulte el siguiente artículo de knowledge base:

282830 Se deniega el acceso Office programación a Project VBA de XP

Pasos para crear el ejemplo

  1. En primer lugar, cree un nuevo archivo de texto denominado KbTest.bas (sin la .txt de texto). Este es el módulo de código que insertaremos 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. Formulario1 se crea de forma predeterminada.

  5. En el menú Project, haga clic enReferences y, a continuación, seleccione la versión de biblioteca de tipos adecuada que le permite usar el enlace anticipado para Excel.

    Por ejemplo, seleccione una de las siguientes opciones:

    • Para Microsoft Office Excel 2007, seleccione la biblioteca 12.0.

    • Para Microsoft Office Excel 2003, seleccione la biblioteca 11.0.

    • Para Microsoft Excel 2002, seleccione la biblioteca 10.0.

    • Para 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 del 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 para versiones posteriores de Excel, debe activar el acceso al proyecto vba. Para ello, utilice uno de los métodos siguientes:

    • En Excel 2007, haga clic en el botón Microsoft Office y, a continuación, haga clic en Excel opciones. Haga clic en Centro de confianza y, a continuación, haga clic en Centro de Configuración. Haga clic en Configuración macro, haga clic para activar la casilla Confiar en el modelo de objetos de proyecto de VBA y, a continuación, haga clic en Aceptar dos veces.

    • En Excel 2003 y en versiones anteriores de Excel, seleccione Macro en el menú Herramientas y, a continuación, haga clic en Seguridad. En el cuadro de diálogo Seguridad, haga clic en la pestaña Orígenes de confianza y, a continuación, haga clic para activar la casilla Confiar en Visual Basic Project confianza.

  8. Ejecute el Visual Basic proyecto.

Referencias

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

http://support.microsoft.com/ofd

¿Necesita más ayuda?

Ampliar sus conocimientos
Explorar los cursos
Obtener nuevas características primero
Unirse a Microsoft Insider

¿Le ha sido útil esta información?

¿Cuál es tu grado de satisfacción con la calidad del lenguaje?
¿Qué ha afectado a tu experiencia?

¡Gracias por sus comentarios!

×