【问题标题】:Clicking an online excel download button with VBA使用 VBA 单击在线 excel 下载按钮
【发布时间】:2020-07-11 14:32:15
【问题描述】:

我的目标是点击这个网站上的 excel 下载按钮。我不断收到“自动化错误”。在我的 while 循环中,接口是未知的。


Sub GetData()
Dim IE As InternetExplorerMedium
Dim HTMLDoc As HTMLDocument
Dim objElement As HTMLObjectElement

Set IE = New InternetExplorerMedium
With IE
    .Visible = True
    .Navigate "https://www.pimco.com/en-us/investments/mutual-funds"
    Do While .readyState = 4: DoEvents: Loop
    Do Until .readyState = 4: DoEvents: Loop
    .document.getElementById("csvLink").Click
End With

Set IE = Nothing
End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    这里有一堆函数可以用来帮助清理代码。 https://stackoverflow.com/a/59721369/12685075

    我不会尝试将所有这些都塞进 With 子句中。

    我会考虑用函数将每个步骤分成自己的部分。

    然后检查就绪状态,并在单击之前先使用错误处理确保元素存在。

    话虽如此,我要说的是,您可以跳过 IE 资源管理器加载并直接使用 XMLHTTP 请求获取链接。因此,在 chrome 中打开页面,打开 DevTools,刷新页面,下载 CSV,然后开始查看网络请求。

    你会找到一个代表下载文件的链接,它很可能是一个直接链接,你可以使用参数让 XMLHTTP 跳过页面内容,每次都获取文件,而不用担心加载元素,如 CSS / 格式/ 字体。

    【讨论】:

      【解决方案2】:

      你遇到麻烦的一些解释:

      • 不要使用InternetExplorerMedium
        • 这里的问题是IE打开了两次。第一次打开后,立即再次关闭,并在另一个实例中加载 URL。但是这个实例不再赋值给IE变量,不能被宏引用。您可以在执行宏时观察到这一点。 IE 似乎抽搐了一次。
      • Do While .readyState = 4: DoEvents: LoopDo Until .readyState = 4: DoEvents: Loop 行等待对面。
        • 4 表示页面已完全加载。所以你可以使用Do While .readyState <> 4: DoEvents: LoopDo Until .readyState = 4: DoEvents: Loop。两个循环之一就足够了。
      • 页面在 IE 报告完成后加载动态内容。
        • 因此,您必须在加载该内容之前中断。最简单的方法是硬中断。查看下面代码中的那部分。
      • 您必须触发下载。
        • 为此,您需要 Sendkeys()。这不是一件好事,但在这里也很难避免。正如 Peyter 所假设的那样,我认为没有直接下载链接,因为我假设下载文件仅根据页面显示的数据根据​​请求生成。至少这是我对此类下载的体验。
        • 请阅读我在 Sendkeys() 行上方编写的宏中的 cmets,以便之后在您的计算机上找到下载的文件。

      下面是有效的代码:

      Sub GetData()
        Dim IE As Object
        
        Set IE = CreateObject("internetexplorer.application")
        IE.Visible = True
        IE.Navigate "https://www.pimco.com/en-us/investments/mutual-funds"
        Do Until IE.readyState = 4: DoEvents: Loop
        'Manual break to load dynamic content after
        'the IE reports the ready state 'complete' (4)
        'The last three values are hours, minutes, seconds
        Application.Wait (Now + TimeSerial(0, 0, 10))
        
        'Now we can click the button
        IE.document.getElementById("csvLink").Click
        
        'Here you need sendkeys to trigger the save button
        'Don't touch anything while the code runs
        'Sendkeys will send the key combination in the brackets
        'to the application which has the focus
        'The file will be saved to your standard donload directory
        'or to the download directory you placed in the IE settings
        'if you did that
        Application.SendKeys ("%{S}")
        
        'Clean up
        IE.Quit
        Set IE = Nothing
      End Sub
      

      【讨论】:

      • 我的默认浏览器是 chrome 而不是 Internet Explorer 会影响代码吗?我认为这可能是因为每次我运行某些东西时,ie 浏览器都会打开并立即崩溃。然后,Chrome 浏览器会打开完整加载的网页。但是,我无法更改工作计算机上的默认浏览器。
      • @Anne IE 在宏中被显式控制。这与系统中设置的默认浏览器无关。你试过我的宏而不是你的吗?有了你的第一个 IE 实例对我来说也崩溃了,但是 IE 又被打开了。我的默认浏览器是 FireFox。使用我的宏下载所需文件对我来说没有问题。
      • 嗯,这很奇怪。我不确定为什么当我使用你的代码时它会崩溃。不过谢谢!
      • @Anne 如果可能,请在另一台计算机上尝试宏。
      • 有没有办法调整代码让它直接导入到我运行宏的excel表中?
      猜你喜欢
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多