Como Utilizar um Serviço Web XML Utilizando ASP.NET de uma Macro VBA do Office no Word ou Excel

Resumo

Este artigo demonstra como utilizar um serviço Web XML utilizando ASP.NET de uma macro de Visual Basic for Applications (VBA) no Word ou Excel.

Mais Informações

Para comunicar com êxito com um serviço Web XML através do ASP.NET a partir de uma macro do Office, o Toolkit SOAP tem de estar instalado no computador cliente no qual a macro é executada. Em conformidade, o Toolkit SOAP é necessário para a demonstração neste artigo. Para obter detalhes sobre o Toolkit SOAP, incluindo instruções de transferência.

Criar o Serviço Web XML utilizando ASP.NET

  1. Inicie o Microsoft Visual Studio .NET. No menu Ficheiro, clique em Novo e, em seguida, clique em Projeto. Na caixa de diálogo Novo Projeto, clique em Projetos do Visual Basic em Tipos de Projeto e, em seguida, clique em Serviço Web XML utilizando ASP.NET em Modelos. Dar um nome SQLQuery ao projeto e clique em OK. O formulário de estrutura para Serviço1 é mostrado por predefinição.

  2. No menu Ver, clique em Código para apresentar a janela de código do Serviço1.

  3. Colar o seguinte código na parte superior da janela de código:

    Imports System.Data.SqlClient
    
  4. Colar o seguinte código na classe Service1 (mesmo antes de Terminar Classe).

    Nota Tem de alterar o nome de utilizador e a palavra-passe> do ID <de Utilizador para<> os valores corretos antes de executar este código. Certifique-se de que o ID de Utilizador tem as permissões adequadas para efetuar esta operação na base de dados.

    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 a constante strConn no código para que seja uma cadeia de ligação válida para a base SQL Server pubs.

Testar o Serviço Web

  1. Prima F5 para criar e executar a solução de serviço Web. Quando executa o serviço Web a partir do IDE (Integrated Development Environment) do .NET, o Microsoft Internet Explorer carrega o Service1.asmx a partir da sua solução.

  2. Teste o método GetIDs. Para o fazer, clique na hiperligação GetIDs e, em seguida, clique em Invocar.

    O método devolve uma lista de IDs de autor extraídos pelo serviço Web da base de dados de pubs. Os resultados são apresentados no browser como XML.

  3. Feche a janela ou janelas do browser e regresse ao Visual Studio.

  4. Prima F5 novamente para executar o serviço Web.

  5. Teste o método QueryDatabase. Para o fazer, clique na hiperligação BaseDeDadosLista e, em seguida, escreva 409-56-7008 para o parâmetro sID e clique em Invoke.

    O método devolve os detalhes para o autor com o ID 409-56-7008. Os resultados são apresentados no browser como XML.

  6. Feche a janela ou janelas do browser para terminar o serviço Web.

Utilizar o Serviço Web do Word

Este exemplo utiliza o modelo Fax Elegante que é enviado com o Word. Este exemplo não funciona sem este modelo. Para instalar o modelo, siga estes passos:

  1. Inicie o assistente de Configuração do Office.
  2. No assistente, clique em Adicionar ou Remover Funcionalidades.
  3. Em Funcionalidades a Instalar, expanda Microsoft Excel para Windows. Clique em Modelos de Uma Lista, clique em Executar a partir de O Meu Computador e, em seguida, clique em Atualizar.

