これは、stackoverflowに関する私の最初の質問です!
私はしばらくの間、この問題の解決策を探していましたが、助けが見つかりませんでした。検索で間違ったキーワードを使用しているだけかもしれませんが、これまでのところ運がありません。ここに質問があります:
VBAでは、Internet Explorerのファイルダウンロードダイアログから[開く]オプションを選択するにはどうすればよいですか?
わかりやすくするために、ファイルをダウンロードしたときにIE9の画面の下部に表示される黄色がかったオレンジ色のバーについて話しています。
Internet Explorerを使用してWebから何百ものPDFをダウンロードするためにVBA自動化を行っていますが、実際のPDFに到達する前に.fdfファイルを開く必要がある中間ステップがあります。したがって、最初に「開く」オプションを選択して、オートメーションの次のステップに進むことができるようにする必要があります。前に言ったように、私は多くの検索を行っており、今のところ運がありません。
ヒットすることを期待してSendKeys
を使用してみました Enter うまくいくでしょう、そしてそれはうまくいかなかった最後の溝の努力でした。
助けてくれてありがとう!
私はこれをここで広範囲にカバーしました。
トピック:VBA/VB.Net/VB6–Open/Save/Cancel Button on IEダウンロードウィンドウ–パートI
そして
EDIT(IMP)IE 9を使用している場合PART 2は、IE 9ダウンロードウィンドウ
トピック:VBA/VB.Net/VB6–Open/Save/Cancel Button on IEダウンロードウィンドウ–パートII
上記のリンクでは、APIを使用して目的を達成する方法について説明しています。
最初のリンクから...
あなたや私と同じように、私たちには両方とも名前があります。同様に、ウィンドウには「ハンドル」(hWnd)、クラスなどがあります。そのhWndが何であるかがわかれば、そのウィンドウを操作するのが簡単になります。
Findwindow APIは、この場合、クラス名とウィンドウのキャプション(「ファイルのダウンロード」)を使用して、特定のウィンドウのhWndを見つけます。 「開く」、「保存」、「キャンセル」ボタンはそれ自体がウィンドウですが、「ファイルのダウンロード」であるメインウィンドウの子ウィンドウです。つまり、それぞれにhWndも含まれます。:)子ウィンドウを見つけるために、FindWindowではなくFindWindowExを使用します。 「開く」、「保存」、「キャンセル」の3つのボタンはすべて、「ボタン」という同じクラスを持っています。
ショートカットキーをアプリケーションに送信しました。ここではIE11用です。 IE9ではテストできませんでした。押し続けると Alt、IE11と同様に、コンボの他のキーが表示される場合があります。
注:IEがマシンのアクティブなウィンドウでない場合、コードは期待どおりに実行されないため、デバッグモードでは機能しません。
Application.SendKeys "%{O}"
同様の投稿: リンク
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