从VBA中的Javascript获取XmlHttpRequest的ReadyState

时间:2014-05-12 18:27:58

标签: javascript ajax excel vba excel-vba

我有一个Excel文件,我们保留在我的工作中找到的东西。

我们必须登录网站才能检查某些内容。使用VBA,我已经打开了一个IE窗口,我可以登录网站并填写表格(并提交!)。

但是,我的问题出现了,因为表单是使用Javascript和AJAX提交的。因此,我无法得到响应数据(这是我开始这一切的努力)。

我的问题是:是否有任何方式我可以在VBA中循环直到Javascript XML对象获取数据,或者我是否完全疯狂尝试?

编辑:由于请求,我正在放置我目前的代码。由于我们的隐私协议,我无法发布两个说[已删除]的项目。我知道一个事实,一旦加载了响应数据,它将被附加到ID为“resultsTable”的div。但是,我尝试循环直到找到该DOM元素不起作用。

编辑#2 我终于有了一些工作。我的原始代码出了什么问题,我不知道ohtml.getElementById()函数是如何工作的,如果什么也没找到,它会返回什么。以下等待直到出现数据集。然后,它会对数据执行某些操作(遗憾的是,我无法发布)。谢谢大家!

代码

Private Sub IE_Autiomation()
    Dim i As Long, r As Range
    Dim IE As InternetExplorer, ohtml As HTMLDocument
    Dim ouser As HTMLInputElement, opass As HTMLInputElement, otext As HTMLTextAreaElement, otable As HTMLTable

    ' Create InternetExplorer Object

    Set r = Application.Union(ActiveSheet.ListObjects(1).Range, ActiveSheet.ListObjects(2).Range, ActiveSheet.ListObjects(3).Range, ActiveSheet.ListObjects(4).Range)
    Debug.Print r.Address

    Set r = Application.Intersect(r, ActiveSheet.Range("B:B,E:E,H:H")) 'Just Trust Me, Ok?

    Set IE = New InternetExplorer


    ' Send the form data To URL As POST binary request
    IE.Navigate "[Removed]"


    Do While IE.Busy
        Application.Wait DateAdd("s", 1, Now)
    Loop

    Set ohtml = IE.document
    Set ouser = ohtml.getElementById("USER")
    Set opass = ohtml.getElementById("PASSWORD")
    ouser.Value = "[removed]"


    pw = InputBox("Password?")
    opass.Value = pw
    IE.Visible = True
    ouser.form.submit

    Do While IE.Busy
        Application.Wait DateAdd("s", 1, Now)
    Loop

    Set otext = ohtml.getElementsByName("vin").Item(0)
    For Each e In r
        If e.Offset(0, -1).Value = "" And Not e.Value = "" Then
            otext.Value = otext.Value & e.Value & ", "
        End If
    Next
        Debug.Print otext.Value
        otext.Value = Left(otext.Value, Len(otext.Value) - 2)
        Debug.Print otext.Value

    Debug.Print "So far, wafles."

    For Each j In ohtml.getElementsByTagName("input")
        If j.Value = "Submit" Then
            Set ouser = j
            Exit For
        End If
    Next
    ouser.Click 
    'Here is where I need to wait for the response to load into the HTML

    ' Wait while IE loading...

    ' Clean up

    Set otable = ohtml.getElementById("resultsTable")

    Do While otable Is Nothing
        Application.Wait DateAdd("s", 1, Now)
        Set otable = ohtml.getElementById("resultsTable")
    Loop

    'IE.Quit
    Set IE = Nothing
    Set objElement = Nothing
    Set ohtml = Nothing
    Set objCollection = Nothing

    Application.StatusBar = ""
End Sub

1 个答案:

答案 0 :(得分:1)

使用准备好的等待循环。

您将需要WinAPI睡眠功能:

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'For use in timer function

然后,在您的请求发送后,您需要执行类似的操作(IE对象的示例,如果您使用代码更新Q,我可以根据您的需要进行修改)。

Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate "http://google.com"
Do While Not IE.readyState = 4
    Sleep 250
Loop

这样做是睡眠1/4秒,循环直到文档加载完毕。