2008-10-01 15 views

Odpowiedz

116
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 lepszej kontroli nad żądania HTTP można wykorzystać WinHttp.WinHttpRequest.5.1 zamiast MSXML2.ServerXMLHTTP.

+8

Aby uzyskać większą kontrolę nad żądaniem HTTP, można użyć "WinHttp.WinHttpRequest.5.1" zamiast "MSXML2.ServerXMLHTTP" –

+5

Warto zauważyć, że można również użyć tego do wydania komunikatu HTTP PUT, zmieniając "POST" na "PUT". Treść do PUT idzie w metodzie .send(). Wszelkie dodatkowe nagłówki, które musisz ustawić, można również wykonać za pomocą następującej składni użytej w przykładzie User-Agent. – radicand

+2

Nie używaj nawiasów wokół parametrów, jeśli nie używasz wartości zwracanej przez Sub: VBA Składnia nie pozwala na nawiasy wokół parametrów Sub (są one potrzebne dla funkcji), więc nawiasy te są w rzeczywistości arytmetycznymi nawiasami używanymi do wyjaśnienia pierwszeństwa operatora . Oprócz tego, że jest on mylący i niejasny, może to doprowadzić do błędu runtime, jeśli argument jest obiektem. I choć nie jest to wyraźnie wymagane, zwykle chciałbyś użyć odpowiedzi HTTP, którą możesz wspomnieć, można pobrać za pomocą 'objHTTP.responseText'. – Leviathan

4

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

  1. Otwórz Edytor VBA (zwykle poprzez edycję makra)
  2. Przejdź do listy Dostępne Odniesienia
  3. wyboru Microsoft XML
  4. Kliknij OK.

(z Referencing MSXML within VBA Projects)

ServerXMLHTTP MSDN documentation ma pełne dane o wszystkich właściwościach i sposoby ServerXMLHTTP.

Krótko mówiąc jednak, to działa w zasadzie tak:

  1. połączeń open sposób, aby połączyć się ze zdalnym serwerem
  2. Wezwania send wysłać żądanie.
  3. Przeczytaj odpowiedź poprzez responseXML, responseText, responseStream lub responseBody
+0

ten link używa jscript, a nie VBA –

+1

Dzięki @JohnHenckel. Wprowadziłem kilka zmian, aby zaktualizować tę odpowiedź. –

49

Jeśli jest to potrzebne do pracy na komputerach Mac i Windows, można użyć QueryTable:

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:

  • chodzi o wyjście ... Nie wiem, czy to możliwe zwróć wyniki do tej samej komórki, która nazywa się funkcją VBA. W powyższym przykładzie wynik zapisywany jest na A2.
  • Jeśli chodzi o dane wejściowe ... Jeśli chcesz odświeżyć wyniki po zmianie niektórych komórek, upewnij się, że te komórki są argumentem funkcji VBA.
  • To nie zadziała w programie Excel na Mac 2008, który nie ma VBA. Excel 2011 dla komputerów Mac otrzymał VBA.

Aby uzyskać więcej informacji, można zobaczyć moje pełne podsumowanie dotyczące "using web services from Excel."

+3

+1: Potrzebuję go tylko w systemie Windows, ale rozwiązanie wieloplatformowe może przynieść korzyść komuś innemu. –

+0

Nie sądzę, że faktycznie można uzyskać dostęp do kodu HTML, można uzyskać tylko informacje na temat renderowanej strony internetowej (nie rzeczywisty kod HTML) – user1493046

+1

+1 dla rozwiązania wieloplatformowego i +1 (gdybym mógł) dla pełne podsumowanie z linkiem i wszystkim. Dzięki!! –

31

Oprócz anwser z Bill the Lizard:

Większość backendów analizować nieprzetworzone dane POST. W PHP na przykład, będziesz mieć tablicę $ _POST, w której będą przechowywane poszczególne zmienne w danych postu.W tym przypadku trzeba 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 trzeba czytać surowych danych post na zmiennej "$ HTTP_RAW_POST_DATA".

+0

Próbuję opublikować tę prośbę (z nawiasami klamrowymi) i uzyskać błędy kompilacji ... może ci pomóc: "{" request ": {" carName ":" Honda "," model ":" 1A5 "}}" – fiddle

Powiązane problemy