如何使用 Excel VBA 登录网站并下载文件

Posted

技术标签:

【中文标题】如何使用 Excel VBA 登录网站并下载文件【英文标题】:How to login to a website and download a file using Excel VBA 【发布时间】:2013-06-27 23:40:12 【问题描述】:

几天来,我一直在兜圈子,试图解决这个问题。

我正在尝试使用 VBA 和 InternetExplorer 对象登录到站点并下载文件。问题是,一旦代码单击超链接,我会从 Internet Explorer(在我的情况下为版本 10)收到提示:“您要打开还是保存“file.xls”?我现在该怎么办?

这是我尝试过的:

    URLDownloadToFile。这不起作用,因为不登录就无法访问该文件。

    Internet Explorer 中禁用打开/保存提示。也不去。此提示被设计为一种安全“功能”,旨在不被禁用。有些人提到手动输入注册表项可以解决问题,但它对我不起作用。 (也许我没有做正确的注册表项?

    是否有用于禁用提示的 Internet Explorer 下载管理器插件?我还没有找到。

    SendKeys ("%o") '(Alt + o)。这应该“单击”打开文件。为什么不使用它?因为不靠谱。用户有时会切换活动窗口。 (有没有办法“发送密钥”到特定窗口?)

    使用 WinHttpRequest。这应该可行,但学习如何使用 WinHttpRequest 并重写我的所有代码似乎需要做很多工作。 (可能懒人有更多的工作)此外,调试 WinHttpRequest 似乎要困难得多,因为在 IE 中我可以看到正在发生的事情。

    iMacros。理论上,一旦我在网站上输入字段,我就可以使用 iMacros 下载文件。 iMacros 的问题是加载和关闭需要时间。它必须用 iMacro 加载 FireFox,然后加载网站,然后关闭 Firefox。我的 VBA 程序旨在下载数百个文件。

帮助!谢谢。

【问题讨论】:

您尝试过的很棒的事情清单!如果所有 SO 的新用户都会写出这么棒的第一个问题! 【参考方案1】:

解决方案是使用 cURL 而不是尝试获取 Explorer 的“帮助”。您可以在 Equivalent cURL in VBA? 找到有关如何执行此操作的详细信息。但不是将响应发送到 MsgBox,而是打开一个文件并写入它。当然,这实际上是在使用WinHTTPRequest,并且您已经在问题中说过“这似乎是一项疯狂的工作” - 所以我不确定您是否会对解决方案感到满意。

注意 - Options 属性的使用很棘手 - 您可以在 http://msdn.microsoft.com/en-us/library/windows/desktop/aa384108(v=vs.85).aspx 找到有关如何使用它的详细信息。在给出的示例中,选项 SslErrorIgnoreFlags 设置为 13056 - 即0x3300,这意味着“忽略所有错误”,因为它是

的总和
Unknown certification authority (CA) or untrusted root      0x0100
Wrong usage                                                 0x0200
Invalid common name (CN)                                    0x1000
Invalid date or certificate expired                         0x2000

我希望这已经足够了 - 鉴于你的问题的细节,我毫无疑问!

另一个建议(不确定这是否实用)- 使用 VBA 以外的平台。有许多带有工具箱的高级语言就是为了这个目的。我个人最喜欢的是 php 中的 cURL,但 Python 中也有一些非常好的选项。但这是否有意义取决于您尝试将其连接到什么。

【讨论】:

以上是关于如何使用 Excel VBA 登录网站并下载文件的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA:自动单击并从网站打开文件

使用EXCEL vba下载文件时出现问题

如何使用 VBA(没有 Internet Explorer)下载文件

使用VBA excel在iFrame中单击下拉选项

VBA如何批量抓取数据

使用表单从网站屏幕获取数据到 Excel - VBA