使用Excel向网站表单提交信息并解析结果

时间:2016-01-25 20:28:27

标签: excel forms vba internet-explorer

下午好,

我试图为内部网站设置自动化某些报告的方法。我在一所大学任教,需要通过大学提供的界面从教师可访问的数据库中提取一些数据。所以,我试图访问我有权查看的材料,需要登录查看,但不要重复这些步骤数百次。

我的想法是:

1)使用我的凭证使用IE登录大学提供的界面(因此系统知道我已获得授权)。

2)在我试图跟踪的学生身上提供一份包含身份证号码列表的抄送

3)使用VBA迭代每个ID,执行以下步骤:

  • 在Excel的列表中输入ID号到相应的表单文本框
  • 点击"提交"按钮
  • 点击辅助"提交"结果页面上的按钮
  • 复制出现的HTML文本页面并将其解析出来以获取我需要的信息
  • 转到下一个号码并重复

我已尝试了一些我见过的其他选项(例如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 -

2 个答案:

答案 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