【问题标题】:Excel VBA loop to input data in webpageExcel VBA循环在网页中输入数据
【发布时间】:2017-12-01 00:55:58
【问题描述】:

我浏览了很多文章,并且能够从 excel 将数据输入到网页中。现在我正在尝试使用循环,因为我必须在同一页面中输入 10 到 50 次数据。

这里是代码

Sub vfcp()

Set objIE = CreateObject("InternetExplorer.Application")
objIE.Top = 100
objIE.Left = 100
objIE.Width = 800
objIE.Height = 800
objIE.AddressBar = 1
objIE.StatusBar = 1
objIE.Toolbar = 1
objIE.Visible = True

Dim Input

Range("A2").Select

objIE.Navigate ("https://www.askebsa.dol.gov/VFCPCalculator/WebCalculator.aspx")

Do Until Selection.Offset(0, 0).Value = ""

  If objIE.ReadyState = 4 Then
  Input = Selection.Offset(0, 2).Value

  objIE.document.GetElementByID("_ctl0_MainContent_txtPrincipal").Value = Input

  objIE.document.GetElementByID("_ctl0_MainContent_cmdCalculate").Click

  Selection.Offset(1, 0).Select

  End If

Loop
End Sub

这段代码的问题是,我有一个包含 10 个日期的列表。循环输入列表的最后日期。我正在尝试输入第一个日期并单击提交,然后等待页面加载并输入第二个日期,如果有空单元格则停止循环。

【问题讨论】:

  • 尝试 doevents 或 application.wait(估计花费的时间)。您还需要检索输出。

标签: vba excel loops webpage


【解决方案1】:

输入日期的代码在哪里?没有它们就无法点击。

"然后等待页面加载并输入第二个日期"

您可以通过在 End If 和 Loop 行之间插入以下内容来实现此目的。

    'Allows IE to load
    While objIE.ReadyState <> 4
        DoEvents
    Wend

【讨论】:

  • 嗨,谢谢你的想法。为了缩短代码,我实际上没有在这里显示日期输入。我只使用输入变量来显示它。顺便说一句,我尝试添加您的代码,但没有成功。
  • 你能把整个代码和一些测试数据贴出来吗?
  • 嘿兄弟,下面的代码有效。 While objIE.Busy DoEvents Wend我知道这一点,你的代码是一样的,但不知道为什么它不起作用
  • 完美!我过去通常使用它而不是 ReadyState。但是,这似乎有时不起作用。它们实际上是同一回事。 stackoverflow.com/questions/10071048/…
【解决方案2】:

这应该不会太难。我访问了那个 URL,按 F12 键查看网站背后的代码,然后开始搜索适当的 ID 名称('Principal:'、'Loss Date:'等)。就是这样。运行脚本以查看工作版本。哦,是的,在运行代码之前设置对“Microsoft Internet Controls”的引用。

Sub TryThis()

Dim ie As SHDocVw.InternetExplorer
Set ie = New SHDocVw.InternetExplorer
ie.Visible = True
ie.Navigate "https://www.askebsa.dol.gov/VFCPCalculator/WebCalculator.aspx"

Do
DoEvents
Loop Until ie.readystate = 4
'ie READYSTATE has 5 different status codes, here we are using status 4:

Call ie.Document.GetElementByID("_ctl0_MainContent_txtPrincipal").SetAttribute("value", "100000")
Call ie.Document.GetElementByID("_ctl0_MainContent_txtLossDateMonth").SetAttribute("value", "01")
Call ie.Document.GetElementByID("_ctl0_MainContent_txtLossDateDay").SetAttribute("value", "01")
Call ie.Document.GetElementByID("_ctl0_MainContent_txtLossDateYear").SetAttribute("value", "2016")

Call ie.Document.GetElementByID("_ctl0_MainContent_txtRecoveryDateMonth").SetAttribute("value", "01")
Call ie.Document.GetElementByID("_ctl0_MainContent_txtRecoveryDateDay").SetAttribute("value", "01")
Call ie.Document.GetElementByID("_ctl0_MainContent_txtRecoveryDateYear").SetAttribute("value", "2017")

Call ie.Document.GetElementByID("_ctl0_MainContent_txtFinalPaymentMonth").SetAttribute("value", "12")
Call ie.Document.GetElementByID("_ctl0_MainContent_txtFinalPaymentDay").SetAttribute("value", "30")
Call ie.Document.GetElementByID("_ctl0_MainContent_txtFinalPaymentYear").SetAttribute("value", "2017")

'to find the "<input……/>" tag hyper link and to click the button
Set AllInputs = ie.Document.getelementsbytagname("input") 'you can use any tagname as you wish
    For Each hyper_link In AllInputs
        If hyper_link.Name = "_ctl0:MainContent:cmdCalculate" Then 'you can use .name, .id etc
            hyper_link.Click
            Exit For
        End If
    Next
Do

DoEvents
Loop Until ie.readystate = 3
Do

DoEvents
Loop Until ie.readystate = 4


End Sub

如果您想抓取结果,请刷新 URL 并按照我上面描述的方式执行操作:F12,搜索相关 ID 和/或名称,然后将它们拉入 Excel 中的工作表中。我会把它留给你来弄清楚那部分。这将是一次很好的学习经历!!!

【讨论】:

  • 谢谢兄弟的回复,我代码中的这个while循环解决了问题While objIE.Busy DoEvents Wend
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 2020-06-25
  • 2019-12-24
  • 1970-01-01
相关资源
最近更新 更多