プロが教えるわが家の防犯対策術!

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 に希望のファイル名を入力することは出来るでしょうか?

方法をご存知の方がいらしたら、教えてください。

A 回答 (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
    • good
    • 1
この回答へのお礼

何度もありがとうございました。
無事、解決しました。

-------------------------------------------------------------
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 を送り、送信ボタンもクリックされ、処理がはじまりました。

何度もおつきあいいただき、本当にありがとうございます。

お礼日時:2009/01/26 00:27

もし良ければ一旦確認して欲しいのですが


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 へのアップロード作業ができないか
後日検証してみます
    • good
    • 0

こんばんは。



ここまで引き伸ばして、ちょっと肩透かしで申し訳ないのですが、きちんと調べてみました。

私は知らなかったのですが、HTTPのアップロードは、RFC2518等の制約があり、上手く行かないとのことです。そこで調べてみると、VB系なら、ASP.NET のFile Fieldコントロールを使うと良いとか書かれていましたが、私は、勉強をしていないので、あまり詳しくありません。

http://www.microsoft.com/japan/msdn/net/aspnet/a …
File Field コントロール

http://hanatyan.sakura.ne.jp/logbbs/wforum.cgi?m …
アップロードのいくつかの方法

VBAで解決するには、何かライブラリが必要かもしれません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/26 00:29

#5のお礼のコードですが、



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

ありがとうございます。
-------------------------------------------------------------
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度試して、同じ結果でした。

という事は、ファイルの選択ダイアログに対し、キャンセルボタンのクリックが入れられれば、先に進むと思うのですが、何か有効な方法はありますでしょうか?

お礼日時:2009/01/23 12:27

ファイル名がテキストボックスに入力されてないという事は


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

ありがとうございます。

> 特にtype=fileのテキストボックスは一つだけ?
 type=file のボックスは一つだけです。
 IEはVBAが起動したもので、アクティブです。

> テキストボックスにフォーカスが移動していますでしょうか?
 ここなのですが、#2 Wendy02 さんのコードを実行した場合、フォーカスは移動していますよね?
 特に問題指摘されていないので、このままのコードで、フォーカス移動に問題ないと思いますが、もし可能なら、フォーカスを移動するコードを教えていただけると助かります。

 なお、今まで失念していましたが、私の環境が、IE7なのは、なにか関係ありますでしょうか?

お礼日時:2009/01/23 11:55

こんばんは。


#4のnekonさん、調べていただいて恐れ入ります。

ただ、#2のコードで足らない部分は、
>'この後に操作が必要かもしれません

と書きましたが、サンプルのサイトには、クリックを命令する部分がありません。実際は、クリックする場所を探さなくてはなりません。サイトのソースを取って調べればよいのですが、それはご自身でしてもらうしかないと思います。なお、私のやり方は、IEからソースを取るのではなくて、プログラムから、objIE.Document を取り、タグ名の一覧を作ります。Excelは、そういう点で便利です。
    • good
    • 0
この回答へのお礼

ありがとうございます。このヒントを得て、

>'この後に操作が必要かもしれません
の部分に、「ファイルをアップロードする」ボタンの.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

これで行数を頼りに、操作を調べたりしています。

お礼日時:2009/01/21 18:28

僕も同じ事をしたくて調べてる者ですが、


input fileのvalue値は読み取り専用で
参照ボタンと手動入力以外での入力は不可能のようです
(セキュリティ上の仕様だそうです)
但し、SendKeysやAPIのSendInput関数を使えば
入力出来るみたいです

尚、回答No.2の方のコードをVBAで実行しても問題なく動作しますが
どの部分がダメなのでしょうか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/21 18:21

こんばんは。



本来なら、FTPを使うわけですが、しょせん、SendKey を使うぐらいなら、以下のようなソフトを使ってしまったほうが早いですね。

Windows 自動化ソフト
 UWSC
http://www.uwsc.info/
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/01/20 14:44

こんばんは。



こんな風にすれば、入るとは思いますが、今の段階では、入れるだけです。
本来は、その後の操作のために、.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
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

お礼日時:2009/01/18 23:58

参考になると思います。



三流君VBAでIE操作 InternetExplorer.Applicationを操作する
http://www.ken3.org/cgi-bin/group/vba_ie.asp

この回答への補足

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

補足日時:2009/01/18 23:54
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています