VBA按钮有时会单击工作

时间:2018-06-18 21:45:47

标签: excel vba excel-vba web-scraping automation

我刚刚开始使用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

谢谢

1 个答案:

答案 0 :(得分: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解释的那样(非常感谢),您可能有一个动态加载的网页,当您尝试抓住元素时,内容不可用。在这种情况下,你可以有一个循环,它试图设置一个你知道应该存在的元素和循环而什么都不是(有超时)。

Ryszard进一步指出你错过了你的ReadyState = 4满载(这意味着一个动态页面,例如,实际上是完全加载的,或者一个延迟加载的页面显示所有项目(你可能需要滚动)实现这一目标。上面的答案向您展示了如何使用ReadyState

我不确定这个弹出窗口的原因,所以我只是用最简单的路线来获取感兴趣的页面,试图减少发生这种情况的风险。这不是我曾经发生的事情或者我可能会重现的事情。