[[20180620030304]] 『VBAでIE制御しダウンロードし開いたExcelブックを』(かず) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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 >


Excelファイルのurlがわかれば、
 URLDownloadToFile
で、一旦ローカルに保存してから開いては?
(mm) 2018/06/20(水) 09:29

mmさん
 
 コメント有難うございます。
 ダウンロードするファイルのURLはわからなかったので
 ご指摘を参考にファイルを開く をフォルダを開くにして

  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.