Excel VBA循环发送请求到Api
问题描述:
我创建了一个成功工作的宏,它正在发送呼叫并从Web服务接收响应。现在我想发送不同的呼叫(来自A列),并将该呼叫列写入B列。 第一个请求已成功发送。但是,我总是在第二次请求中收到运行时错误。Excel VBA循环发送请求到Api
这里是我的宏:
Sub API_CALL()
Dim sURL As String
Dim sEnv As String
Dim xmlDoc As New DOMDocument
Dim sEnvlength As Integer
Dim responseText As String
Dim MyString As String
Dim LastRow As Long
LastRow = Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To LastRow
MyString = Cells(i, 1)
Set ObjHttp = New MSXML2.XMLHTTP
sURL = "https://example.com/WebService.asmx"
sEnv = sEnv & "<?xml version=""1.0"" encoding=""utf-8""?>"
sEnv = sEnv & "<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">"
sEnv = sEnv & " <soap:Body>"
sEnv = sEnv & " <Command>" & MyString & "</Command>"
sEnv = sEnv & " </msg>"
sEnv = sEnv & " </soap:Body>"
sEnv = sEnv & "</soap:Envelope>"
sEnvlength = Len(sEnv)
ObjHttp.Open "POST", sURL, False
ObjHttp.setRequestHeader "Content-Type", "text/xml; charset=utf-8"
ObjHttp.setRequestHeader "Content-Length", sEnvlength
ObjHttp.send (sEnv)
xmlDoc.LoadXML (ObjHttp.responseText)
responseText = xmlDoc.SelectNodes("//CommandResult")(0).Text 'on next i (=2) I got Error '91' - object variable or With block variable not set
Cells(i, 2) = responseText
Set xmlDoc = Nothing
Set ObjHttp = Nothing
Next i
End Sub
任何帮助将非常感激!
答
您在循环中缺少sEnv = ""
。
这就是为什么你的sEnv总是从第二个循环开始就是错误的。试试这个:
For i = 2 To LastRow
MyString = Cells(i, 1)
Set ObjHttp = New MSXML2.XMLHTTP
sURL = "https://example.com/WebService.asmx"
' Clear string first ...
sEnv = ""
sEnv = sEnv & "<?xml version=""1.0"" encoding=""utf-8""?>"
' ... and so on ...
+1
谢谢,我知道这很容易,但无法找到。非常感谢 – Petrik 2014-10-20 15:14:05
您可能会过快地提出请求 - 他们的网站可能会抵御DoS或其他事情。你可以通过在循环的每次迭代中延迟半秒来测试,并查看请求是否经过。如果是这样,您可以向下调整时间延迟,直到找到最佳点。有几个选项可以在VBA中暂停代码,你可以在这里找到(http://stackoverflow.com/questions/1544526/how-to-pause-for-specific-amount-of-time)。 – Blackhawk 2014-10-20 15:09:52
当代码抛出错误时,您也可以尝试检查'ObjHttp.responseText'。这很可能会告诉你问题是什么。例如,它可能是一个html http错误页面而不是请求的内容。检查“ObjHttp”的其他状态信息是否有效,您肯定会发现一些显示。 – Blackhawk 2014-10-20 15:12:24