2008-10-01 50 views

Trả lời

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("") 

Ngoài ra, để kiểm soát tốt hơn các yêu cầu HTTP, bạn có thể sử dụng WinHttp.WinHttpRequest.5.1 ở vị trí của MSXML2.ServerXMLHTTP.

+8

Để kiểm soát tốt hơn yêu cầu HTTP, bạn có thể sử dụng "WinHttp.WinHttpRequest.5.1" thay vì "MSXML2.ServerXMLHTTP" –

+5

Đáng chú ý là bạn cũng có thể sử dụng điều này để phát hành HTTP PUT bằng cách thay đổi "POST" thành "PUT". Nội dung để PUT đi theo phương thức .send(). Bất kỳ tiêu đề bổ sung nào bạn cần đặt cũng có thể được thực hiện theo cú pháp được sử dụng trong ví dụ User-Agent. – radicand

+2

Vui lòng không sử dụng dấu ngoặc đơn xung quanh các tham số nếu bạn không sử dụng giá trị trả về của Phụ: VBA Cú pháp không cho phép dấu ngoặc ôm xung quanh tham số của Phụ (mặc dù chúng cần cho Hàm), vì vậy các dấu ngoặc đơn này thực sự được sử dụng để làm rõ toán tử ưu tiên . Ngoài việc gây hiểu lầm và không rõ ràng, điều này cuối cùng có thể dẫn đến lỗi thời gian chạy nếu đối số là một đối tượng. Và mặc dù không được yêu cầu một cách rõ ràng, thông thường bạn sẽ muốn sử dụng phản hồi HTTP, mà bạn có thể đề cập đến có thể được truy xuất bởi 'objHTTP.responseText'. – Leviathan

4

Bạn có thể sử dụng ServerXMLHTTP trong dự án VBA bằng cách thêm tham chiếu vào MSXML.

  1. Mở VBA Editor (thường bằng cách chỉnh sửa một Macro)
  2. Go vào danh sách các tài liệu tham khảo sẵn
  3. Kiểm tra Microsoft XML
  4. Bấm OK.

(từ Referencing MSXML within VBA Projects)

Các ServerXMLHTTP MSDN documentation có đầy đủ chi tiết về tất cả các thuộc tính và phương pháp ServerXMLHTTP.

Nói tóm lại, mặc dù nó hoạt động cơ bản như thế này:

  1. Gọi open phương pháp để kết nối với máy chủ từ xa
  2. Gọi send để gửi yêu cầu.
  3. Đọc câu trả lời qua responseXML, responseText, responseStream hoặc responseBody
+0

liên kết đó sử dụng jscript, chứ không phải VBA –

+1

Cảm ơn @JohnHenckel. Tôi đã thực hiện một số thay đổi để đưa câu trả lời đó được cập nhật. –

49

QueryTables Nếu bạn cần nó để làm việc trên cả Mac và Windows, bạn có thể sử dụng:

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 

Ghi chú:

  • Về đầu ra ... Tôi không biết nếu nó có thể trả về kết quả cho cùng một ô được gọi là hàm VBA. Trong ví dụ trên, kết quả được viết thành A2.
  • Về đầu vào ... Nếu bạn muốn kết quả làm mới khi bạn thay đổi một số ô nhất định, hãy đảm bảo các ô đó là đối số cho hàm VBA của bạn.
  • Điều này sẽ không hoạt động trên Excel cho Mac 2008, không có VBA. Excel cho Mac 2011 đã VBA trở lại.

Để biết thêm chi tiết, bạn có thể xem tóm tắt đầy đủ của tôi về "using web services from Excel".

+3

+1: Tôi chỉ cần nó trên Windows nhưng một giải pháp đa nền tảng có thể có lợi cho người khác. –

+0

Tôi không nghĩ rằng bạn thực sự có thể truy cập vào mã html, bạn chỉ có thể nhận được thông tin trên trang web được hiển thị (không phải mã html thực tế) – user1493046

+1

+1 cho giải pháp đa nền tảng và +1 (nếu có thể) cho bản tóm tắt đầy đủ với liên kết gist và tất cả. Cảm ơn!! –

31

Ngoài các anwser của Bill the Lizard:

Hầu hết các phần phụ trợ phân tích các bài dữ liệu thô. Trong PHP ví dụ, bạn sẽ có một mảng $ _POST trong đó các biến riêng lẻ trong dữ liệu bài đăng sẽ được lưu trữ.Trong trường hợp này bạn phải sử dụng thêm một header "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") 

Nếu không, bạn phải đọc bài dữ liệu thô trên biến "$ HTTP_RAW_POST_DATA".

+0

Tôi đang cố đăng yêu cầu này (với dấu ngoặc nhọn) và nhận các lỗi biên dịch ... bạn có thể yêu cầu: "{" request ": {" carName ":" Honda "," model ":" 1A5 "}}" – fiddle

Các vấn đề liên quan