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

时间:2016-11-11 22:01:22

标签: excel vba excel-vba internet-explorer

我希望有人可以提供帮助。我试图加快填充webform的过程,这个过程必须使用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窗口带回前台,所以我试图找到合适的线来做到这一点。当我尝试运行代码时,我得到一个" Object Required"错误在:

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="">

1 个答案:

答案 0 :(得分: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.