首页 > 解决方案 > 如何使用 VBA/Excel 使用 IE 自动化数据输入过程?

问题描述

我对 VBA 非常熟悉,并且正在尝试使用 VBA 在 Excel 中设置一个宏表,以部分自动化我公司的手动数据输入过程,以帮助减少时间和错误成本。

一个成功的脚本将完成以下任务:

  1. 启动 IE 并导航到指定的网站。
  2. 使用提供的凭据登录。
  3. 在具有唯一 ID 的字段中输入一个值,然后按“下一步”按钮
  4. 在 200 个字段中输入相应的数据,每个字段都有唯一的 ID(例如,LastName_0 对应于单元格 A2,LastName_1 对应于 A3,等等)

目前我只完成了第 1 步,其中脚本启动 IE 并导航到有问题的网站(https://iapps.courts.state.ny.us/chrs/SignIn),但是,我得到了一个运行时尝试插入站点的用户名和密码时出现错误 438(对象不支持此属性或方法)。

我尝试了在谷歌搜索中找到的多个不同代码,所有这些代码都返回相同的错误。目前,我在宏工作簿的第 2 页上列出了用户名和密码,如代码中所引用。鉴于我缺乏知识,我不确定我的错误存在于哪里。

作为参考,我们在 VBA 7.1、Excel 2013 和 IE 11 上运行。

Sub login()

    Const Url$ = "https://iapps.courts.state.ny.us/chrs/SignIn"

    Dim UserName As String, Password As String, LoginData As Worksheet
    Set LoginData = ThisWorkbook.Worksheets("Sheet2")
    UserName = LoginData.Cells(1, "B").Value
    Password = LoginData.Cells(2, "B").Value

    Dim ie As Object
    Set ie = CreateObject("InternetExplorer.Application")

    With ie

        .navigate Url
        ieBusy ie
        .Visible = True

        Dim oLogin As Object, oPassword As Object
        Set oLogin = .document.getElementsByName("txtUserName")(0) 
{This is where the 438 error occurs ^}
        Set oPassword = .document.getElementsByName("pwPassword")(0)

        oLogin.Value = UserName
        oPassword.Value = Password
        .document.forms(0).submit

    End With

End Sub

Sub ieBusy(ie As Object)
    Do While ie.Busy Or ie.readyState < 4
        DoEvents
    Loop
End Sub

目前,工作表 2 在单元格 B1 中设置了用户 ID,在单元格 B2 中设置了密码。

预期结果将是成功登录,此时我将努力找出要遵循的页面和实际数据输入页面的代码。

标签: excelvbaweb-scraping

解决方案


使用适当的页面加载等待。使用 id 以及它们更快。我使用 css id 选择器 eg #txtUserName,它相当于getElementById但更快。

Option Explicit
'VBE > Tools > References: Microsoft Internet Controls
Public Sub Login()
    Dim ie As InternetExplorer
    Const URL As String = "https://iapps.courts.state.ny.us/chrs/SignIn"
    Dim userName As String, password As String, loginData As Worksheet

    Set ie = New InternetExplorer
    Set loginData = ThisWorkbook.Worksheets("Sheet2")
    userName = loginData.Cells(1, "B").Value
    password = loginData.Cells(2, "B").Value

    With ie
        .Visible = True
        .Navigate2 URL

        While .Busy Or .readyState < 4: DoEvents: Wend

        With .document
            .querySelector("#txtUserName").Value = userName
            .querySelector("#pwPassword").Value = password
            .querySelector("#btnSubmit").Click
        End With

        Stop
    End With
End Sub

推荐阅读