我刚刚开始使用VBA,我正在尝试编写一个脚本,与网站进行以下交互:
登录网站
在后续网页中,从Excel电子表格中填写名字和姓氏,然后点击"提交"
在随后的网页中,复制生成的ID号
我已设法通过getElementsById
让我的代码登录网站,因为网站的元素没有任何名称。但是,excel会为后续代码返回类型不匹配错误,以便与后续网页进行交互。
以下是后续网页中firstname
,lastname
,submit
字段的HTML脚本:
名字字段:
<input class="tfield-def-edit form-control" id="tfield-def-edit_12803" type="text">
姓氏字段:
<input class="tfield-def-edit form-control" id="tfield-def-edit_12804" type="text">
提交按钮:
<button class="btn btn-block btn-success" id="btn-submit-registration" type="button">Submit</button>
以下是我的VBA代码:
Sub getid()
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
URL = "https://example.website"
IE.Navigate2 URL 'load webpage
Do While IE.readyState <> 4 Or _
IE.Busy = True
DoEvents
Loop
'login using password
Set login = IE.document.getElementById("passkey")
login.Value = "123456"
Set loginbutton = IE.document.getElementById("login")
loginbutton.Click
-------------------------------CODE ABOVE WORKS-----------------------------
------------------------------ERRORS OCCUR BELOW----------------------------
While IE.Busy
DoEvents
Wend
Dim i As Integer
Dim LastRow as Long
With Worksheets("Sheet1")
Set LastRow = .Range("A" & .Rows.Count).End(xlUp).Rows
For i = 1 To LastRow
Set firstname_field = IE.document.getElementById("tfield-def-edit_12803") 'error most probably occur here
Set lastname_field = IE.document.getElementById("tfield-def-edit_12804")
Set submitbutton = IE.document.getElementById("btn-submit-registration")
firstname_field.Value = .Range("B" & i).Value
lastname_field.Value = .Range("C" & i).Value
submitbutton.Click
While IE.Busy
DoEvents
Wend
Set newregistrationbutton = IE.document.getElementByClassName("btn btn-default")
Set codeid = IE.document.getElementsByClassName("col-xs-6 col-xs-offset-3")
.Range(D & i).Value = codeid(0).textContent
newregistrationbutton.Click
Next i
End With
End Sub
我最好的猜测是,名字和姓氏字段是文本元素,不能是Set
的值。当我尝试删除所有文本元素的Set
时,VBA会抛出一个错误&#34; Object Required&#34;。
我还试图复制第一个和最后一个名称页面成功运行后在后续页面中生成的ID。我无法测试此代码的最后4行,因为上述代码无效。
我已经花了好几天的时间,如果你们所有人都能对此有所了解,我将非常感激。
答案 0 :(得分:0)
你的代码工作得很好我只是在虚拟页面上测试它很好,我认为是带有字段的页面(“tfield-def-edit_12803”,“tfield-def-edit_12804”)你是试图改变它的值总是改变所以总是给你
运行时错误'13':输入不匹配
所以你必须要做的就是找出它在页面中的创建位置然后从那里获取ID,我希望这有帮助。
或者可能在文档准备好后生成字段尝试等待5秒然后获取数据使用此等待
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub test()
Dim i As Long
For i = 1 To 10
Debug.Print Now()
Sleep 5000 'wait 5 seconds
Next i
End Sub