• ベストアンサー

EXCEL VBA でIEを制御して、INPUT type=file で出るダイアログに入力できませんか?

EXCEL VBA から、objIEオブジェクトを使って、IEを制御して、WEBページを制御するプログラムを作っています。 ※通販サイトのモール内管理の自動化プログラムです。 その際、操作対象のページに、INPUT type=file でファイルを入力するブロックがあります。 ここに自動でファイルを入れたいのですが、INPUT type=file を表示するボタンに対し .clickを入れるとそこでVBAが停止してしまいます。 そのモールそのものは、色々な制約があるので、公開できませんが、抜き出したのが http://royal-e.heteml.jp/js_test/input_test.htm になります。 objIEオブジェクトで INPUT type=file に希望のファイル名を入力することは出来るでしょうか? 方法をご存知の方がいらしたら、教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#185804
noname#185804
回答No.10

何度もすみません、下記コードをVBAで実行した所正常にアップロード出来ました ファイル名のテキストボックスにフォーカスが移り、sendkeysでファイル名が自動入力されて アップロードボタンが自動押下されました ファイル選択ダイアログは表示させずに済みました 但し当方の環境はXP+IE6+EXCEL2002ですのでIE7の場合動くかは不明ですが。 Private Sub input_txt()  Dim objIE As Object  Const READYSTATE_COMPLETE As Long = 4 'IEオブジェクト状態(4=読み込み完了)  Set objIE = CreateObject("InternetExplorer.application")  objIE.Visible = True  objIE.Navigate "http://*****"  While objIE.ReadyState <> READYSTATE_COMPLETE   While objIE.Busy = True    DoEvents   Wend  Wend  objIE.Document.Forms("****").Item("****").Select  Application.SendKeys "C:\Documents and Settings\****.ext", True  objIE.Document.Forms("****").Item("****").Click 'アップロードボタン押下 End Sub

hiro7314
質問者

お礼

何度もありがとうございました。 無事、解決しました。 ------------------------------------------------------------- Private Sub input_txt()  Dim objIE As Object  Const READYSTATE_COMPLETE As Long = 4 'IEオブジェクト状態(4=読み込み完了)  Set objIE = CreateObject("InternetExplorer.application")  objIE.Visible = True  objIE.Navigate "​http://*****"​  While objIE.ReadyState <> READYSTATE_COMPLETE   While objIE.Busy = True    DoEvents   Wend  Wend objIE.Document.all(n).Select ;nは、 type=file の選択ボタン。.Clickで実行するとファイルの選択ダイアログが開く  Application.SendKeys "C:\test.xls", True objIE.Document.all(m).Click ;mは、「ファイルを読み込む」ボタンをクリックする番号 End Sub -------------------------------------------------------------  上記の様に改造したところ、XP、Excel2000、IE7の環境で、無事にファイル:C:\test.xls を送り、送信ボタンもクリックされ、処理がはじまりました。 何度もおつきあいいただき、本当にありがとうございます。

その他の回答 (9)

noname#185804
noname#185804
回答No.9

もし良ければ一旦確認して欲しいのですが objIE.Document.all(n).Click ;と objIE.Document.all(m).Click ;を削除(コメントアウト)して Application.SendKeys "C:\aaa.xls"の直ぐ下に ブレークポイントを入れて実行して見て下さい どのような動作になりますか? 僕としてはファイル名のテキストボックスがセレクトされて(フォーカスが移る) C:\aaa.xlsが入力されるかと思うのですが、実際の動作を見てみたいので また上記でダメな場合は、上記コメントアウトのままで .Item("uploadFileName").Selectを.Item("uploadFileName").Focusに変えて 再度実行してみて下さい お手数をお掛けしてすみませんが、同じ状態がこちらで再現出来ないので あと気になるのがIE7です、当てはまらないけども、CreateObjectの動作が おかしいという記述を見たのでちょっと気になってますが・・・。 あとWendy02さんがご回答なされたle Field コントロールと 自分が思ってるVBAでのINPUT type=file へのアップロード作業ができないか 後日検証してみます

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.8

