Uso de un servicio web XML mediante ASP.NET desde una macro vba de Office en Word o Excel

Resumen

En este artículo se muestra cómo usar un servicio web XML mediante ASP.NET de una macro de Visual Basic para Aplicaciones (VBA) en Word o Excel.

Más información

Para comunicarse correctamente con un servicio web XML mediante ASP.NET desde una macro de Office, el kit de herramientas SOAP debe instalarse en el equipo cliente en el que se ejecuta la macro. En consecuencia, el kit de herramientas SOAP es necesario para la demostración de este artículo. Para obtener más información sobre soap toolkit, incluidas las instrucciones de descarga.

Cree el servicio web XML mediante ASP.NET

  1. Inicie Microsoft Visual Studio .NET. En el menú Archivo, haga clic en Nuevo y, a continuación, haga clic en Proyecto. En el cuadro de diálogo Nuevo proyecto, haga clic en Proyectos de Visual Basic en Tipos de proyecto y, a continuación, haga clic en Servicio web XML mediante ASP.NET en Plantillas. Asigne al proyecto el nombre SQLQuery y haga clic en Aceptar. El formulario de diseño de Service1 aparece de forma predeterminada.

  2. En el menú Ver, haga clic en Código para mostrar la ventana de código de Service1.

  3. Pegue el código siguiente en la parte superior de la ventana de código:

    Imports System.Data.SqlClient
    
  4. Pegue el código siguiente en la clase Service1 (justo antes de la clase End).

    Nota Debe cambiar el nombre de usuario> de id<. de usuario y la contraseña =<contraseña> segura a los valores correctos antes de ejecutar este código. Asegúrese de que id. de usuario tiene los permisos adecuados para realizar esta operación en la base de datos.

    Private Const strConn = "User ID=<username>;Password=<strong password>;Initial Catalog=pubs;Data Source=localhost"
    
    <WebMethod()> Public Function GetIDs() As String()
        Dim i As Integer
    
    ' Create an open connection.
        Dim oConn As New SqlConnection(strConn)
        oConn.Open()
    
    Dim oDataset As New System.Data.DataSet()
        ' Execute the query.
        Dim oAdapter As New SqlDataAdapter("SELECT au_id FROM authors", oConn)
        ' Fill the dataset.
        oAdapter.Fill(oDataset)
    
    Dim s(oDataset.Tables(0).Rows.Count - 1) As String
        ' Create an array of IDs.
        For i = 0 To oDataset.Tables(0).Rows.Count - 1
            s(i) = oDataset.Tables(0).Rows(i).ItemArray.GetValue(0)
        Next i
        ' Return the array.
        Return s
    End Function
    
    <WebMethod()> Public Function QueryDatabase(ByVal sID As String) As String()
        Dim i As Integer
    
    ' Create an open a connection.
        Dim oConn As New SqlConnection(strConn)
        oConn.Open()
    
    Dim oCommand As New SqlCommand("SELECT * FROM authors WHERE au_id='" + sID + "'", oConn)
        Dim oReader As SqlDataReader
        ' Execute the query and assign results to a SqlDataReader.
        oReader = oCommand.ExecuteReader()
        oReader.Read()
    
    Dim s(7) As String
        ' Build an array of results.
        For i = 0 To 7
            s(i) = CType(oReader.GetValue(i), String)
        Next
        ' Return the array.
        Return s
    End Function
    
    

Nota:

Modifique la constante strConn en el código para que sea una cadena de conexión válida para la base de datos SQL Server pubs.

Prueba del servicio web

  1. Presione F5 para compilar y ejecutar la solución de servicio web. Al ejecutar el servicio web desde el entorno de desarrollo integrado (IDE) de .NET, Microsoft Internet Explorer carga Service1.asmx desde la solución.

  2. Pruebe el método GetIDs. Para ello, haga clic en el hipervínculo GetIDs y, a continuación, haga clic en Invocar.

    El método devuelve una lista de identificadores de autor que el servicio web extrajo de la base de datos pubs. Los resultados se muestran en el explorador como XML.

  3. Cierre la ventana o ventanas del explorador y vuelva a Visual Studio.

  4. Presione F5 de nuevo para ejecutar el servicio web.

  5. Pruebe el método QueryDatabase. Para ello, haga clic en el hipervínculo QueryDatabase y escriba 409-56-7008 para el parámetro sID y haga clic en Invocar.

    El método devuelve los detalles del autor con el identificador 409-56-7008. Los resultados se muestran en el explorador como XML.

  6. Cierre la ventana del explorador o las ventanas para finalizar el servicio web.

Uso del servicio web desde Word

En este ejemplo se usa la plantilla Fax elegante que se incluye con Word. Este ejemplo no funciona sin esta plantilla. Para instalar la plantilla, siga estos pasos:

  1. Inicie el Asistente para la instalación de Office.
  2. En el asistente, haga clic en Agregar o quitar características.
  3. En Características para instalar, expanda Microsoft Excel para Windows. Haga clic en Plantillas de hoja de cálculo, en Ejecutar desde mi equipo y, a continuación, en Actualizar.

