Excel VBA SendKeys不会导致IE 9保存下载

时间:2012-07-24 20:39:22

标签: excel vba automation browser-automation office-automation

我正在编写一个宏来从我公司的内部网站下载csv文件。

由于很多原因,我无法使用任何xmlhttp对象。宏将下载该文件。问题是Internet Explorer 9会提示用户使用“打开”,“保存”和“取消”按钮。

在IE中,Alt + Shift + S将保存下载,但我无法从Excel VBA中获取Sendkeys“%+ s”方法。

以下是相关代码:

Function followLinkByText(thetext As String) As Boolean
   'clicks the first link that has the specified text
    Dim alink As Variant

    'Loops through every anchor in HTML document until specified text is found
    ' then clicks the link
    For Each alink In ie.document.Links
       If alink.innerHTML = thetext Then
            alink.Click
            'waitForLoad
            Application.Wait Now + TimeValue("00:00:01")
            Application.SendKeys "%+s", True

            followLinkByText = True
            Exit Function
        End If
     Next

End Function

4 个答案:

答案 0 :(得分:1)

就像我在评论中提到的那样,信息安全栏使得难以与文件下载窗口进行交互。

另一种方法是使用webbrowser控件,然后将URL传递给它。但是这种方法的主要问题是你不能在同一个Excel实例中使用webbrowser。弹出“文件下载”窗口后,整个VBA宏将停止运行,直到您不将其丢弃为止。

这是另一种选择。这是我在VB6中创建的一个小exe,它会弹出“文件下载”窗口,绕过IE Info Security Bar。弹出“文件下载”窗口后,您可以使用我的blog文章中显示的API与其进行交互。

让我们举一个例子来看看我们如何与这个vb6 exe文件进行交互。

在Excel中创建一个模块并粘贴此代码。

重要提示:由于您没有给我任何网址,我正在使用静态网址。请用链接替换它。现在,根据您指定的链接,您可能会看到这两个下载窗口中的一个。根据您看到的下载窗口,您必须根据下面的图片找到窗口句柄。关于我给出的博客链接的更多细节。

enter image description here

下载附加的文件并将其保存在C:\中。如果将其保存在任何其他位置,请在下面的Shell语句中修改它。

Sub Sample()
    Dim sUrl As String

    sUrl = "http://spreadsheetpage.com/downloads/xl/king-james-bible.xlsm"

    Shell "C:\FDL.exe " & sUrl, vbNormalFocus
End Sub

<强>快照

enter image description here

文件:可以下载文件here

答案 1 :(得分:1)

你可以尝试这个,因为它在IE 11上为我工作:

  1. 将文件C:\Windows\System32\UIAutomationCore.dll文件复制到用户文档,例如C:\Users\admin\Documents,然后将参考UIAutomationClient添加到您的宏文件中。
  2. 粘贴模块中的代码:

        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, "Save")
    
        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   
    
  3. 尝试结束。

答案 2 :(得分:0)

我想我提出了一个更简单的解决方案:当IE9中出现下载栏时,只需通过显示&#34;真实&#34;下载弹出窗口。快捷方式是&#34; CTRL + J&#34;。您接下来要做的就是点击&#34;保存&#34;或&#34;打开&#34;。可能有很多方法可以做到这一点,但我只需发送一个按键序列就可以将焦点移到所需的选项上,然后按回车键。

以下是代码:

' Wait for download bar to appear
Application.Wait (Now + TimeValue("0:00:04"))

' Sending CTRL+J to open download pop-up
SendKeys "^j"

' Wait for download popup to appear
Application.Wait (Now + TimeValue("0:00:02"))

' Sending keys sequence to click on "Save" button
SendKeys "{RIGHT}{RIGHT}{RIGHT}~"

答案 3 :(得分:0)

您的Application.Sendkeys只需要进行调整。下面是我正在使用的代码,因此它在IE11上进行了测试。这是针对 Alt + S 而没有 Shift 这是IE11中的键盘快捷键。如果这不起作用,请告诉我,您需要帮助添加 Shift

Application.SendKeys "%{S}", True