こんばんは。 ここまで引き伸ばして、ちょっと肩透かしで申し訳ないのですが、きちんと調べてみました。 私は知らなかったのですが、HTTPのアップロードは、RFC2518等の制約があり、上手く行かないとのことです。そこで調べてみると、VB系なら、ASP.NET のFile Fieldコントロールを使うと良いとか書かれていましたが、私は、勉強をしていないので、あまり詳しくありません。 http://www.microsoft.com/japan/msdn/net/aspnet/aspnet-fileupload.aspx File Field コントロール http://hanatyan.sakura.ne.jp/logbbs/wforum.cgi?mode=allread&no=5232&page=900 アップロードのいくつかの方法 VBAで解決するには、何かライブラリが必要かもしれません。

hiro7314
質問者

お礼

調べていただいて、ありがとうございます。 お手数おかけしました。 No.10:nekonさんへのご回答の通り、無事に通過しました。 ありがとうございます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.7

#5のお礼のコードですが、 私が調べるのは、 SourceIndex, Type, TagName の3を調べます。 しかし、多くは、セキュリティのために、名称が出てこないものがありますので、   .Document.all.Item(xxx).Click ここの中が、数字もあれば、文字もあります。 なお、テキストボックスに入れた後の認識のタイムラグがあるはずですから、そのままVBAを走らせることできませんが、VBAのWait では、不安があるので、Win32 API のSleep を使っています。

hiro7314
質問者

お礼

ありがとうございます。 ------------------------------------------------------------- Sub InputIE_enter()   Dim objIE As Object   Set objIE = CreateObject("InternetExplorer.Application")   objIE.Visible = True   objIE.Navigate "​http://XXXXXX.htm"​ Application.Wait Time:=Now + TimeValue(00:00:05) ;5秒ウェイト objIE.Document.all(n).Click ;nは、 type=file のボックスをクリックする番号   Do While objIE.Busy     DoEvents   Loop   Do Until objIE.ReadyState = 4    DoEvents   Loop   With objIE.Document.all     .Item("uploadFileName").Select     Application.SendKeys "C:\aaa.xls" 'この後に操作が必要かもしれません。 Application.Wait Time:=Now + TimeValue(00:00:05) ;5秒ウェイト objIE.Document.all(m).Click ;mは、「ファイルを読み込む」ボタンをクリックする番号   End With      Set objIE = Nothing ------------------------------------------------------------- 現在、このようにコードが改造されています。 今一歩の所まで行っている感じです。 このコードを実行すると、ファイルの選択ダイアログが開き、止まります。 その後、手動でファイルの選択ダイアログのキャンセルボタンをクリックすると、C:\aaa.xls が入り、「ファイル読込ボタン」もクリックされて処理が進みました。 objIE.Document.all(n).Click ;nは、 type=file のボックスをクリックする番号 を除いて実行すると、「ファイルを選択してください」と警告がでます。 ※2度試して、同じ結果でした。 という事は、ファイルの選択ダイアログに対し、キャンセルボタンのクリックが入れられれば、先に進むと思うのですが、何か有効な方法はありますでしょうか?

noname#185804
noname#185804
回答No.6

ファイル名がテキストボックスに入力されてないという事は sendkeysが正しく動作していないのかな、 sendkeysが実行される前にIE(目的のサイト)がアクティブな状態で、 テキストボックスにフォーカスが移動していますでしょうか? あと、目的のサイトには操作対象のテキストボックスなどの コントロールが無数にあるのですか? 特にtype=fileのテキストボックスは一つだけ? もしかしたらVBAの処理が追いつかないのかな?と思ったもので。

hiro7314
質問者

お礼

ありがとうございます。 > 特にtype=fileのテキストボックスは一つだけ?  type=file のボックスは一つだけです。  IEはVBAが起動したもので、アクティブです。 > テキストボックスにフォーカスが移動していますでしょうか?  ここなのですが、#2 Wendy02 さんのコードを実行した場合、フォーカスは移動していますよね?  特に問題指摘されていないので、このままのコードで、フォーカス移動に問題ないと思いますが、もし可能なら、フォーカスを移動するコードを教えていただけると助かります。  なお、今まで失念していましたが、私の環境が、IE7なのは、なにか関係ありますでしょうか?

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.5

