[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBAでIE制御しダウンロードし開いたExcelブックをVBAから扱いたい』(かず)
VBAでIE制御しダウンロードし開いたExcelブックをVBAから扱いたい
下記のコードのようにしてIEの通知バーを制御してExcelファイルをダウンロードし開くことはできた。その後、開いたファイルデータをVBAで書き込み
したいが既にファイルが開いているためOpenすると読み取り専用になってしまう。activateだけでいいはずだがopenいsていないのでactivateもできない
状況です。
この分野に詳しい方が入たら、どうすればいいか教えて頂けますでしょうか
1.コード ・・・ ' Webページを表示ここまで略 ' 通知バーを操作してExcelをダウンロードし開く
Set doc =objIE.Document
Set elm =doc. getElementById("downloadButton″)
If InStr (elm. outer HTML,"ダウンロード″)>0 Then
Set Btn =eIm.getEIementsByTagName("input")(0)
elm.Click
End lf
’「通知バー」オブジェクトの操作を通じて Excelファイルをダウンロード
' ファイル名は ABC_2018062002371909 のように固定文字列ABCと日時時刻分秒
’の形で動的に決定される
' 拡張子は.xls 固定
Set AutomationObj =New CUIAutomat ion
hWnd =objIE.hWnd
hWnd =FindWindowEx(hWnd. 0,"Frame Notification Bar",vbNullstring)
If hWnd=O Then Exit Sub
Set WindowEIement =AutomationObj.EIementFromHandIe(ByVaI hWnd)
Dim iCnd As IUIAutomat i onCond i t i on
Dim InvokePattern As IUIAutomat i on InvokePattern
Do
DoEvents
Sleep 1&
Set iCnd =
Automat ionObj. CreatePropertyCondition (UIA_NamePropertyId,保存″)
Loop While iCnd Is Nothing
Set button2 =W i ndowEIement.FindFirst(TreeScope_Subtree, i Cnd)
Set InvokePattern =button2. GetCurrentPattern(UIA_InvokePatternId)
InvokePattern.Invoke
Sleep(3000)
Do
DoEvents
Sleep 1&
Set iCnd =
AutomationObj. CreatePropertyCondition(UIA_NamePropertyId,ファイルを開く″)
Loop While iCnd Is Nothing
Set button2 =WindowElement. FindFirst(TreeScope_Subtree, iCnd)
Set InvokePattern =button2.GetCur rentPattern (UIA_InvokePatternId)
InvokePattern. Invoke
’ここまででダウンロード終了
’ダウンロードしたファイルが開かれるのを待つ
Sleep(25000)
’(A)★ダウンロードしたファイルのデータを取得するためウィンドハンドルを
' 取得したいが、ExcelやIEのアプリケーションが複数起動していると
’どれがターゲットのウィンドウのハンドル番号が取得できない場合が多い
’複数のExcelが起動していると、この関数はマクロ自身のブックの
’ハンドル番号を取得してしまうor場合によって自分自身のハンドルを問る
’ ことがある
hWnd =GetForegroundWindow
'myhWnd =FindWindow("XLMAIN", vbNullstring) '使い方不明、試行錯誤中
'hWnd =GetActiveWindow() '使い方不明、試行錯誤中
’この時点でターゲットのExcelのhWndでなくマクロ自身のhwndを見ることがあり
’そこが問題
If hWnd <>O Then
’ウィンドウタイトルを取得’
Dim title As string *256
Dim titleLen As Long
titleLen =GetWindowText(hWnd, title, 256)
’文字列の最後のNULLを省く
document_title =StrConv(LeftB(StrConv(title,vbFromUnicode), titleLen), vbUnicode)
document_title =Left(document_t.i 11e, InStr(document_ttitle,”xls")+2)
'(B)★このまま実行するとターゲットファイルを読み取り専用でもう一つ開いてしまう
Workbooks.open Fi I ename :=document_title
FName =ActiveWorkbook. Name
End If
2.質問
Q1 上記(A)で、開いているExcelアプリが複数あっても、一番後にできたはずのhwnをターゲット(ダウンロードしたファイルのハンドル番号を取得するにはコードを総修正すればいいでしょうか
Q2 (B)の所でWorkbooks.Count を見ると1となっていてマクロから
起動しているExcelが見えていない。どうすればactivateできるか教えて
ください
以上
< 使用 Excel:Excel2016、使用 OS:Windows7 >
URLDownloadToFile で、一旦ローカルに保存してから開いては? (mm) 2018/06/20(水) 09:29
cPath = ThisWorkbook.Path & "\"
cFiles = Split(CreateObject("WScript.Shell").Exec("CMD /C DIR /A:-D/B """ & cPath & "*.xls* | sort /r""").StdOut().ReadAll(), vbNewLine) でString配列cFilesにファイルリストを入れて cfiles(0)として ブック名を取得でき workbooks.open Filename:=cfiles(0)でオープンできました。
結果的に(A)の所で、ダウンロードしたファイルを開いて最前面に出して
...と言う難しい処理も不要になりました。hwndからファイル名を求める
のが難しかったので助かりました。
有難うございました。
以上
(かず) 2018/06/20(水) 21:06
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.