使用Excel将信息提交到网站表单并解析结果
下午好 我正在尝试为内部网站设置一种自动报告的方法。我在一所学院教书,需要通过学院提供的接口从教员可访问的数据库中提取一些数据。所以,我正在尝试访问我有权查看的材料,需要登录才能查看,但不想重复这些步骤,可能会重复数百次 我的想法是: 1) 使用IE和我的证书登录学院提供的界面(这样系统就知道我被授权了) 2) 为excel提供我试图跟踪的学生的ID号列表 3) 使用VBA迭代每个ID,执行以下步骤:使用Excel将信息提交到网站表单并解析结果,excel,forms,vba,internet-explorer,Excel,Forms,Vba,Internet Explorer,下午好 我正在尝试为内部网站设置一种自动报告的方法。我在一所学院教书,需要通过学院提供的接口从教员可访问的数据库中提取一些数据。所以,我正在尝试访问我有权查看的材料,需要登录才能查看,但不想重复这些步骤,可能会重复数百次 我的想法是: 1) 使用IE和我的证书登录学院提供的界面(这样系统就知道我被授权了) 2) 为excel提供我试图跟踪的学生的ID号列表 3) 使用VBA迭代每个ID,执行以下步骤: 在相应的表格文本框中输入Excel列表中的ID号 单击“提交”按钮 单击结果页面上的第二个“
- 在相应的表格文本框中输入Excel列表中的ID号
- 单击“提交”按钮
- 单击结果页面上的第二个“提交”按钮
- 复制出现的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>
因此,我首先打开一个IE窗口并登录到界面,然后启动VBA。应用程序运行,打开一个新的IE窗口,点击该网站(保留第一个网站的登录权限),然后由于未指定的错误而崩溃
看起来这应该是直截了当的,但我只是没有看到
谢谢!
-G-在处理集合(多个对象)时,我发现最好是在可用对象之间循环,并在运行时对每个对象进行测试
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
子查询信息()
尺寸ie为对象,iFRM为长,输入为长
“Application.screenUpdateding=False”一旦它开始工作,就取消注释
设置ie=CreateObject(“InternetExplorer.Application”)
可见=真实
即浏览“网址”
'等待页面加载
在ie.busy或ie.readyState 4'readyState_COMPLETE=4时执行
多芬特
环
用ie.document.body
对于iFRM=0到.getElementsByTagName(“表单”).Length-1
如果LCase(.getElementsByTagName(“form”)(iFRM.Name)=“idinputform”,则
使用.getElementsByTagName(“表单”)(iFRM)
对于iNPT=0到.getElementsByTagName(“输入”).Length-1
选择Case LCase(.getElementsByTagName(“输入”)(iNPT.Name)
案例“id_num”
.getElementsByTagName(“输入”)(iNPT).Value=123
案例“刷新程序”
.getElementsByTagName(“输入”)(iNPT).Value=“菜单2”
结束选择
下一次输入
.submit'我曾经有过一段时间,我无法通过使用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
试试这个IE.document.getElementsByName(“idinputform”).Item(0)。Value=“myID”
其中myID
=学生id的单元格值或您目前硬编码的任何id。唉,不是。IE.document.getElementsByName(“idinputform”).Item(0)。Value=“myID”不起作用。IE.document.getElementByName(“数字”).Value=“myID”也不支持。其他想法?啊,我读错了getElementByName(“ID_NUM”)。Item(0)。Value仍然没有什么乐趣,但开始对我的困惑感觉更好:-)IE.document.getElementByName(“ID_NUM”)。Item(0)。Value=“myID”生成一个错误-运行时错误-2147467259(80004005):Automation error/Unspecified error。在此期间,我将开始骑自行车通过吉普德的方法。谢谢你一直以来的帮助!
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