こんばんは。 #4のnekonさん、調べていただいて恐れ入ります。 ただ、#2のコードで足らない部分は、 >'この後に操作が必要かもしれません と書きましたが、サンプルのサイトには、クリックを命令する部分がありません。実際は、クリックする場所を探さなくてはなりません。サイトのソースを取って調べればよいのですが、それはご自身でしてもらうしかないと思います。なお、私のやり方は、IEからソースを取るのではなくて、プログラムから、objIE.Document を取り、タグ名の一覧を作ります。Excelは、そういう点で便利です。

hiro7314
質問者

お礼

ありがとうございます。このヒントを得て、 >'この後に操作が必要かもしれません の部分に、「ファイルをアップロードする」ボタンの.clickを入れてみたのですが#4のnekonさんへのご回答のように、エラーが出てしまいました。 >objIE.Document を取り、タグ名の一覧を作ります 私も似たような事をしています。 Dim objIE As Object Dim i As Integer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "調べたいページ" On Error Resume Next For i = 1 To 2000 Cells(i, 1).Value = objIE.Document.all(i).innerHTML Cells(i, 2).Value = objIE.Document.all(i).innerText Cells(i, 3).Value = objIE.Document.all(i).ID Cells(i, 4).Value = objIE.Document.all(i).uniqueID Cells(i, 5).Value = objIE.Document.all(i).Value Next Set objIE = Nothing End Sub これで行数を頼りに、操作を調べたりしています。

noname#185804
noname#185804
回答No.4

僕も同じ事をしたくて調べてる者ですが、 input fileのvalue値は読み取り専用で 参照ボタンと手動入力以外での入力は不可能のようです (セキュリティ上の仕様だそうです) 但し、SendKeysやAPIのSendInput関数を使えば 入力出来るみたいです 尚、回答No.2の方のコードをVBAで実行しても問題なく動作しますが どの部分がダメなのでしょうか?

hiro7314
質問者

お礼

ありがとうございます。 確かに、一見、問題なく動作しているように見えるのですが、アップロードするファイルの情報が送られていません。 現実に、VBAが通過してもファイル名には何も入っておりません。 実際に動かしたいサイトでは、入力で選んだファイルをアップロードするボタンがあるのですが、.Click を入れても、「アップロードするファイルを選択してください」になってしまいます。 このため、正常動作していないと判断したのですが、如何でしょうか?

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 本来なら、FTPを使うわけですが、しょせん、SendKey を使うぐらいなら、以下のようなソフトを使ってしまったほうが早いですね。 Windows 自動化ソフト  UWSC http://www.uwsc.info/

hiro7314
質問者

お礼

回答、ありがとうございます。 ただ、VBAを使ってコントロールする事が条件なので、申し訳ないですが、キー操作再生ソフトには頼れないのです。 また、目的のサイトには、FTPによるファイル受付がありませんので、ファイルダイアログが唯一の入り口です。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 こんな風にすれば、入るとは思いますが、今の段階では、入れるだけです。 本来は、その後の操作のために、.Clickなどが必要だと思います。 Sub InputIE_enter()   Dim objIE As Object   Set objIE = CreateObject("InternetExplorer.Application")   objIE.Visible = True   objIE.Navigate "http://XXXXXX.htm"      Do While objIE.Busy     DoEvents   Loop   Do Until objIE.ReadyState = 4    DoEvents   Loop   With objIE.Document.all     .Item("uploadFileName").Select     Application.SendKeys "C:\aaa.xls" 'この後に操作が必要かもしれません。   End With      Set objIE = Nothing End Sub

hiro7314
質問者

お礼

ありがとうございます。 やっと時間が取れ、コードを試したのですが、ダメでした。 通過はするのですが、ファイル名が入っている様子がありません。 試しに、先にクリックを入れてからやってみたのですが、先にクリックを入れると、コード全体がフリーズして止まってしまい、ブレークを入れないと先に進みませんでした。

  • marbin
  • ベストアンサー率27% (636/2290)
回答No.1

参考になると思います。 三流君VBAでIE操作 InternetExplorer.Applicationを操作する http://www.ken3.org/cgi-bin/group/vba_ie.asp

hiro7314
質問者

補足

ありがとうございます。 このサイトは参考にしましたが、ダイアログのコントロールについては触れられていないように思います。

関連するQ&A

専門家に質問してみよう