VBA互联网浏览器自动化 - 如何在下载文件时选择“打开”

14

这是我在stackoverflow上的第一个问题!

我一直在寻找解决这个问题的方法,但没有找到任何帮助。也许我在搜索时使用了错误的关键词,但到目前为止我还没有运气。下面是我的问题:

在VBA中,如何从Internet Explorer的文件下载对话框中选择“打开”选项?

为了进一步说明,我指的是当IE9下载文件时,在屏幕底部弹出的黄色橙色栏。

我正在使用Internet Explorer进行VBA自动化下载数百个PDF文件,但有一个中间步骤,必须先打开.fdf文件才能进入实际的PDF文件。所以我首先需要选择“打开”选项,以便进行自动化的下一步。就像我之前说的,我已经做了很多搜索,但到目前为止还没有运气。

我尝试使用SendKeys,希望按下Enter会起作用,但那只是最后的无奈之举,也没有成功。

提前感谢您的帮助!


你考虑过使用URLDownloadToFile直接获取文件吗?http://www.vbaexpress.com/forum/showthread.php?t=33145 - Tim Williams
1
我曾经尝试过使用URLDownloadToFile,但是所有这些文件都在一个受密码保护的网站上,我无法弄清如何传递凭据。 - Lane Sawyer
我下面提供的第一个链接也涵盖了API URLDownloadToFile。 - Siddharth Rout
@LaneSawyer:你是在尝试从FTP站点下载吗? - Siddharth Rout
不,我正在从一个定制的文档管理系统中下载文件。 - Lane Sawyer
3个回答

4

我已经在这里广泛涵盖了这个问题。

主题: VBA/VB.Net/VB6-单击IE下载窗口上的打开/保存/取消按钮-第一部分

链接: http://www.siddharthrout.com/2011/10/23/vbavb-netvb6click-opensavecancel-button-on-ie-download-window/


编辑(重要)如果您正在使用IE 9,请不要忘记阅读第2部分,因为它包括并涵盖了IE 9下载窗口的窗口结构


主题: VBA/VB.Net/VB6-单击IE下载窗口上的打开/保存/取消按钮-第二部分

链接: http://www.siddharthrout.com/2012/02/02/vbavb-netvb6click-opensavecancel-button-on-ie-download-window-part-ii/

以上链接讨论如何使用API来实现您想要的功能。

来自第一个链接...

就像你和我一样,我们都有名字,同样,窗口也有“句柄”(hWnd)、类等。一旦你知道了那个hWnd是什么,与那个窗口进行交互就更容易了。

Findwindow API通过使用类名称和窗口标题(在本例中为“文件下载”)来查找特定窗口的hWnd。 “打开”,“保存”和“取消”按钮本身是窗口,但它们是主窗口“文件下载”的子窗口。这意味着每个按钮也会有一个hWnd :) 为了找到子窗口,我们不使用FindWindow而使用FindWindowEx。所有三个按钮“打开”,“保存”和“取消”具有相同的类,即“ Button”。


我会推荐这个链接 :) http://www.jkp-ads.com/articles/apideclarations.asp - Siddharth Rout
你好!很抱歉又翻出了一个旧帖子。我应该把“Call Sample”放在哪里呢?我有一个URL,它不直接链接到文件,但是在导航到它之后,会弹出一个对话框。我把“Call Sample”放在了readystate为4时,也就是对话框弹出的时候。然而,似乎“Call Sample”没有检测到这个对话框(当对话框弹出时,代码停止运行)。有什么想法吗? - Mariska
@SiddharthRout 我需要自动化Internet Explorer下载中的“另存为”操作。我不得不使用您的方法将光标移动到按钮上并使用mouse_event。您认为为什么SendMessage无法正常工作? - CJ7
3
这些链接已经失效了 :-(,最近的存档来自Wayback:https://web.archive.org/web/20160323061203/http://www.siddharthrout.com/2011/10/23/vbavb-netvb6click-opensavecancel-button-on-ie-download-window/ 和 https://web.archive.org/web/20160323160504/http://www.siddharthrout.com/2012/02/02/vbavb-netvb6click-opensavecancel-button-on-ie-download-window-part-ii/。 - QHarr
1
好的,非常感谢。今天有人在他们的评论中提到了这个问题,所以我来看看。感谢您的回复。 - QHarr
显示剩余10条评论

1
我将快捷键发送到应用程序中。这里是IE11的快捷键。很抱歉我无法在IE9中进行测试。如果按住Alt,它可能会像IE11一样显示组合键的另一个键。
注意:如果IE不是您计算机上的活动窗口,则代码将无法按您预期运行,因此在调试模式下不起作用。
快捷键:Alt+O VBA:Application.SendKeys "%{O}"

1
类似文章:链接
    Option Explicit
    Dim ie As InternetExplorer
    Dim h As LongPtr
    Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr

Sub Download()
    Dim o As IUIAutomation
    Dim e As IUIAutomationElement
    Set o = New CUIAutomation
    h = ie.Hwnd
    h = FindWindowEx(h, 0, "Frame Notification Bar", vbNullString)
    If h = 0 Then Exit Sub

    Set e = o.ElementFromHandle(ByVal h)
    Dim iCnd As IUIAutomationCondition
    Set iCnd = o.CreatePropertyCondition(UIA_NamePropertyId, "Open")

    Dim Button As IUIAutomationElement
    Set Button = e.FindFirst(TreeScope_Subtree, iCnd)
    Dim InvokePattern As IUIAutomationInvokePattern
    Set InvokePattern = Button.GetCurrentPattern(UIA_InvokePatternId)
    InvokePattern.Invoke
End Sub 

这里使用了 Dim o As IUIAutomation,但后面又出现了 Set o = New CUIAutomation,所以其中一个似乎是错误的?我对 VBA 的了解很少,所以不确定应该调整哪个;-) - Martin Tournoij

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接