【问题标题】:VBA button click working sometimesVBA按钮单击有时会起作用
【发布时间】:2018-06-18 21:45:47
【问题描述】:

我刚刚开始使用 VBA,我正在按照一个简单的教程使用 VBA 在 IE 中进行 Google 搜索。

Sub FillInternetForm()
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
IE.Navigate "https://www.google.com"
IE.Visible = True
While IE.busy
DoEvents 'wait for page to finish loading
Wend
IE.Document.All("q").Value = ThisWorkbook.Sheets("sheet1").Range("a1")
IE.Document.All("btnK").Click
End Sub

我多次运行此代码(按 f5 键),似乎 IE.Document.All("btnK").Click 仅在某些时候有效。 有时会出现Macros pop up,有时不会。 我只是想知道这可能是什么原因,或者是否有任何方法可以防止这种情况发生。

我正在使用 Excel 2013

谢谢

【问题讨论】:

  • 有时会弹出是什么意思?运行代码时你看到那个框了吗?
  • 只有在我按 f5 时才会出现弹出窗口。当它弹出时,我必须单击“运行”才能开始 marco。当它不弹出时,宏将简单地运行。

标签: vba excel web-scraping automation


【解决方案1】:

您可以完全避免使用搜索按钮,并将搜索词直接连接到 URL 中。例如:

Option Explicit
Sub FillInternetForm()
    Dim IE As Object, searchTerm As String
    searchTerm = ThisWorkbook.Worksheets("Sheet1").Range("A1")
    Set IE = CreateObject("InternetExplorer.Application")
    With IE
        .navigate "https://www.google.co.uk/search?safe=strict&source=hp&ei=XiooW8rAKMeZsgGji57gBw&q=" & searchTerm & "&oq=" & searchTerm & "&gs_l=psy-ab.3..0l2j0i131k1j0l2j0i131k1j0j0i131k1l3.1481.2118.0.2518.7.6.0.0.0.0.124.555.0j5.6.0..3..0...1.1.64.psy-ab..1.6.657.6..35i39k1.103.n22OrWdTQrs"
        .Visible = True
        While .Busy Or .readyState < 4: DoEvents: Wend
     Stop '<= Delete this line
    .Quit
     End With
End Sub

如果您进行示例搜索,您可以将变量名称中的 URL 和编辑捕获为字符串,如上所示。

正如@RyszardJędraszyk 解释的那样(非常感谢),您可能有一个动态加载的网页,当您尝试抓住某个元素时,其中的内容不可用。在这种情况下,您可以有一个循环,该循环尝试设置为您知道应该存在的元素并且循环 while is nothing (with timeout)。

Ryszard 进一步指出您缺少完全加载的 ReadyState = 4(这确实意味着动态页面,例如,实际上已完全加载,或者延迟加载页面具有可见的所有项目(您可能需要滚动才能实现这个。我上面的回答向您展示了如何使用ReadyState

我不确定这个弹出窗口的原因,所以我只是用最简单的方法来获取感兴趣的页面,以尝试降低发生这种情况的风险。这不是我曾经发生过的事情,恐怕也不会重现。

【讨论】:

  • 感谢您的快速回复。我明白你在做什么,但我想知道为什么“点击”有时只起作用,或者我只是运气不好。
  • @Jummi 您没有在DoEvents 循环中检查IE 对象的ReadyState 属性。 4 表示满载。
  • @RyszardJędraszyk 所以我将代码修改为While IE.busy Or IE.Readystate &lt; 4,但这似乎无法解决问题。
  • @Jummi 有时 JavaScript 也会加载到页面上。 BusyReadyState 都不会跟踪它。尝试在IE.Document.All("q").Value 行之前添加5 秒等待,Application.Wait (Now + TimeValue("00:00:05")) 如果使用此行代码总是成功执行,则为JS 错误。
  • Jummi - Ryszard 给了你几个很好的解释点。我想我应该在匆忙绕过它们时提到这些。我会更新的。
猜你喜欢
  • 2022-08-02
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-09
  • 2023-04-05
相关资源
最近更新 更多