VBA Internet Explorer自动化 - 如何在下载文件时选择“打开”

时间:2012-05-01 16:24:53

标签: vba automation internet-explorer-9 download

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

我一直在寻找这个问题的解决方案一段时间,但没有找到任何帮助。我可能只是在我的搜索中使用了错误的关键字,但到目前为止我没有运气。这是问题:

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

为了进一步澄清,我正在谈论在下载文件时IE9中​​屏幕底部弹出的黄橙色条。

我正在做一些VBA自动化,使用Internet Explorer从网上下载数百个PDF,但是有一个中间步骤,在我到达实际PDF之前必须打开.fdf文件。所以我首先需要选择“打开”选项,以便我可以继续进行自动化的下一步。就像我之前说过的那样,我做了很多搜索,到目前为止没有运气。

我已经尝试使用SendKeys,希望点击 Enter 会起作用,而这是最后一次无效的努力。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:4)

我在这里广泛报道了这一点。

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

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


编辑(IMP)如果您使用的是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),类等。一旦你知道那是什么,就更容易与那个窗口进行交互。

     

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

答案 1 :(得分:1)

类似文章:link

    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 

答案 2 :(得分:1)

我将快捷键发送到应用程序。这里是针对IE11的。对不起,我无法在IE9中测试。如果你按住 Alt ,它可能会显示IE11的另一个组合键。

注意:如果IE不是您计算机上的活动窗口,则代码将无法按预期运行,因此在调试模式下它将无法运行。

  • 快捷键: Alt + O
  • VBA:Application.SendKeys "%{O}"