【问题标题】:VBA-Excel: Filling forms in an IE WindowVBA-Excel:在 IE 窗口中填写表格
【发布时间】:2017-03-26 05:04:14
【问题描述】:

我希望有人可以提供帮助。我正在尝试使用存储在 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 的文本框姓氏或名字。更重要的是, 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="">

【问题讨论】:

  • 该页面上是否有任何框架/iframe?
  • 您能提供一个实际的网络表单 URL 吗?您也可以尝试使用 XHR 而不是 IE 自动化,您只需在手动提交表单后在 IE 开发者工具网络选项卡中检查请求,并重现它。
  • 表单实际上是在一个 iframe 中。至于网址,您必须登录才能查看表单,所以我不确定我是否可以,或者如何
  • IE.document.getElementById("iFrameIdHere").document.getElementById("idec").Value = "John"

标签: vba excel internet-explorer


【解决方案1】:

为什么不自动化记录过程呢?登录信息可以存储在 Excel 中,并通过宏从单元格中读取其值。

正如 Tim Williams 所建议的,如果网站上有 iframe,请使用(对我而言,它仅适用于包含的 contentwindow):

IE.document.getElementById("iFrameIdHere").contentwindow.document.getEleme‌ntById("idec").Value = "John"

而不是Application.Wait 使用:

Do Until IE.ReadyState = 4 And IE.Busy = False
    DoEvents
Loop

它会在页面快速加载时为您节省大量时间,并在加载超过等待时间时防止错误。仅在页面重新加载后使用它(意味着在导航或导致页面重新加载的任何原因之后,尤其是 HTML 元素上的.click

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

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)

一个好的做法是在宏结束时将值设置为 1。

【讨论】:

  • 谢谢!包括 contentwindow 也为我做了。就自动化登录而言,确实没有理由不包括它,所以我现在补充一点,因为我已经成功完成了主要部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
  • 2015-11-02
  • 2019-11-26
  • 2018-12-15
相关资源
最近更新 更多