Para usar el servicio web de Word, siga estos pasos:

  1. Inicie Word. De forma predeterminada, se crea un documento en blanco.

  2. En el menú Herramientas, haga clic en Macro y, a continuación, en Editor de Visual Basic. En el menú Insertar, haga clic en Módulo para insertar un módulo de código en blanco.

  3. En el menú **Herramientas **, haga clic en Referencias.

  4. En el cuadro de diálogo Referencias , seleccione Biblioteca de tipos SOAP de Microsoft y, a continuación, haga clic en Aceptar.

    Nota Si la biblioteca de tipos SOAP de Microsoft no está disponible en el cuadro de diálogo Referencias , haga clic en Examinar. En el cuadro de diálogo Agregar referencia , vaya al directorio C:\Archivos de programa\Common Files\MSSoap\Binaries y seleccione mssoap1.dll. Haga clic en Abrir y, a continuación, en Aceptar.

  5. Pegue el código siguiente en el módulo de código:

    Public Const sServer = "localhost"
    
    Sub GenerateForm(sID As String)
        Dim oSOAPClient As Object
    
    On Error GoTo errhand
        Set oSOAPClient = CreateObject("MSSOAP.SoapClient")
        oSOAPClient.mssoapinit "http://" + sServer + "/SQLQuery/Service1.asmx?wsdl", "Service1", "Service1Soap"
    
    Dim arrTemp() As String
        arrTemp = oSOAPClient.QueryDatabase(sID)
    
    Dim oDoc As Word.Document
    
    Set oDoc = Application.Documents.Add("Elegant Fax.dot")
        oDoc.Bookmarks("Company").Range.Text = arrTemp(2) + " " + arrTemp(1) + vbCrLf + _
                arrTemp(4) + vbCrLf + arrTemp(5) + ", " + arrTemp(6) + "  " + arrTemp(7) + vbCrLf + _
                arrTemp(3)           
        Exit Sub
    errhand:
        MsgBox "Error #" + Err.Number + ": " + Err.Description
    End Sub
    
    Sub ShowForm()
      ' Show the dialog box to the user.
      UserForm1.Show
    End Sub
    
    

    NOTA Modifique la constante sServer para que apunte al servidor que hospeda el servicio web que acaba de crear.

  6. En el menú Insertar, haga clic en UserForm para insertar un formulario de usuario en blanco.

  7. Coloque un cuadro de lista grande y un botón de comando en el formulario.

  8. En el menú Ver, haga clic en Código para cambiar a la ventana de código del formulario de usuario.

  9. Reemplace el contenido de la ventana de código por lo siguiente:

    Private Sub CommandButton1_Click()
        ' Generate a FAX based on the ID.
        GenerateForm ListBox1.List(ListBox1.ListIndex)
        UserForm1.Hide
    End Sub
    
    Private Sub UserForm_Initialize()
        Dim oSOAPClient As Object
    
    ' Create a SOAP client.
        Set oSOAPClient = CreateObject("MSSOAP.SoapClient")
        ' Initialize the SOAP client to the Web service.
        oSOAPClient.mssoapinit "http://" + Module1.sServer + "/SQLQuery/Service1.asmx?wsdl", "Service1", "Service1Soap"
    
    Dim arrTemp() As String
        ' Get an array of IDs.
        arrTemp = oSOAPClient.GetIDs()
    
    ' Fill the list box with IDs.
        For i = 0 To UBound(arrTemp)
          ListBox1.AddItem arrTemp(i)
        Next
    End Sub
    
  10. Cierre el Editor de VBA para volver al documento.

  11. En el menú Herramientas, haga clic en Macro y, a continuación, en Macros. En el cuadro de diálogo Macros, ejecute la macro ShowForm para mostrar la lista de identificadores. Seleccione un identificador de la lista y haga clic en el botón de comando para generar un documento de fax con la información de ese usuario.

Uso del servicio web desde Excel

En este ejemplo se usa la plantilla Factura de ventas que se incluye con Excel. Este ejemplo no funciona sin esta plantilla. Para instalar la plantilla, siga estos pasos:

  1. Inicie el Asistente para la instalación de Office.
  2. En el asistente, haga clic en Agregar o quitar características.
  3. En Características para instalar, expanda Microsoft Excel para Windows, expanda Plantillas de hoja de cálculoy, a continuación, haga clic en Factura de ventas. Haga clic en Ejecutar desde mi equipo y haga clic en Actualizar.

