下午好,
我试图为内部网站设置自动化某些报告的方法。我在一所大学任教,需要通过大学提供的界面从教师可访问的数据库中提取一些数据。所以,我试图访问我有权查看的材料,需要登录查看,但不要重复这些步骤数百次。
我的想法是:
1)使用我的凭证使用IE登录大学提供的界面(因此系统知道我已获得授权)。
2)在我试图跟踪的学生身上提供一份包含身份证号码列表的抄送
3)使用VBA迭代每个ID,执行以下步骤:
我已尝试了一些我见过的其他选项(例如VBA to Enter Data Online and Submit Form),但语法错误。
我试图引用的网站上HTML编码的相关部分是:
<FORM ACTION="action" METHOD="POST" NAME="idinputform">
Enter Number Here:
<INPUT TYPE="number" NAME="ID_NUM" SIZE="9" MAXLENGTH="9">
<INPUT TYPE="hidden" NAME="refresh_proc" VALUE="menu_1">
<INPUT TYPE="submit" VALUE="Submit"> <INPUT TYPE="reset" VALUE="Reset">
</FORM>
我在Excel中得到的是:
Sub QueryInfo()
Application.ScreenUpdating = False
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
IE.Navigate "website address"
IE.Document.idinputform.number.Value = "000000000"
Application.ScreenUpdating = True
End Sub
因此,我首先打开IE窗口并登录界面,然后启动VBA。该应用程序运行,打开一个新的IE窗口,点击网站(从第一个保留我的登录权限),然后崩溃与未指定的错误。
看起来这应该是直截了当的,但我只是没有看到它。
谢谢! -G -
答案 0 :(得分:1)
在处理集合(多个对象)时,我发现最好循环遍历可用对象,并在每个对象中进行测试。
Sub QueryInfo()
Dim ie As Object, iFRM As Long, iNPT As Long
'Application.ScreenUpdating = False 'uncomment this once it is working
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
ie.Navigate "website address"
'wait untli the page loads
Do While ie.busy Or ie.readyState <> 4 'READYSTATE_COMPLETE = 4
DoEvents
Loop
With ie.document.body
For iFRM = 0 To .getElementsByTagName("form").Length - 1
If LCase(.getElementsByTagName("form")(iFRM).Name) = "idinputform" Then
With .getElementsByTagName("form")(iFRM)
For iNPT = 0 To .getElementsByTagName("input").Length - 1
Select Case LCase(.getElementsByTagName("input")(iNPT).Name)
Case "id_num"
.getElementsByTagName("input")(iNPT).Value = 123
Case "refresh_proc"
.getElementsByTagName("input")(iNPT).Value = "menu_2"
End Select
Next iNPT
.submit '<~~ submit the form
Do While ie.busy Or ie.readyState <> 4: DoEvents: Loop
Exit For
End With
Exit For
End If
Next iFRM
End With
With ie.document.body
'should be at the form's destination
End With
Application.ScreenUpdating = True
End Sub
页面上可能有多个表单。浏览每一个,直到找到名称正确的那个。在表单定义中,是多个输入元素;循环每个并根据需要应用参数。完成后,提交表单并退出循环。
答案 1 :(得分:0)
我曾经有过这样的时间,在我的生活中,我不能通过使用HTML元素来获得表单提交...我找到了一个很好的小工作,找出网站设置焦点的位置,然后使用按键以使输入成为必要。
我承认它并不优雅,但它让我了解了导致我很多深夜的僵局。
Application.Wait (DateAdd("S", 1, Now()))
DoEvents
Call SendKeys("{TAB}", True)
Application.Wait (DateAdd("S", 2, Now()))
Text2Clipboard (Format(Password1, "00000000"))
Application.Wait (DateAdd("S", 1, Now()))
DoEvents
Call SendKeys("^v", True)
Application.Wait (DateAdd("S", 1, Now()))
DoEvents
Call SendKeys("{TAB}", True)
Application.Wait (DateAdd("S", 2, Now()))
Text2Clipboard (Password2)
Application.Wait (DateAdd("S", 1, Now()))
DoEvents
Call SendKeys("^v", True)
Application.Wait (DateAdd("S", 1, Now()))
DoEvents
Call SendKeys("~", True)
Application.Wait (DateAdd("S", 2, Now()))
Dim Counter As Integer
Counter = 0
Do While IE.Busy
Application.Wait (DateAdd("S", 5, Now()))
Loop
Application.Wait (DateAdd("S", 2, Now()))
Dim links, link As Object
Set links = IE.Document.getElementById("t-mainmenu").getElementsByTagName("a")
links(1).Click
Do While IE.Busy
Application.Wait (DateAdd("S", 5, Now()))
Loop