Para utilizar o serviço Web do Word, siga estes passos:

  1. Inicie o Word. Por predefinição, é criado um documento em branco.

  2. No menu Ferramentas, clique em Macro e, em seguida, clique em Visual Basic Editor. No menu Inserir, clique em Módulo para inserir um módulo de código em branco.

  3. No menu **Ferramentas **, clique em Referências.

  4. Na caixa de diálogo Referências , selecione Biblioteca de Tipos SOAP da Microsoft e, em seguida, clique em OK.

    Nota Se a Biblioteca de Tipos SOAP da Microsoft não estiver disponível na caixa de diálogo Referências , clique em Procurar. Na caixa de diálogo Adicionar Referência, navegue para o diretório C:\Program Files\Common Files\MSSoap\Binaries e selecione mssoap1.dll. Clique em Abrir e , em seguida, clique em OK.

  5. Colar o seguinte código no 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 a constante de sServer para apontar para o servidor que está a alolar o serviço Web que acabou de criar.

  6. No menu Inserir, clique em Formulário de Utilizador para inserir um formulário de utilizador em branco.

  7. Coloque uma caixa de listagem grande e um botão de comando no formulário.

  8. No menu Ver, clique em Código para alterar para a janela de código do formulário de utilizador.

  9. Substitua os conteúdos da janela de código pelo seguinte:

    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. Feche o Editor do VBA para regressar ao documento.

  11. No menu Ferramentas, clique em Macro e, em seguida, clique em Macros. Na caixa de diálogo Macros, execute a macro MostrarFormulário para apresentar a lista de IDs. Selecione um ID na lista e clique no botão de comando para gerar um documento de fax com as informações do utilizador.

Utilizar o Serviço Web do Excel

Este exemplo utiliza o modelo Fatura de Vendas que é utilizado com o Excel. Este exemplo não funciona sem este modelo. Para instalar o modelo, siga estes passos:

  1. Inicie o assistente de Configuração do Office.
  2. No assistente, clique em Adicionar ou Remover Funcionalidades.
  3. Em Funcionalidades a Instalar, expanda o Microsoft Excel para Windows, expanda Modelos de Uma Única Página e, em seguida, clique em Fatura de Vendas. Clique em Executar a partir de O Meu Computador e clique em Atualizar.

Para utilizar o serviço Web do Excel, siga estes passos:

  1. Inicie o Excel. Por predefinição, é criado um livro em branco.

  2. No menu Ferramentas, clique em Macro e, em seguida, clique em Visual Basic Editor. No menu Inserir, clique em Módulo para inserir um módulo de código em branco.

  3. No menu **Ferramentas **, clique em Referências.

  4. Na caixa de diálogo Referências , selecione Biblioteca de Tipos SOAP da Microsoft e, em seguida, clique em OK.

    Nota Se a Biblioteca de Tipos SOAP da Microsoft não estiver disponível na caixa de diálogo Referências , clique em Procurar. Na caixa de diálogoAdicionar Referência, navegue até ao diretório C:\Program Files\Common Files\MSSoap\Binaries e selecione mssoap1.dll. Clique em Abrir e , em seguida, clique em OK.

  5. Colar o seguinte código no 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 a constante de sServer para apontar para o servidor que está a alolar o serviço Web que acabou de criar. Modifique a constante do sTemplatePath para apontar para o caminho correto para o ficheiro de fatura. Para o Office 2000, a localização predefinida para este ficheiro é C:\Microsoft Office\Templates\1033\Invoice.xlt. Para o Office XP, a localização predefinida é C:\Microsoft Office\Templates\1033\Sales Invoice.xlt.

  6. No menu Inserir, clique em Formulário de Utilizador para inserir um formulário de utilizador em branco.

  7. Coloque uma caixa de listagem grande e um botão de comando no formulário.

  8. No menu Ver, clique em Código para alterar para a janela de código do formulário de utilizador.

  9. Substitua os conteúdos da janela de código pelo seguinte:

    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. Feche o Editor do VBA para regressar ao livro.

  11. No menu Ferramentas, clique em Macro e, em seguida, clique em Macros. Na caixa de diálogo Macros, execute a macro MostrarFormulário para apresentar a lista de IDs. Escolha um ID na lista e clique no botão de comando para gerar uma fatura com as informações do utilizador.

Referências

Para obter informações adicionais sobre serviços Web, veja o artigo na Base de Dados de Conhecimento Microsoft:

301273 Como Escrever um Serviço Web Simples utilizando o Visual Basic .NET