Para usar el servicio web desde Excel, siga estos pasos:

  1. Inicie Excel. De forma predeterminada, se crea un libro en blanco.

  2. En el menú Herramientas, haga clic en Macro y, a continuación, en Editor de Visual Basic. En el menú Insertar, haga clic en Módulo para insertar un módulo de código en blanco.

  3. En el menú **Herramientas **, haga clic en Referencias.

  4. En el cuadro de diálogo Referencias , seleccione Biblioteca de tipos SOAP de Microsoft y, a continuación, haga clic en Aceptar.

    Nota Si la biblioteca de tipos SOAP de Microsoft no está disponible en el cuadro de diálogo Referencias , haga clic en Examinar. En el cuadro de diálogo Agregar referencia, vaya al directorio C:\Archivos de programa\Archivos comunes\MSSoap\Binaries y seleccione mssoap1.dll. Haga clic en Abrir y, a continuación, en Aceptar.

  5. Pegue el código siguiente en el módulo de código:

    Const sTemplatePath = "C:\Microsoft Office\Templates\1033\Sales Invoice.xlt"
    Public Const sServer = "localhost"
    
    Sub GenerateForm(sID As String)
        Dim oSOAPClient As Object
    
    On Error GoTo errhand
        Set oSOAPClient = CreateObject("MSSOAP.SoapClient")
        oSOAPClient.mssoapinit "http://" + sServer + "/SQLQuery/Service1.asmx?wsdl", "Service1", "Service1Soap"
    
    Dim arrTemp() As String
        arrTemp = oSOAPClient.QueryDatabase(sID)
    
    Dim oBook As Excel.Workbook
    
    Set oBook = Application.Workbooks.Add(sTemplatePath)
        With oBook.ActiveSheet
          If If CInt(Application.Version) = 10 Or CInt(Application.Version) = 11 Then
            .Range("D13").Value = arrTemp(2) + " " + arrTemp(1)
            .Range("D14").Value = arrTemp(4)
            .Range("D15").Value = arrTemp(5)
            .Range("F15").Value = arrTemp(6)
            .Range("H15").Value = arrTemp(7)
            .Range("D16").Value = arrTemp(3)
    
    .Range("M13").Value = CStr(Date)
            .Range("C19").Value = "45.8"
            .Range("D19").Value = "Consulting hours"
            .Range("L19").Value = "75"
          ElseIf CInt(Application.Version) = 9 Then
            .Range("data5").Value = arrTemp(2) + " " + arrTemp(1)
            .Range("data6").Value = arrTemp(4)
            .Range("data7").Value = arrTemp(5)
            .Range("data8").Value = arrTemp(6)
            .Range("data9").Value = arrTemp(7)
            .Range("data10").Value = arrTemp(3)
    
    .Range("data11").Value = "45.8"
            .Range("data12").Value = "Consulting hours"
            .Range("data13").Value = "75"
          End If
        End With
        Exit Sub
    errhand:
        MsgBox "Error #" + Err.Number + ": " + Err.Description
    End Sub
    
    Sub ShowForm()
      ' Show the dialog box to the user.
      UserForm1.Show
    End Sub
    
    

    Nota Modifique la constante sServer para que apunte al servidor que hospeda el servicio web que acaba de crear. Modifique la constante sTemplatePath para que apunte a la ruta de acceso correcta para el archivo de factura. Para Office 2000, la ubicación predeterminada para este archivo es C:\Microsoft Office\Templates\1033\Invoice.xlt. Para Office XP, la ubicación predeterminada es C:\Microsoft Office\Templates\1033\Sales Invoice.xlt.

  6. En el menú Insertar, haga clic en UserForm para insertar un formulario de usuario en blanco.

  7. Coloque un cuadro de lista grande y un botón de comando en el formulario.

  8. En el menú Ver, haga clic en Código para cambiar a la ventana de código del formulario de usuario.

  9. Reemplace el contenido de la ventana de código por lo siguiente:

    Private Sub CommandButton1_Click()
        ' Generate a FAX based on the ID.
        GenerateForm ListBox1.List(ListBox1.ListIndex)
        UserForm1.Hide
    End Sub
    
    Private Sub UserForm_Initialize()
        Dim oSOAPClient As Object
    
    ' Create a SOAP client.
        Set oSOAPClient = CreateObject("MSSOAP.SoapClient")
        ' Initialize the SOAP client to the Web service.
        oSOAPClient.mssoapinit "http://" + Module1.sServer + "/SQLQuery/Service1.asmx?wsdl", "Service1", "Service1Soap"
    
    Dim arrTemp() As String
        ' Get an array of IDs.
        arrTemp = oSOAPClient.GetIDs()
    
    ' Fill the list box with IDs.
        For i = 0 To UBound(arrTemp)
          ListBox1.AddItem arrTemp(i)
        Next
    End Sub
    
    
  10. Cierre el Editor de VBA para volver al libro.

  11. En el menú Herramientas, haga clic en Macro y, a continuación, en Macros. En el cuadro de diálogo Macros, ejecute la macro ShowForm para mostrar la lista de identificadores. Elija un identificador de la lista y haga clic en el botón de comando para generar una factura con la información de ese usuario.

Referencias

Para obtener más información sobre los servicios web, consulte el artículo de Microsoft Knowledge Base:

301273 cómo escribir un servicio web simple mediante Visual Basic .NET