5

会社の内部Webサイトからcsvファイルをダウンロードするためのマクロを作成しています。

多くの理由で、xmlhttpオブジェクトを使用できません。マクロはファイルをダウンロードします。問題は、Internet Explorer 9がユーザーに[開く]、[保存]、および[キャンセル]ボタンを表示することです。

IEを使用している間、Alt + Shift + Sでダウンロードを保存できますが、ExcelVBAから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

4 に答える 4

1

コメントで述べたように、情報セキュリティバーを使用すると、ファイルダウンロードウィンドウを操作するのが難しくなります。

別の方法は、webbrowserコントロールを使用して、URLを渡すことです。ただし、この方法の主な問題は、同じExcelインスタンスにWebブラウザを配置できないことです。[ファイルのダウンロード]ウィンドウが表示されると、VBAマクロ全体が停止します。

これが代替案です。これは、VB6で作成した小さなexeで、IE情報セキュリティバーをバイパスして[ファイルのダウンロード]ウィンドウをポップアップ表示します。そして、ファイルのダウンロードウィンドウがポップアップしたら、私のブログ記事に示されているように、APIを使用してそれを操作できます。

このvb6exeファイルをどのように操作するかを例で見てみましょう。

Excelでモジュールを作成し、このコードを貼り付けます。

重要な注意:あなたは私にURLを与えなかったので、私は静的URLを取っています。リンクに置き換えてください。指定したリンクに応じて、これら2つのダウンロードウィンドウのいずれかが表示される場合があります。表示されるダウンロードウィンドウに基づいて、以下に示す写真に基づいてウィンドウハンドルを見つける必要があります。私が提供したブログリンクの詳細。

ここに画像の説明を入力してください

添付ファイルをダウンロードして、sayに保存しますC:\。他の場所に保存する場合は、以下のシェルステートメントで修正してください。

Sub Sample()
    Dim sUrl As String

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

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

スナップショット

ここに画像の説明を入力してください

ファイル:ファイルはここからダウンロードできます。

于 2012-07-24T23:37:08.450 に答える
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   
    

最後に試してください。

于 2014-11-04T14:42:07.037 に答える
0

もっと簡単な解決策を思いついたと思います。IE9にダウンロードバーが表示されたら、「実際の」ダウンロードポップアップウィンドウを表示してバイパスします。ショートカットは「CTRL+J」です。次に行う必要があるのは、[保存]または[開く]をクリックすることだけです。それを行うにはかなりの方法があるかもしれませんが、キーシーケンスを送信してフォーカスを目的のオプションに移動し、Enterキーを押します。

コードは次のとおりです。

' 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}~"
于 2014-07-16T17:33:17.107 に答える
0

微調整が必Application.Sendkeys​​要です。以下は私が使用しているコードなので、IE11でテストされています。これは、IE11のキーボードショートカットであるAlt+Sなしの場合です。Shiftこれが機能せず、Shiftバックインを追加するのにサポートが必要な場合はお知らせください。

Application.SendKeys "%{S}", True

于 2016-10-12T22:24:50.663 に答える