IE11のダウンロード通知バーをVBAで操作したい
VBAでIE11のサイトを操作し、ダウンロード通知バーの「保存(S)」を押したいと考えています
以下の通りコードを書き、IEが既に起動している場合は、最後の「InvokePattern.Invoke」が成功し、ダウンロードファイルを保存できます。
問題は、IEを起動していない場合は新しくIEを開いてsetしているのですが、オブジェクトが上手く取得できていないらしく、「InvokePattern.Invoke」の箇所がスルーされているようで、「保存(S)」を押せていないまま終了してしまいます。
どこを修正すればよいのか教えていただけないでしょうか。よろしくお願いいたします。
Public Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hWnd As Long) As Long
Sub データ取得()
Dim ie As Object
Dim objInpTxtArea As HTMLTextAreaElement
Dim Button As HTMLInputElement
'参照設定 Microsoft HTML Object Library
Set ie = getIE
Call ie.navigate("http://1.2.3.4/logon.do")
ie.Visible = True
Do While ie.busy Or ie.readystate < 4
DoEvents
Sleep (10)
Loop
'IDとパスワードを入れてログイン
Set objInpTxtArea = ie.document.getElementsByName("user")(0)
'検索条件などの操作を入力
'ダウンロードボタンを押す
Set Button = ie.document.getElementById("dButton")
Button.Click
Set Button = Nothing
Dim AutomationObj As IUIAutomation
Dim WindowElement As IUIAutomationElement
Dim button2 As IUIAutomationElement
Dim hWnd As Long
Set AutomationObj = New CUIAutomation
hWnd = ie.hWnd
hWnd = FindWindowEx(hWnd, 0, "Frame Notification Bar", vbNullString)
If hWnd = 0 Then Exit Sub
SetForegroundWindow (hWnd)
Sleep 8000
Set WindowElement = AutomationObj.ElementFromHandle(ByVal hWnd)
Dim iCnd As IUIAutomationCondition
Do
DoEvents
Sleep 1&
Set iCnd = AutomationObj.CreatePropertyCondition(UIA_NamePropertyId, "保存")
Loop While iCnd Is Nothing
Set button2 = WindowElement.FindFirst(TreeScope_Subtree, iCnd)
Dim InvokePattern As IUIAutomationInvokePattern
Set InvokePattern = button2.GetCurrentPattern(UIA_InvokePatternId)
InvokePattern.Invoke
End Sub
Public Function getIE() As Object
Dim objSh As Object
Dim objW As Object
Dim i As Integer
'IEがすでに立ち上がっている場合はそれを活用する
Set objSh = CreateObject("Shell.Application")
For i = objSh.Windows.Count To 1 Step -1
Set objW = objSh.Windows(i - 1)
If objW.FullName Like "*IEXPLORE.EXE" Then
Set getIE = objW
Exit Function
End If
Next
'見つからなかった場合は新規作成する
Set getIE = New InternetExplorer
getIE.Visible = True
End Function