Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Excel将信息提交到网站表单并解析结果_Excel_Forms_Vba_Internet Explorer - Fatal编程技术网

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

使用Excel将信息提交到网站表单并解析结果,excel,forms,vba,internet-explorer,Excel,Forms,Vba,Internet Explorer,下午好 我正在尝试为内部网站设置一种自动报告的方法。我在一所学院教书,需要通过学院提供的接口从教员可访问的数据库中提取一些数据。所以,我正在尝试访问我有权查看的材料,需要登录才能查看,但不想重复这些步骤,可能会重复数百次 我的想法是: 1) 使用IE和我的证书登录学院提供的界面(这样系统就知道我被授权了) 2) 为excel提供我试图跟踪的学生的ID号列表 3) 使用VBA迭代每个ID,执行以下步骤: 在相应的表格文本框中输入Excel列表中的ID号 单击“提交”按钮 单击结果页面上的第二个“

下午好

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

我的想法是:

1) 使用IE和我的证书登录学院提供的界面(这样系统就知道我被授权了)

2) 为excel提供我试图跟踪的学生的ID号列表

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

  • 在相应的表格文本框中输入Excel列表中的ID号
  • 单击“提交”按钮
  • 单击结果页面上的第二个“提交”按钮
  • 复制出现的HTML文本页面,并将其解析为我需要的信息
  • 转到下一个数字并重复
我尝试了一些我见过的其他选项(例如),但在语法上出现了错误

我试图参考的网站上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