2014-10-20 162 views
0

我创建了一个成功工作的宏,它正在发送呼叫并从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 

任何帮助将非常感激!

+0

您可能会过快地提出请求 - 他们的网站可能会抵御DoS或其他事情。你可以通过在循环的每次迭代中延迟半秒来测试,并查看请求是否经过。如果是这样,您可以向下调整时间延迟,直到找到最佳点。有几个选项可以在VBA中暂停代码,你可以在这里找到(http://stackoverflow.com/questions/1544526/how-to-pause-for-specific-amount-of-time)。 – Blackhawk 2014-10-20 15:09:52

+0

当代码抛出错误时,您也可以尝试检查'ObjHttp.responseText'。这很可能会告诉你问题是什么。例如,它可能是一个html http错误页面而不是请求的内容。检查“ObjHttp”的其他状态信息是否有效,您肯定会发现一些显示。 – Blackhawk 2014-10-20 15:12:24

回答

2

您在循环中缺少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