「input type=file 」のファイルダイアログの開き方について
未読分:9件
昨日以降(0) 2日前以降(0) 3日前以降(0) 4日前以降(0) 5日前以降(0)
近田 伸矢, 植木 悠二, 上田 寛
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。
Message#9 2017年1月11日(水)22時21分 From: ゆうじ | 返事 削除 変更 |
初めまして。ゆうじと申します。 先月、同僚よりExcel VBAからIEを制御できることを教えてもらい、 こちらのサイトや書籍を参考に勉強させて頂いております。 (端的に言えば、ど素人です) お礼の気持ちを込めて、このスレッドで記載されている方法とは 違う方法なのですが、標題のファイル選択の自動化が出来た 一事例として報告させて頂きます。 #社内で利用しているシステムで、ファイルを添付するための #ファイル選択処理の自動化を目的に色々調べて試行錯誤しました。 #。 #IEのバージョンは、11.0.9600.18537。更新バージョンは、11.0.38(KB3203621) #Windowsは、Windows7 Professional バージョン6.1(ビルド 7601:Service Pack 1)です。 #If VBA7 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr) Declare Function IsIconic Lib "user32.dll" (ByVal hWnd As Long) As Long '良く判っていないので、とりあえず両方に記載 Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As Long) As Long '良く判っていないので、とりあえず両方に記載 Declare Function ShowWindowAsync Lib "user32.dll" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long '良く判っていないので、とりあえず両方に記載 #Else Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long) Declare Function IsIconic Lib "user32.dll" (ByVal hWnd As Long) As Long '良く判っていないので、とりあえず両方に記載 Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hWnd As Long) As Long '良く判っていないので、とりあえず両方に記載 Declare Function ShowWindowAsync Lib "user32.dll" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long '良く判っていないので、とりあえず両方に記載 #End If Sub sample_file_select_auto() Dim objIE As InternetExplorer '起動済みのテスト用フォームページを制御する Set objIE = ieFind("http://www.vba-ie.net/code/test.html") 'SendKeysを確実に狙ったオブジェクトに送るため、ウィンドウを最前面に表示する 'ウィンドウが最小化されているかのチェック If IsIconic(objIE.hWnd) Then ShowWindowAsync objIE.hWnd, SW_RESTORE End If 'IEを最前面に表示 SetForegroundWindow (objIE.hWnd) ' 旨くいった。SendKeysの第二引数:Trueを明示 ' 最初は、第二引数を省略(SendKeysの仕様を良く判っていなかった)し、 ' SendKeysの後に、sleepを入れたが旨くいかなかった ' 'ファイル選択をクリック objIE.document.getElementsByName("img")(0).Focus SendKeys "{Tab}", True SendKeys " ", True Sleep 500 SendKeys "*** ファイルパス ***", True SendKeys "{Tab 2}{Enter}", True End Sub このスレッドで話題になっているsubmitボタンクリック時のエラーは、 私が実際に試行している社内のシステムでは発生せず、 無事にファイル添付できています。 #このSendKeysのやり方を参考にさせて頂いたのは、下記URLです # http://language-and-engineering.hatenablog.jp/entry/20100909/p1 汎用的な一事例になるのか心配な点としては、下記2点(ど素人考えですが) 1.INPUTタグに type=file が明記されていない 実際の記述は以下の通り。 <INPUT id=FileInput_oafileUpload title=ファイルおよびパス入力 size=50 type=file name=FileInput_oafileUpload> この記述で何故か、type=fileが明記されている時と同じ画面になっており、 .valueへの代入もできません。 2.ファイル選択後の登録処理は、submitボタンではなく、 BUTTONタグでonclickでJavaScript(なのかな?)処理になっています。 同じ悩みを抱えている方に、どれだけお役に立てるか判りませんが、 少しでもお役に立てられれば、幸いです。 |
Message#8 2015年4月13日(月)20時44分 From: 名無しの次郎 | 返事 削除 変更 |
管理人さんありがとうございます! 試してみたのですが、 行: 5 文字: 100 エラー: ')' がありません。 コード: 800A03EE ソース: Microsoft VBScript コンパイル エラー とエラーがでてきてしまいます。 もう少しがんばってみようと思いますが、まずはお礼までに。 |
Message#7 2015年4月13日(月)17時57分 From: 管理人 | 返事 削除 変更 |
追記 Shell で引数を渡せばループ処理も対応できそうな気がします。 |
Message#6 2015年4月13日(月)17時53分 From: 管理人 | 返事 削除 変更 |
> ファイルダイアログへのファイルパス入力と開くボタンの自動操作には成功し、Web画面のテキストにもファイルパスが表示されますが、その後のsubmitボタンクリックで「-2147352319 オートメーション エラーです。」のエラーが発生しています。 > > 同じ参照ボタンを手操作でクリックし、ファイルダイアログを開いた状態の時にファイルパス入力と開くボタンクリックをVbscriptで行ってから、EXCELVBAでsubmitボタンクリックを実行した場合は正常に動作しました。 > ファイルダイアログを「〜.click」で開いてはいけないということでしょうか? > それともVbscriptでの入力がいけないのでしょうか? > > どなたか判る方は回答をお願いします。 貴重な情報ありがとうございます。 なるほどですね。 参考サイトがなかったので今回は添付ファイル付きのメール送信をIE操作で行ったところ添付ファイル付きでメール送信できました。 ファイル参照の自動化も問題なくできています。 手動でやった場合はうまくいき、自動で処理した場合でエラーが表示されるといことは、処理のタイミングの問題かもしれません。 先に名無しの次郎さんのために処理内容を簡単に説明すると 最初にVbscriptの中の 「ファイルダイアログのタイトル」 → "アップロードするファイルの選択" 「ファイルパス」 → "C:\Users\***\Desktop\aaa.jpg" を対象のファイルダイアログ用に変更します。(上記は参考です) 次にVBA側で Sub sample() Dim objIE As InternetExplorer 'InternetExplorerでテスト用フォームページを起動 Call ieView(objIE, "http://www.vba-ie.net/code/test.html") 'Vbscript呼び出し Shell "WScript.exe ""C:\Users\***\Desktop\test.vbs""" 'ファイル選択をクリック objIE.document.getElementsByName("img")(0).Click waitTime = Now + TimeValue("0:00:05") Application.Wait waitTime Set objForm = objIE.document.forms("form1") 'submitボタンをクリック objForm.submit End Sub で処理します。 ポイントはファイルダイアログのボタンをクリックする前にVbscriptを呼び出しておく点です。 ファイルダイアログが開いたらVBAの処理がとまってしまうので、閉じるまで次の処理を実行しません。 ですので、先に呼び出しておいてVbscriptでWScript.sleep(5000)により開くまで処理を停止させています。 こちらの処理はサンプルページですので、なにも起きませんが参照されているのを確認してください。 そこで、今回のオートメーション エラーですが、「-2147352319」を検索してもでてこなかったので、外部なのかVBA側なのか分かりませんでした。 submitの処理をどのタイミングかによってエラーが起きる場合もあるので、もう少し情報いただければと思います。 |
Message#5 2015年4月13日(月)17時18分 From: 名無しの次郎 | 返事 削除 変更 |
情報ありがとうございます。 小生もこちらを試したいのですが、こちらはどのように利用すればよろしいでしょうか? 逆にご教授いただいて申し訳ありませんが、こちらでも検証してみたいと思いますので、 何卒よろしくお願い申し上げます。 |
Message#4 2015年4月13日(月)08時50分 From: DSC_渡辺 | 返事 削除 変更 |
ファイルダイアログへのファイルパスの入力と開くボタンの自動操作は以下のようなVbscriptを使って実現しています。 ''ファイルダイアログ表示待ちの為に待機 WScript.sleep(5000) Set ObjExcel = WScript.CreateObject("Excel.Application") ''ファイルダイアログのハンドラ取得 DialogHnd = ObjExcel.ExecuteExcel4Macro("CALL(""user32"", ""FindWindowA"", ""JCC"", ""#32770"", """ & ファイルダイアログのタイトル & """)" ) ''ファイルダイアログの各入力項目のハンドラ取得 EditHnd1 = ObjExcel.ExecuteExcel4Macro("CALL(""user32"", ""FindWindowExA"", ""JJJCC"", " & DialogHnd & "," & 0 & ",""ComboBoxEx32""," & vbNullString & ")") EditHnd2 = ObjExcel.ExecuteExcel4Macro("CALL(""user32"", ""FindWindowExA"", ""JJJCC"", " & EditHnd1 & "," & 0 & ",""ComboBox""," & vbNullString & ")") EditHnd3 = ObjExcel.ExecuteExcel4Macro("CALL(""user32"", ""FindWindowExA"", ""JJJCC"", " & EditHnd2 & "," & 0 & ",""Edit""," & vbNullString & ")") ''ファイルパスを入力項目にセット ret = ObjExcel.ExecuteExcel4Macro("CALL(""user32"", ""SendMessageA"", ""JJJJC"", " & EditHnd3 & "," & &HC & "," & 0 & ",""" & ファイルパス & """)") ''開くボタンのハンドラ取得 BtnHnd = ObjExcel.ExecuteExcel4Macro("CALL(""user32"", ""FindWindowExA"", ""JJJCC"", " & DialogHnd & "," & 0 & ",""Button"",""開く(&O)"")") ''開くボタンのコントロールID取得 CtrID = ObjExcel.ExecuteExcel4Macro("CALL(""user32"", ""GetDlgCtrlID"", ""JJ""," & BtnHnd & ")") ''開くボタンをクリック ret = ObjExcel.ExecuteExcel4Macro("CALL(""user32"", ""SendMessageA"", ""JJJJC"", " & DialogHnd & "," & &H111 & "," & CtrID & ",""" & BtnHnd & """)") ObjExcel.Quit Set ObjExcel = nothing WScript.Quit 以上のVbscriptをEXCELVBAから起動し、Vbscriptの中のファイルダイアログ表示待ちの間に「ObjIE.document.forms("フォーム名").Item("XXX").Click」でファイルダイアログを開いています。 ファイルダイアログへのファイルパス入力と開くボタンの自動操作には成功し、Web画面のテキストにもファイルパスが表示されますが、その後のsubmitボタンクリックで「-2147352319 オートメーション エラーです。」のエラーが発生しています。 同じ参照ボタンを手操作でクリックし、ファイルダイアログを開いた状態の時にファイルパス入力と開くボタンクリックをVbscriptで行ってから、EXCELVBAでsubmitボタンクリックを実行した場合は正常に動作しました。 ファイルダイアログを「〜.click」で開いてはいけないということでしょうか? それともVbscriptでの入力がいけないのでしょうか? どなたか判る方は回答をお願いします。 |
Message#3 2015年4月11日(土)17時51分 From: IEさん | 返事 削除 変更 |
> ファイルダイアログにファイルパスを入力してから開くボタンを押下してファイルダイアログを閉じ、submitボタンをクリックしてファイルアップロードを実行しようとしたところ、「-2147352319 オートメーション エラーです。」とのエラーになってしまいました > 色々と調べたところ、 > 「click()で開かれたダイアログ上にファイルパスを手動入力しても,formをsubmitするタイミングで,入力したはずのファイルパスが不正値として消去されてしまい,送信できない。」という記述をネットで見つけました。 ファイルダイアログ画面からのクリック処理ってDOM操作でできたっけ? sendkeysするにしても手入力ってことはフォーカス位置も違うから無理だと思うけど。 ファイルダイアログはクリック処理でいけるけど、選択およびセットはセキュリティ上現時点でできないと思われる。 同じく他の有識者いたら教えてくれ! |
Message#2 2015年4月11日(土)15時01分 From: 名無しの次郎 | 返事 削除 変更 |
小生の記憶ではたしかIEのバージョンによってはセキュリティが強化されてしまい、 ファイルアップの自動化ができなくなったと記憶しています。 sendkysも利用できない状態だったと思いますので、難しいのではないでしょうか。 他の有識者の方のアドバイスがあれば小生も伺いたいものです。 |
Message#1 2015年4月10日(金)19時15分 From: DSC_渡辺 | 返事 削除 変更 |
EXCELVBAでweb画面を操作し、「input type=file name="XXX"」の参照ボタンをクリックしてファイルダイアログを開いています。(IEバージョンは10) Set ObjIE = CreateObject("InternetExplorer.Application") ObjIE.Visible = True ObjIE.Navigate web画面のURL ObjIE.document.forms("フォーム名").Item("XXX").Click ファイルダイアログにファイルパスを入力してから開くボタンを押下してファイルダイアログを閉じ、submitボタンをクリックしてファイルアップロードを実行しようとしたところ、「-2147352319 オートメーション エラーです。」とのエラーになってしまいました。 色々と調べたところ、 「click()で開かれたダイアログ上にファイルパスを手動入力しても,formをsubmitするタイミングで,入力したはずのファイルパスが不正値として消去されてしまい,送信できない。」という記述をネットで見つけました。 Clickによってファイルダイアログを開いても正常に動作しないということでしょうか? もし、そうならば、他に対処方法はないでしょうか? ちなみに、「Sendkey」による操作も試しましたが、こちらではファイルダイアログを開くことができませんでした。 Set wObject = CreateObject("WScript.Shell") For Each objElement In ObjIE.document.getElementsByTagName("input") If InStr(objElement.Name, "XXX") > 0 Then objElement.Focus objElement.Select Sleep(1000) ' その右隣にある「参照」ボタンに、WSを使ってフォーカス wObject.SendKeys ("{TAB}") Sleep(1000) ' SPACEキー押下で,ファイル参照ダイアログを開く wObject.SendKeys (" ") DoEvents Exit For End If Next |
昨日以降 2日前以降 3日前以降 4日前以降 5日前以降