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

Gor*_*ith 9 forms excel internet-explorer vba

下午好,

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

我的想法是:

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

2)在我试图跟踪的学生身上提供一份ID号列表

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

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

我已经尝试了一些我见过的其他选项(例如VBA进入数据在线和提交表单)但是语法上出现了错误.

我试图引用的网站上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>
Run Code Online (Sandbox Code Playgroud)

我在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
Run Code Online (Sandbox Code Playgroud)

所以,我首先打开IE窗口并登录界面,然后启动VBA.应用程序运行,打开一个新的IE窗口,点击网站(从第一个保留我的登录权限),然后崩溃与未指定的错误.

看起来这应该是直截了当的,但我只是没有看到它.

谢谢!-G-

小智 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
Run Code Online (Sandbox Code Playgroud)

页面上可能有多个表单。仔细检查每一项,直到找到名称正确的一项。在该表单定义内,有多个输入元素;循环遍历每个并根据需要应用参数。完成后,提交表单并退出循环。