VBA Excel:在IE窗口中填写表单

VBA Excel:在IE窗口中填写表单,vba,excel,internet-explorer,Vba,Excel,Internet Explorer,我希望有人能帮忙。我正在尝试加快填写网络表单的过程,该表单必须使用excel中存储的信息填写几十次或数百次 要做到这一点,我需要一个按钮来打开一个IE窗口并导航到某个网站的登录页面(我已经猜出了这一点)。然后,用户可以登录并导航到需要填写的表单。然后,我希望用户能够返回excel页面,单击另一个按钮,它将自动填充几个下拉列表和文本框 在Excel中,我已经有了一些代码,允许用户搜索需要转到表单的特定信息集,因此他们所要做的就是单击按钮将其传递过来。代码的第一位是: Public IE As Ob

我希望有人能帮忙。我正在尝试加快填写网络表单的过程,该表单必须使用excel中存储的信息填写几十次或数百次

要做到这一点,我需要一个按钮来打开一个IE窗口并导航到某个网站的登录页面(我已经猜出了这一点)。然后,用户可以登录并导航到需要填写的表单。然后,我希望用户能够返回excel页面,单击另一个按钮,它将自动填充几个下拉列表和文本框

在Excel中,我已经有了一些代码,允许用户搜索需要转到表单的特定信息集,因此他们所要做的就是单击按钮将其传递过来。代码的第一位是:

Public IE As Object

Public Sub OpenIE()
    Set IE = CreateObject("InternetExplorer.Application")
    IE.Visible = True
    IE.Navigate "loginpage url"
End Sub
然而,我遇到的问题是,一旦用户登录并导航到表单,就会有不同的函数访问同一IE窗口。现在我有了这个:

Sub FillMacro()

       Dim sh As Object, oWin As Object

Set sh = CreateObject("Shell.Application")

For Each oWin In sh.Windows
    If TypeName(oWin.document) = "HTMLDocument" Then
        Set IE = oWin
        Exit For
    End If
Next

    IE.Visible = True
    Application.Wait (Now + TimeValue("00:00:01"))
    IE.document.getElementById("idec").Value = "John"
    Application.Wait (Now + TimeValue("00:00:01"))
    IE.document.getElementById("idee").Value = "Smith"
End Sub
我从这个论坛上的其他帖子中得到的大部分信息,虽然我在这方面有点新手,但问题似乎是出于某种原因VBA找不到id为LastName或FirstName的文本框。更重要的是,IE.Visible=True不会将IE窗口带回前台,因此我正在尝试找到合适的行来实现这一点。当我尝试运行代码时,在以下位置出现“需要对象”错误:

IE.document.getElementById("idec").Value = "John"
我已经尝试搜索这个网站,并将继续寻找,但在此期间任何帮助将不胜感激

在Internet Explorer页面上,以下是我尝试填充的第一个文本框的行:

<input name="componentListPanel:componentListView:1:component:patientLastNameContainer:patientLastName" class="input300" id="idec" type="text" maxlength="60" value="">

为什么不同时自动化日志记录过程?登录名可以存储在Excel中,其值可以通过宏从单元格中读取

正如Tim Williams所建议的,如果网站上有Iframe,请使用(对我来说,它只适用于包含contentwindow的内容):

不要使用
应用程序。等待
使用:

Do Until IE.ReadyState = 4 And IE.Busy = False
    DoEvents
Loop
当页面快速加载时,它将为您节省大量时间,并防止加载超过等待时间时出错。仅在页面重新加载后使用它(指在导航或任何导致页面重新加载的因素之后,尤其是
。单击HTML元素上的

使用早期绑定,它比创建对象快一点。它可以根据页面加载速度将性能提高几个百分点,页面加载速度越快,增加的幅度就越大

Set IE = New InternetExplorer
最后,您可以切换加载图片,这取决于您是否需要从网站下载图片

Public Sub ShowPictures(ByVal EnabledStatus As Boolean)

Public ScrapingCancelled as Boolean
Dim obj_Shell
Dim v_Result As Variant
Set obj_Shell = CreateObject("WScript.Shell")

'Reads the registry key that determines whether 'Show pictures' Internet Explorer advanced setting is enabled

v_Result = obj_Shell.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Display Inline Images")

Select Case v_Result
    Case "yes"  'Pictures are displayed
            If EnabledStatus = False Then _
            obj_Shell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Display Inline Images", "no", "REG_SZ"
    Case "no"  'Pictures are not displayed
            If EnabledStatus = True Then _
            obj_Shell.RegWrite "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Display Inline Images", "yes", "REG_SZ"
    Case Else
            ScrapingCancelled = True
End Select

End Sub
未加载图像:

ShowPictures (0)
ShowPictures (1)
加载的图像:

ShowPictures (0)
ShowPictures (1)

一个好的做法是在宏的末尾将值设置为1。

该页面上有任何框架/iframe吗?您可以提供一个实际的Web表单URL吗?您也可以尝试使用XHR而不是IE automation,您只需在手动表单提交后在IE developer tools network选项卡中检查请求,并复制它。表单实际上位于iframe中。如至于URL,您必须登录才能查看表单,因此我不确定是否可以,也不确定如何
IE.document.getElementById(“iFrameIdHere”).document.getElementById(“idec”).Value=“John”
谢谢!包括contentwindow也为我做到了这一点。就自动登录而言,没有理由不包括它,因此我补充说,现在我已经成功地完成了主要部分的工作。