Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA - Webservices (SOAP)

Forumthread: VBA - Webservices (SOAP)

VBA - Webservices (SOAP)
26.02.2016 11:37:03
Peter
Hallo zusammen,
ich mache gerade die ersten Gehversuche mit SOAP-Aufrufe aus VBA, komme aber nicht sehr weit. Ich habe ein einfaches Webservice-Beispiel gewählt: Lesen von Daten aus einer Ortsdatenbank. Mit SoapUI funktioniert alles prächtig, nur der VBA-Code scheint nicht zu stimmen.
XML-Code aus SoapUI:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ws="http://gov.genealogy.net/ws">
<soapenv:Header/>
<soapenv:Body>
<ws:searchByName>
<placename>Heidkate</placename>
</ws:searchByName>
</soapenv:Body>
</soapenv:Envelope>
VBA-Code:
Sub SOAP_ComplexSearch()
Dim ObjHTTP        As New MSXML2.XMLHTTP
Dim sURL           As String
Dim sEnv           As String
sURL = "http://gov.genealogy.net/services/ComplexService?wsdl"
sEnv = "<?xml version=""1.0"" encoding=""utf-8"& _
quot;?>"
sEnv = sEnv & "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap. _
org/soap/envelope/"""
sEnv = sEnv & "xmlns:ws=""http://gov.genealogy.net/ws"">"
sEnv = sEnv & "<soapenv:Header/>"
sEnv = sEnv & "<soapenv:Body>"
sEnv = sEnv & "<ws:searchByName>"
sEnv = sEnv & "<placename>Heidkate</placename>"
sEnv = sEnv & "</ws:searchByName>"
sEnv = sEnv & "</soapenv:Body>"
sEnv = sEnv & "</soapenv:Envelope>"
ObjHTTP.Open "Post", sURL, False
ObjHTTP.setRequestHeader "Content-Type", "text/xml"
ObjHTTP.send (sEnv)
MsgBox ObjHTTP.responseText
Set ObjHTTP = Nothing
End Sub

Was ist falsch oder was fehlt?
Viele Grüße
Peter

Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA - Webservices (SOAP)
28.02.2016 11:37:41
fcs
Hallo Peter,
es scheint bei dir ein Problem bei der Deklaration der Variablen "ObjHTTP" zu sein.
Jedenfalss läuft bei mir (Windows 10 /Office 365 / Excel 16) das Makro wenn ich im VBA-Editor unter Extras den Verweis setze für
Microsoft XML, v6.0 - evtl. geht's auch mit v3.0
und im Makro die Deklaration der Variablen in der Dim-Zeile anpasse.
Ich auch noch ein paar Zeilen eingebaut, um Daten/Informationne zum ObjHTTP-Object in Textdateien zu schreiben.
https://www.herber.de/bbs/user/103937.txt
Gruß
Franz

Anzeige
AW: VBA - Webservices (SOAP)
29.02.2016 20:58:21
Peter
Hallo Franz,
vielen Dank für Deine Antwort. Das Problem lag nicht an der Definition der Objektvariablen - die Verweise waren korrekt eingestellt auf Microsoft XML 6.0. Das Problem lag an der URL, welche auf die WSDL anstatt auf die Zugriffsmethode gezeigt hat. Nach einsprechender Anpassung hat alles funktioniert.
Hier das neue Coding:
'Set Reference to Microsoft XML, v6.0
Sub SOAP_ComplexSearch()
Dim wsTab1         As Worksheet
Dim ObjHTTP        As New MSXML2.XMLHTTP
Dim sURL           As String
Dim sEnv           As String
Dim sPlaceName     As String
Set wsTab1 = ThisWorkbook.Sheets(1)
sPlaceName = CStr(wsTab1.Range("B2").Value)
sURL = "http://gov.genealogy.net/services/ComplexSearch/SearchByName"
sEnv = "<?xml version=""1.0"" encoding=""utf-8"& _
quot;?>"
sEnv = sEnv & "<soapenv:Envelope"
sEnv = sEnv & " xmlns:xsd=""http://www.w3.org/2001/XMLSchema""& _
quot;
sEnv = sEnv & " xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/& _
quot;""
sEnv = sEnv & " xmlns:ws=""http://gov.genealogy.net/ws"">"
sEnv = sEnv & "<soapenv:Body>"
sEnv = sEnv & "<ws:searchByName>"
sEnv = sEnv & "<placename>" & sPlaceName & "</placename> _
"
sEnv = sEnv & "</ws:searchByName>"
sEnv = sEnv & "</soapenv:Body>"
sEnv = sEnv & "</soapenv:Envelope>"
ObjHTTP.Open "Post", sURL, False
ObjHTTP.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
ObjHTTP.send (sEnv)
wsTab1.Range("B4")= ObjHTTP.responseText
Set ObjHTTP = Nothing
End Sub

Viele Grüße
Peter
Anzeige
;
Anzeige

Infobox / Tutorial

VBA und Webservices mit SOAP nutzen


Schritt-für-Schritt-Anleitung

  1. Verweise setzen: Stelle sicher, dass du im VBA-Editor unter Extras > Verweise den Verweis auf Microsoft XML, v6.0 oder Microsoft XML, v3.0 gesetzt hast.

  2. VBA-Code erstellen: Verwende folgenden Code als Ausgangspunkt für deinen SOAP-Request:

    Sub SOAP_ComplexSearch()
        Dim ObjHTTP As New MSXML2.XMLHTTP
        Dim sURL As String
        Dim sEnv As String
        sURL = "http://gov.genealogy.net/services/ComplexSearch/SearchByName"
        sEnv = "<?xml version=""1.0"" encoding=""utf-8""?>"
        sEnv = sEnv & "<soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:ws=""http://gov.genealogy.net/ws"">"
        sEnv = sEnv & "<soapenv:Header/>"
        sEnv = sEnv & "<soapenv:Body>"
        sEnv = sEnv & "<ws:searchByName>"
        sEnv = sEnv & "<placename>Heidkate</placename>"
        sEnv = sEnv & "</ws:searchByName>"
        sEnv = sEnv & "</soapenv:Body>"
        sEnv = sEnv & "</soapenv:Envelope>"
    
        ObjHTTP.Open "Post", sURL, False
        ObjHTTP.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
        ObjHTTP.send (sEnv)
    
        MsgBox ObjHTTP.responseText
        Set ObjHTTP = Nothing
    End Sub
  3. Parameter anpassen: Ändere die placename-Parameter entsprechend deiner Bedürfnisse. Du kannst auch Zellen aus deinem Excel-Dokument referenzieren.


Häufige Fehler und Lösungen

  • Falsche URL: Achte darauf, dass die URL auf die richtige Zugriffsmethode zeigt und nicht auf die WSDL. In dem Beispiel von Peter war die ursprüngliche URL fehlerhaft.

  • Verweis nicht gesetzt: Wenn das Makro nicht funktioniert, überprüfe, ob der Verweis auf Microsoft XML korrekt gesetzt ist.

  • ObjHTTP-Fehler: Stelle sicher, dass Dim ObjHTTP As New MSXML2.XMLHTTP richtig deklariert ist. Andernfalls kann es zu Laufzeitfehlern kommen.


Alternative Methoden

  • Excel Webservice-Funktion: Du kannst die WEBSERVICE-Funktion in Excel verwenden, um Daten von einem Webservice zu holen, ohne VBA zu nutzen. Beispiel: =WEBSERVICE("http://example.com/api").

  • Power Query: Eine weitere Möglichkeit ist die Verwendung von Power Query, um Daten von SOAP-Webservices zu importieren. Dies erfordert jedoch eine andere Vorgehensweise und ist nicht direkt mit VBA verbunden.


Praktische Beispiele

Ein einfaches Beispiel für einen VBA SOAP-Request:

Sub SOAP_Example()
    Dim ObjHTTP As New MSXML2.XMLHTTP
    Dim sURL As String
    Dim sEnv As String
    sURL = "http://example.com/webservice"
    sEnv = "<?xml version=""1.0""?><soapenv:Envelope xmlns:soapenv=""http://schemas.xmlsoap.org/soap/envelope/""><soapenv:Body><YourMethod>YourParameter</YourMethod></soapenv:Body></soapenv:Envelope>"

    ObjHTTP.Open "POST", sURL, False
    ObjHTTP.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
    ObjHTTP.send (sEnv)

    MsgBox ObjHTTP.responseText
    Set ObjHTTP = Nothing
End Sub

Tipps für Profis

  • Debugging: Verwende Debug.Print ObjHTTP.responseText, um die Antwort des Webservices in das Direktfenster zu drucken, anstatt sie in einer MsgBox anzuzeigen.

  • Fehlerbehandlung: Implementiere Fehlerbehandlungsroutinen in deinem Code, um unerwartete Probleme zu identifizieren.

  • SOAP-Envelope optimieren: Achte darauf, nur die notwendigen Namespaces in deinem SOAP-Envelope zu verwenden, um die Effizienz zu verbessern.


FAQ: Häufige Fragen

1. Wie kann ich einen SOAP-Request in Excel ohne VBA durchführen?
Du kannst die WEBSERVICE-Funktion in Excel verwenden, um Daten von einem Webservice zu importieren.

2. Welche Excel-Version benötige ich für die Verwendung von VBA mit SOAP?
Die meisten modernen Excel-Versionen, einschließlich Excel 2016 und Office 365, unterstützen VBA und SOAP-Webservices.

3. Was mache ich, wenn mein SOAP-Request fehlschlägt?
Überprüfe die URL, die Struktur des SOAP-Envelopes und die gesetzten Verweise im VBA-Editor.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige