• ベストアンサー

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

  • Excel VBAでファイルの制御をしたい

    今、Excel VBAでファイル操作の制御スクリプトをくみたくて 悩んでおります。。 "test.xls"ファイルというエクセルの共有ファイルがあります。 そのファイルは日々様々なユーザーがデータを書き込みます。 この共有ファイルに対し、誰か一人がこのファイルを開いている際に 違う誰かがファイルを開こうとした場合に、警告メッセージを表示した後、強制的にファイルを閉じるというプログラムを組みたいのですが・・。 何せ、VBAでのプログラミングはまったくの初心者の為、 悪戦苦闘しております。 どなたか、良いアドバイスを頂けたら嬉しいです。 是非、宜しくお願い致します。

  • あるHPにエクセルのVBAから入力したいのですが

    はじめまして。VBAの初心者です。 現在、エクセルVBAを用いてIEにログインするコードを作っています。 で、他のページはうまくいったのですが、 https://www.wnp.waseda.jp/portal/portal.php このホームページだけは他のページと同じやり方でやっても、フォームに文字を入力することができません。 ちなみに以下のコードを記述しましたがうまくいきませんでした。 'IEの起動 Dim objIE As Object '変数を定義します。 Set objIE = CreateObject("InternetExplorer.Application") 'オブジェクトを作成します。 objIE.Visible = True '可視、Trueで見えるようにします。 '処理したいページを表示します。 objIE.Navigate "https://www.wnp.waseda.jp/portal/portal.php" 'ページの表示完了を待ちます。 While objIE.ReadyState <> 4 Or objIE.Busy = True '.ReadyState <> 4の間まわる。 DoEvents Wend objIE.Document.Form1("loginid").Value ="私のID" '←ここでエラーがでます。 (1)なぜ他のHPと同じようにはいかないかという点と、できれば、(2)うまくいくコード、を教えていただければ嬉しいです。 よろしくお願いします。

  • Excel2003VBAからIE64bitを制御

    Excel2003 VBAから、 CreateObject("InternetExplorer.application")でIEを起動できますが、 XP64bitの場合、IE32bitが起動します。 XP64bitには、IEが32bit版と64bit版が入っています。 Excel2003 VBAから、IE64bitを起動できるのでしょうか? Excel2003 VBAのVB6.0は32bitなので、 そもそも64bitソフトを制御できないものなのでしょうか? IE64bitを起動させるだけなら、Shellとフルパスでできますが、 objIEにオブジェクトとして格納できないので、制御ができません。 ヒントでも構いませんので、ご教授いただけると幸いです。

  • VBAでIE操作

    こんばんは。エクセル2003です。 証券会社にVBAでログインを試みてるのですができません。 ソースの一部を転記します。 <label for="account_id"><span>ユーザー名</span></label> <input type="text" tabindex="1" id="account_id" name="account_id" /> <label for="password"><span>パスワード</span></label> <input type="password" tabindex="2" id="password" name="password" /> <div id="rememberbox"> <label for="remember" id="rememberlabel">ユーザー名を記録する</label> <input type="checkbox" tabindex="3" name="remember" id="remember" /> </div> なので、下記VBAコードを作りました。 Sub IGマーケット証券() Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "http://www.igmarkets.co.jp/login/" Do While objIE.Busy = True DoEvents Loop Const READYSTATE_COMPLETE As Long = 4 Do Until objIE.ReadyState = READYSTATE_COMPLETE Loop objIE.Document.all("account_id").Value = "test" objIE.Document.all("password").Value = "test" objIE.Document.Forms(0).submit Set objIE = Nothing End Sub ですが、 objIE.Document.all("account_id").Value = "test" のところでエラーになってしまいます。 objIE.Document.all("login").Value = "test" に変えても同じです。 何がいけないのでしょうか? アドバイスよろしくお願いします。

  • EXCEL VBAで制御できるアップロート゜ツールは?

    FFFTPを使用してファイルの転送をしていますが、 これをEXCEL VBAで制御しようとしたのですが FFFTPは自動化に向かないらしく、制御できません。 EXCEL VBA で制御できるフリーソフトは無いでしょうか。使用OSはWIN95です。

  • input type="file"の入力チェック

    よろしくお願い致します。 入力チェックページ付きのメールフォームについて、添付ファイルを必須項目にしたいと考えております。 <input type="text" name="お名前" />の場合は、以下のようなコードで入力チェックしております。 if($DATA['お名前'] == ""){ $err.="【お名前】を入力して下さい。\n"; } <input type="file" name="添付ファイル" />の添付ファイルも同じコードで試してみたところ、 if($DATA['添付ファイル'] == ""){ $err.="【添付ファイル】を選択して下さい。\n"; } ファイルの添付の有無に関わらず、「添付ファイルを選択して下さい。」というエラーコードが常に表示されます。 「input type="file"」の場合の入力チェックはどのようなコードを書けば良いのでしょうか?

    • 締切済み
    • PHP
  • <input>でonblur=がある場合の入力

    次に挙げるようなHTMLがあります。 <form id="form" onsubmit="return checkDoubleSend();" action="/app/ord_jp_mgn_new.do;BV_SessionID=3DkhRFvB5lvTDRRhpK1H!1855743830?gmn=J&smn=05&lmn=02&fmn=01" method="post" name="OrdJpMgnNewForm"> 中略 <input type="text" onblur="valueDelComma(this.value, this);" value="" size="12" maxlength="8" name="orderValue" style=""></input> この<input>において、次に挙げるVBAで入力を試みました。 objIE.Document.forms("form")("orderValue").Value = Cells(Row, 5) そうしたところ、「438 オブジェクトは、そのプロパティまたはメソッドをサポートしてません。」のダイアログが出ました。 素人考えでは「onblur=」が悪さをしているのではないかと思うのですが、このような<input>にVBAから値を代入するのにはどのようにすればよいのでしょうか。

  • エクセルVBA ブラウザのコントロールについて

    VBでIEオブジェクトを使用、yahooのとあるページを表示し、 その中の 「ダウンロード」ボタンを押すとcsvファイルをDLするプログラムを作っています。(vista、IE8) For Each objLINK In objIE.Document.Links If objLINK.InnerTEXT = "ダウンロード" Then objLINK2.Click Exit For End If Next ここで、「ファイルのダウンロード」メッセージ   開く(O) 保存(S) キャンセル が表示されるのですが、表示されたとたんにVBAから制御できなくなります。 どうすればボタンを押せるのでしょうか? なお、普通にIEオブジェクトを作ると、ダウンロードのボタンすら押せなかったので、 こちらの三流君様のページを参考にして、ユーザーフォームの中でIEオブジェクトを作っています。http://www.ken3.org/cgi-bin/group/vba_ie7.asp よろしくお願いいたします。

  • タグ<type=file>にファイル名を指定したい

    VBAでファイルをアップロードしたいのですが、 テキストボックスにファイル名を入れる事ができません。 http://okwave.jp/qa/q4624451.htmlを参考に、 ------------------------------------------------------- <html> <head> <title>タイトル</title> </head> <body> <FORM encType=multipart/form-data method=post action=/filemanager/upload><INPUT name=directory value=Sample type=hidden> <INPUT name=userfile size=40 type=file> </body> </html> ------------------------------------------------------- というソースに対して、 ------------------------------------------------------- Sub テスト() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "C:\Users\○○\Desktop\test.html" Application.wait (Now + TimeValue("00:00:03")) objIE.Document.all.Item("userfile").Click 'ダイアログが開く Application.SendKeys "C:\Users\○○\Desktop\aetaw.html", True '何もされない End Sub ------------------------------------------------------- をしたのですが、SendKeysの行が機能しません。 ------------------------------------------------------- Sub テスト() Dim objIE As InternetExplorer Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "C:\Users\○○\Desktop\test.html" Application.wait (Now + TimeValue("00:00:03")) objIE.Document.all("userfile").Value = "test" End Sub ------------------------------------------------------- は、エラーにはならないけど値も入らなかったです。 何か解決策はありますでしょうか?ご回答よろしくお願いします。

  • [VBA] IEによる自動ログインについて

    こちらの識者の方々にはいつもお世話になっています。 VBAの質問です。 環境は下記になります。 OS=windows7 pro 64bit Office=Excel2007(12.0.6712.5000) SP3 IE=11.0.9600.17501(IE11) ・やりたいこと VBAを使用してnanacoのサイトに自動ログオンする ・試したコード Option Explicit Sub test() Dim objIE As Object Dim obj As Object Set objIE = CreateObject("InternetExplorer.Application") objIE.Visible = True objIE.Navigate "https://www.nanaco-net.jp/pc/emServlet" Do While objIE.Busy = True Or objIE.readyState <> 4 DoEvents Loop 'ID、pass入力 For Each obj In objIE.document.getElementsByTagName("input") If obj.ID = "XCID" Then obj.Value = "1234567890123456" 'nanaco番号 End If If obj.ID = "SECURITY_CD" Then obj.Value = "1234567" 'カード記載の番号 End If Next 'ログインボタンをクリックする For Each obj In objIE.document.getElementsByTagName("button") If obj.ID = "Login" Then obj.Click End If Next Set objIE = Nothing End Sub ・問題点 ログイン画面の「カード記載の番号でログインする」の項目の「nanaco番号」「カード記載の番号」にそれぞれ「1234567890123456」「1234567」を入力したいのですが、自分で調べて上記コードを試したところ、IEは立ち上がるものの、該当の箇所に文字列が入力されません。 コードの「ログインボタンをクリックする」部分についても動作していないと思います。 VBAでIEを制御すること自体慣れていないのですが、上記コードの問題点とできればコードをご教授いただけますでしょうか。 質問に不備不足等ございましたらご指摘ください。 ご面倒お掛けしますがよろしくお願いします。

専門家に質問してみよう