「input type=file 」のファイルダイアログの開き方について

最近の書き込み件数: 今日 0件、昨日 0件
未読分:9件

最新20件 最新50件 最新100件 最新200件 200件以前
昨日以降(0) 2日前以降(0) 3日前以降(0) 4日前以降(0) 5日前以降(0)


Excel VBAでIEを思いのままに操作できるプログラミング術 Excel 2013/2010/2007/2003対応

近田 伸矢, 植木 悠二, 上田 寛

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

最新20件 最新50件 最新100件 最新200件 200件以前
昨日以降 2日前以降 3日前以降 4日前以降 5日前以降

VBAのIE制御についてのQ&A掲示板

↑エクセルVBAのIE(InternetExplorer)操作で分からない事があればこちらの掲示板よりご質問ください^^

ExcelのVBA初心者入門

↑こちらはExcelのVBAをマスターできるよう初心者向けのエクセルVBA入門コンテンツになります^^

VBAのIE制御入門RSS

RSSフィードを登録すると最新記事を受け取ることができます。

VBAIE操作のスカイプレッスン

VBAでIE(InternetExplorer)制御の準備

エクセルVBAでIE制御の応用編

こちらでは、エクセルVBAで実際に作成したIE(InternetExplorer)制御ツールをまとめています。自動ログインや情報収集など具体的に解説しています。IE(InternetExplorer)制御をされる方は参考にしてください。

【ダウンロード】IE操作に便利なツール

こちらでは、これまでに紹介したIE(InternetExplorer)操作で便利な機能をツール化しています。無償でダウンロードできますので、目的に合わせたご利用ください。

スポンサー リンク

IEオブジェクトのメソッド・プロパティ

こちらでは、IE(InternetExplorer)オブジェクトのメソッド・プロパティをまとめています。

IE操作に利用されているVBA関数

こちらでは、エクセルVBAのIE(InternetExplorer)操作で利用されたVBA関数をまとめています。

スポンサー リンク

IE操作に利用されているステートメント

こちらでは、エクセルVBAのIE(InternetExplorer)操作で利用されたステートメントをまとめています。ExcelのVBAで基本的な部分になりますので、しっかり理解しましょう。

IE(InternetExplorer)制御のVBAコード

こちらでは、これまでに作成したIE(InternetExplorer)操作で役立つサブルーチンをまとめています。
全てをコピーする必要はありませんが、目的に合わせたサブルーチンをご利用ください。

ExcelのVBAで作成した役立つVBAコード

こちらでは、IE(InternetExplorer)制御の利用だけでなく、Excel全般で利用できるVBAコードです。エクセルVBAで役に立つものばかりですので、ご利用ください。

dmb.cgi Ver. 1.068
Copyright(C) 1997-2014, hidekik.com