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 に希望のファイル名を入力することは出来るでしょうか?
方法をご存知の方がいらしたら、教えてください。
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
何度もありがとうございました。
無事、解決しました。
-------------------------------------------------------------
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 を送り、送信ボタンもクリックされ、処理がはじまりました。
何度もおつきあいいただき、本当にありがとうございます。
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 へのアップロード作業ができないか
後日検証してみます
No.8
- 回答日時:
こんばんは。
ここまで引き伸ばして、ちょっと肩透かしで申し訳ないのですが、きちんと調べてみました。
私は知らなかったのですが、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で解決するには、何かライブラリが必要かもしれません。
調べていただいて、ありがとうございます。
お手数おかけしました。
No.10:nekonさんへのご回答の通り、無事に通過しました。
ありがとうございます。
No.7
- 回答日時:
#5のお礼のコードですが、
私が調べるのは、
SourceIndex, Type, TagName の3を調べます。
しかし、多くは、セキュリティのために、名称が出てこないものがありますので、
.Document.all.Item(xxx).Click
ここの中が、数字もあれば、文字もあります。
なお、テキストボックスに入れた後の認識のタイムラグがあるはずですから、そのままVBAを走らせることできませんが、VBAのWait では、不安があるので、Win32 API のSleep を使っています。
ありがとうございます。
-------------------------------------------------------------
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度試して、同じ結果でした。
という事は、ファイルの選択ダイアログに対し、キャンセルボタンのクリックが入れられれば、先に進むと思うのですが、何か有効な方法はありますでしょうか?
No.6
- 回答日時:
ファイル名がテキストボックスに入力されてないという事は
sendkeysが正しく動作していないのかな、
sendkeysが実行される前にIE(目的のサイト)がアクティブな状態で、
テキストボックスにフォーカスが移動していますでしょうか?
あと、目的のサイトには操作対象のテキストボックスなどの
コントロールが無数にあるのですか?
特にtype=fileのテキストボックスは一つだけ?
もしかしたらVBAの処理が追いつかないのかな?と思ったもので。
ありがとうございます。
> 特にtype=fileのテキストボックスは一つだけ?
type=file のボックスは一つだけです。
IEはVBAが起動したもので、アクティブです。
> テキストボックスにフォーカスが移動していますでしょうか?
ここなのですが、#2 Wendy02 さんのコードを実行した場合、フォーカスは移動していますよね?
特に問題指摘されていないので、このままのコードで、フォーカス移動に問題ないと思いますが、もし可能なら、フォーカスを移動するコードを教えていただけると助かります。
なお、今まで失念していましたが、私の環境が、IE7なのは、なにか関係ありますでしょうか?
No.5
- 回答日時:
こんばんは。
#4のnekonさん、調べていただいて恐れ入ります。
ただ、#2のコードで足らない部分は、
>'この後に操作が必要かもしれません
と書きましたが、サンプルのサイトには、クリックを命令する部分がありません。実際は、クリックする場所を探さなくてはなりません。サイトのソースを取って調べればよいのですが、それはご自身でしてもらうしかないと思います。なお、私のやり方は、IEからソースを取るのではなくて、プログラムから、objIE.Document を取り、タグ名の一覧を作ります。Excelは、そういう点で便利です。
ありがとうございます。このヒントを得て、
>'この後に操作が必要かもしれません
の部分に、「ファイルをアップロードする」ボタンの.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
これで行数を頼りに、操作を調べたりしています。
No.4
- 回答日時:
僕も同じ事をしたくて調べてる者ですが、
input fileのvalue値は読み取り専用で
参照ボタンと手動入力以外での入力は不可能のようです
(セキュリティ上の仕様だそうです)
但し、SendKeysやAPIのSendInput関数を使えば
入力出来るみたいです
尚、回答No.2の方のコードをVBAで実行しても問題なく動作しますが
どの部分がダメなのでしょうか?
ありがとうございます。
確かに、一見、問題なく動作しているように見えるのですが、アップロードするファイルの情報が送られていません。
現実に、VBAが通過してもファイル名には何も入っておりません。
実際に動かしたいサイトでは、入力で選んだファイルをアップロードするボタンがあるのですが、.Click を入れても、「アップロードするファイルを選択してください」になってしまいます。
このため、正常動作していないと判断したのですが、如何でしょうか?
No.3
- 回答日時:
こんばんは。
本来なら、FTPを使うわけですが、しょせん、SendKey を使うぐらいなら、以下のようなソフトを使ってしまったほうが早いですね。
Windows 自動化ソフト
UWSC
http://www.uwsc.info/
回答、ありがとうございます。
ただ、VBAを使ってコントロールする事が条件なので、申し訳ないですが、キー操作再生ソフトには頼れないのです。
また、目的のサイトには、FTPによるファイル受付がありませんので、ファイルダイアログが唯一の入り口です。
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
ありがとうございます。
やっと時間が取れ、コードを試したのですが、ダメでした。
通過はするのですが、ファイル名が入っている様子がありません。
試しに、先にクリックを入れてからやってみたのですが、先にクリックを入れると、コード全体がフリーズして止まってしまい、ブレークを入れないと先に進みませんでした。
No.1
- 回答日時:
参考になると思います。
三流君VBAでIE操作 InternetExplorer.Applicationを操作する
http://www.ken3.org/cgi-bin/group/vba_ie.asp
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript アップロードファイルの種類によって処理を分岐させたいのですが書き方が分からずアドバイスお願いします 4 2023/06/17 19:12
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- PHP PHPで画像の渡しが上手く行きません。 1 2023/02/02 09:39
- HTML・CSS CSSが効かずどのように指定すれば良いか分からないのでアドバイスお願い致します 2 2023/06/07 12:25
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- JavaScript javascriptでテーブルに追加した項目のid追加してローカルストレージを操作したい 5 2023/01/01 15:52
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Visual Basic 6.0 コンボボック...
-
C# WMPメディアの終了検知 その2
-
タブキー押下時のイベントをひ...
-
KEYPREVIEW=TRUEについて。意味...
-
GetKeyStateについて
-
【VB】タブ切り替え時のイベント
-
EXCEL VBA でIEを制御して、INP...
-
(VBA)チェックボックスのclick...
-
コンボボックスにキー入力をさ...
-
WPFでの時刻入力コントロールに...
-
キーイベントを擬似的に発生さ...
-
プログラミングc# Windowsフォ...
-
Access データ表示 完了時のイ...
-
vba set Focus
-
ユーザーフォームのテキストボ...
-
IEで、BackSpaceで「戻る」機能...
-
【Mouse Down】キーリピートを...
-
VB.NETのDropDownListをReadOnl...
-
ListViewで、PageDownキーイベ...
-
複数のテキストボックスのカン...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【VB】タブ切り替え時のイベント
-
特定のキーを押すまでループさ...
-
タブキー押下時のイベントをひ...
-
Visual Basic 6.0 コンボボック...
-
一定時間操作されないと自動で...
-
WPFでの時刻入力コントロールに...
-
(VBA)チェックボックスのclick...
-
コンボボックスにキー入力をさ...
-
VB.NETのDropDownListをReadOnl...
-
VB.NETでフォームがない...
-
NULLで検索を行ったときは全件...
-
Excel VBA マクロ実行中のみテンキ...
-
KEYPREVIEW=TRUEについて。意味...
-
エクセルVBAのテキストボック、...
-
テキストボックスの入力文字を1...
-
キーイベントを擬似的に発生さ...
-
フォーカスについてお教えください
-
【Mouse Down】キーリピートを...
-
複数のテキストボックスのカン...
-
VB6で電卓を作っているのですが...
おすすめ情報