Jak mogę wysłać żądanie HTTP POST do serwera z programu Excel przy użyciu VBA?

Jaki kod VBA jest wymagany do wykonania postu HTTP z arkusza kalkulacyjnego Excel?

Author: Community, 2008-10-01

5 answers

Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
URL = "http://www.somedomain.com"
objHTTP.Open "POST", URL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.send("")

Alternatywnie, dla większej kontroli nad żądaniem HTTP można użyć WinHttp.WinHttpRequest.5.1 w miejsce MSXML2.ServerXMLHTTP.

 126
Author: Bill the Lizard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-09 15:49:54

Jeśli potrzebujesz go do pracy zarówno na Mac jak i Windows, możesz użyć QueryTables:

With ActiveSheet.QueryTables.Add(Connection:="URL;http://carbon.brighterplanet.com/flights.txt", Destination:=Range("A2"))
    .PostText = "origin_airport=MSN&destination_airport=ORD"
    .RefreshStyle = xlOverwriteCells
    .SaveData = True
    .Refresh
End With

Uwagi:

  • odnośnie wyjścia... Nie wiem, czy możliwe jest zwrócenie wyników do tej samej komórki, która wywołała funkcję VBA. W powyższym przykładzie wynik jest zapisywany do formatu A2.
  • odnośnie wejścia... Jeśli chcesz, aby wyniki odświeżały się po zmianie niektórych komórek, upewnij się, że te komórki są argumentem funkcji VBA.
  • to nie zadziała na Excelu dla Mac 2008, który nie ma VBA. Excel for Mac 2011 dostał VBA z powrotem.

Aby uzyskać więcej szczegółów, możesz zobaczyć moje pełne podsumowanie na temat " korzystanie z usług internetowych z Excela."

 49
Author: Seamus Abshere,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-06 17:07:15

Oprócz anwsera Bill The Lizard :

Większość backendów przetwarza surowe dane post. Na przykład w PHP będziesz miał tablicę $_POST, w której będą przechowywane poszczególne zmienne w danych post. W tym przypadku musisz użyć dodatkowego nagłówka "Content-type: application / x-www-form-urlencoded":

Set objHTTP = CreateObject("WinHttp.WinHttpRequest.5.1")
URL = "http://www.somedomain.com"
objHTTP.Open "POST", URL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
objHTTP.send ("var1=value1&var2=value2&var3=value3")

W przeciwnym razie musisz odczytać surowe dane postu w zmiennej "$HTTP_RAW_POST_DATA".

 36
Author: thiscode,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:32

Możesz użyć ServerXMLHTTP w projekcie VBA, dodając odniesienie do MSXML.

  1. Otwórz Edytor VBA (Zwykle edytując Makro)
  2. Przejdź do listy dostępnych referencji
  3. Sprawdź Microsoft XML
  4. Kliknij OK.

(z odwołanie do MSXML w projektach VBA )

Dokumentacja ServerXMLHTTP MSDN zawiera pełne informacje o wszystkich właściwościach i metodach ServerXMLHTTP.

Krótko mówiąc, działa zasadniczo tak:

  1. wywołanie otwórz metodę aby połączyć się ze zdalnym serwerem
  2. zadzwoń wyślij Aby wysłać zapytanie.
  3. odczytaj odpowiedź przez responseXML, responseText, responseStream lub responseBody
 5
Author: Mark Biek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-19 11:39:31

Zrobiłem to przed użyciem biblioteki MSXML, a następnie przy użyciu obiektu XMLHttpRequest. Zobacz http://scriptorium.serve-it.nl/view.php?sid=40

 0
Author: Sijin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-01 17:03:18