Verwenden eines XML-Webdiensts mithilfe von ASP.NET aus einem Office VBA-Makro in Word oder Excel

Zusammenfassung

In diesem Artikel wird die Verwendung eines XML-Webdiensts mithilfe von ASP.NET aus einem VBA-Makro (Visual Basic for Applications) in Word oder Excel veranschaulicht.

Weitere Informationen

Um erfolgreich mit einem XML-Webdienst über ASP.NET aus einem Office-Makro zu kommunizieren, muss das SOAP-Toolkit auf dem Clientcomputer installiert sein, auf dem das Makro ausgeführt wird. Entsprechend ist das SOAP Toolkit für die Demonstration in diesem Artikel erforderlich. Details zum SOAP-Toolkit, einschließlich Downloadanweisungen.

Erstellen des XML-Webdiensts mithilfe von ASP.NET

  1. Starten Sie Microsoft Visual Studio .NET. Klicken Sie im Menü "Datei" auf "Neu" und dann auf "Projekt". Klicken Sie im Dialogfeld "Neues Projekt" unter "Projekttypen" auf "Visual Basic-Projekte", und klicken Sie dann mithilfe von ASP.NET unter "Vorlagen" auf "XML-Webdienst". Benennen Sie das Projekt SQLQuery, und klicken Sie auf "OK". Das Entwurfsformular für Service1 wird standardmäßig angezeigt.

  2. Klicken Sie im Menü "Ansicht" auf "Code", um das Codefenster für Service1 anzuzeigen.

  3. Fügen Sie den folgenden Code oben im Codefenster ein:

    Imports System.Data.SqlClient
    
  4. Fügen Sie den folgenden Code in die Service1-Klasse (direkt vor der End-Klasse) ein.

    Hinweis Sie müssen den Benutzernamen> und das Kennwort der Benutzer-ID <=<sicheres Kennwort> in die richtigen Werte ändern, bevor Sie diesen Code ausführen. Stellen Sie sicher, dass die Benutzer-ID über die entsprechenden Berechtigungen zum Ausführen dieses Vorgangs für die Datenbank verfügt.

    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
    
    

Hinweis

Ändern Sie die strConn-Konstante im Code so, dass sie eine gültige Verbindungszeichenfolge für die SQL Server pubs-Datenbank ist.

Testen des Webdiensts

  1. Drücken Sie F5, um die Webdienstlösung zu erstellen und auszuführen. Wenn Sie den Webdienst über die integrierte Entwicklungsumgebung (INTEGRATED Development Environment, IDE) von .NET ausführen, lädt Microsoft Internet Explorer Service1.asmx aus Ihrer Lösung.

  2. Testen Sie die GetIDs-Methode. Klicken Sie dazu auf den Link "GetIDs" und dann auf "Aufrufen".

    Die Methode gibt eine Liste der Autor-IDs zurück, die der Webdienst aus der pubs-Datenbank extrahiert hat. Die Ergebnisse werden im Browser als XML angezeigt.

  3. Schließen Sie das Browserfenster oder -fenster, und kehren Sie zu Visual Studio zurück.

  4. Drücken Sie erneut F5, um den Webdienst auszuführen.

  5. Testen Sie die QueryDatabase-Methode. Klicken Sie dazu auf den Link "QueryDatabase", geben Sie dann "409-56-7008" für den sID-Parameter ein, und klicken Sie auf "Aufrufen".

    Die Methode gibt die Details für den Autor mit der ID 409-56-7008 zurück. Die Ergebnisse werden im Browser als XML angezeigt.

  6. Schließen Sie das Browserfenster oder die Fenster, um den Webdienst zu beenden.

Verwenden des Webdiensts aus Word

In diesem Beispiel wird die elegante Faxvorlage verwendet, die im Lieferumfang von Word enthalten ist. Dieses Beispiel funktioniert nicht ohne diese Vorlage. Führen Sie die folgenden Schritte aus, um die Vorlage zu installieren:

  1. Starten Sie den Office-Setup-Assistenten.
  2. Klicken Sie im Assistenten auf "Features hinzufügen" oder "Features entfernen".
  3. Erweitern Sie unter "Zu installierenden Features" Microsoft Excel für Windows. Klicken Sie auf "Tabellenkalkulationsvorlagen", dann auf "Von Meinem Computer ausführen" und dann auf "Aktualisieren".

Führen Sie die folgenden Schritte aus, um den Webdienst aus Word zu verwenden:

  1. Starten Sie Word. Standardmäßig wird ein leeres Dokument erstellt.

  2. Klicken Sie im Menü "Extras" auf "Makro" und dann auf "Visual Basic Editor". Klicken Sie im Menü "Einfügen" auf "Modul", um ein leeres Codemodul einzufügen.

  3. Klicken Sie im Menü **Extras ** auf Verweise.

  4. Wählen Sie im Dialogfeld "Verweise " die Microsoft SOAP-Typbibliothek aus, und klicken Sie dann auf "OK".

    Hinweis Wenn die Microsoft SOAP-Typbibliothek im Dialogfeld "Verweise " nicht verfügbar ist, klicken Sie auf "Durchsuchen". Navigieren Sie im Dialogfeld " Verweis hinzufügen " zum Verzeichnis "C:\Programme\Allgemeine Dateien\MSSoap\Binärdateien", und wählen Sie mssoap1.dll aus. Klicken Sie auf "Öffnen " und dann auf "OK".

  5. Fügen Sie den folgenden Code in das Codemodul ein:

    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
    
    

    HINWEIS Ändern Sie die sServer-Konstante so, dass sie auf den Server verweist, auf dem der soeben erstellte Webdienst gehostet wird.

  6. Klicken Sie im Menü "Einfügen" auf "UserForm", um ein leeres Benutzerformular einzufügen.

  7. Platzieren Sie ein großes Listenfeld und eine Befehlsschaltfläche auf dem Formular.

  8. Klicken Sie im Menü "Ansicht" auf "Code", um zum Codefenster für das Benutzerformular zu wechseln.

  9. Ersetzen Sie den Inhalt des Codefensters durch Folgendes:

    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. Schließen Sie den VBA-Editor, um zum Dokument zurückzukehren.

  11. Klicken Sie im Menü "Extras" auf "Makro" und dann auf "Makros". Führen Sie im Dialogfeld "Makros" das Makro "ShowForm" aus, um die Liste der IDs anzuzeigen. Wählen Sie eine ID aus der Liste aus, und klicken Sie auf die Befehlsschaltfläche, um ein Faxdokument mit den Informationen dieses Benutzers zu generieren.

Verwenden des Webdiensts aus Excel

In diesem Beispiel wird die Vorlage "Verkaufsrechnung" verwendet, die in Excel ausgeliefert wird. Dieses Beispiel funktioniert nicht ohne diese Vorlage. Führen Sie die folgenden Schritte aus, um die Vorlage zu installieren:

  1. Starten Sie den Office-Setup-Assistenten.
  2. Klicken Sie im Assistenten auf "Features hinzufügen" oder "Features entfernen".
  3. Erweitern Sie unter zu installierenden Features Microsoft Excel für Windows, erweitern Sie Tabellenkalkulationsvorlagen, und klicken Sie dann auf "Verkaufsrechnung". Klicken Sie auf "Von Meinem Computer ausführen" und dann auf "Aktualisieren".

Führen Sie die folgenden Schritte aus, um den Webdienst aus Excel zu verwenden:

  1. Starten Sie Excel. Standardmäßig wird eine leere Arbeitsmappe erstellt.

  2. Klicken Sie im Menü "Extras" auf "Makro" und dann auf "Visual Basic Editor". Klicken Sie im Menü "Einfügen" auf "Modul", um ein leeres Codemodul einzufügen.

  3. Klicken Sie im Menü **Extras ** auf Verweise.

  4. Wählen Sie im Dialogfeld "Verweise " die Microsoft SOAP-Typbibliothek aus, und klicken Sie dann auf "OK".

    Hinweis Wenn die Microsoft SOAP-Typbibliothek im Dialogfeld "Verweise " nicht verfügbar ist, klicken Sie auf "Durchsuchen". Navigieren Sie im Dialogfeld " Verweis hinzufügen" zum Verzeichnis "C:\Programme\Allgemeine Dateien\MSSoap\Binärdateien", und wählen Sie mssoap1.dll aus. Klicken Sie auf "Öffnen " und dann auf "OK".

  5. Fügen Sie den folgenden Code in das Codemodul ein:

    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
    
    

    Hinweis Ändern Sie die sServer-Konstante so, dass sie auf den Server verweist, auf dem der soeben erstellte Webdienst gehostet wird. Ändern Sie die sTemplatePath-Konstante so, dass sie auf den richtigen Pfad für die Rechnungsdatei verweist. Für Office 2000 lautet der Standardspeicherort für diese Datei "C:\Microsoft Office\Templates\1033\Invoice.xlt". Für Office XP lautet der Standardspeicherort "C:\Microsoft Office\Templates\1033\Sales Invoice.xlt".

  6. Klicken Sie im Menü "Einfügen" auf "UserForm", um ein leeres Benutzerformular einzufügen.

  7. Platzieren Sie ein großes Listenfeld und eine Befehlsschaltfläche auf dem Formular.

  8. Klicken Sie im Menü "Ansicht" auf "Code", um zum Codefenster für das Benutzerformular zu wechseln.

  9. Ersetzen Sie den Inhalt des Codefensters durch Folgendes:

    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. Schließen Sie den VBA-Editor, um zur Arbeitsmappe zurückzukehren.

  11. Klicken Sie im Menü "Extras" auf "Makro" und dann auf "Makros". Führen Sie im Dialogfeld "Makros" das Makro "ShowForm" aus, um die Liste der IDs anzuzeigen. Wählen Sie eine ID aus der Liste aus, und klicken Sie auf die Befehlsschaltfläche, um eine Rechnung mit den Informationen dieses Benutzers zu generieren.

References

Weitere Informationen zu Webdiensten finden Sie im Artikel in der Microsoft Knowledge Base:

301273 Schreiben eines einfachen Webdiensts mithilfe von Visual Basic .NET