我有一个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
答案 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秒,循环直到文档加载完毕。