<input type=file>のファイルダイアログを制御するには?

解決


appa  2005-03-10 14:40:15  No: 88790  IP: [192.*.*.*]

HTMLの<input type=file>の「value」には値を送れないので,
「Click」で開かれるファイルダイアログに値を送りたいのですが。
できればその後,「開く」ボタンにも「Click」を送りたいと思います。
sendkeysではどうも上手くいかなくて,このファイルダイアログを
操作する方法を教えてください。

編集 削除
LESIA  2005-03-10 15:30:59  No: 88791  IP: [192.*.*.*]

"c:\test\test.jpg"を送りたい場合
<input type=file>が複数あるとうまくいかないかも(^^;

Dim objElement As Object

For Each objElement In WebBrowser1.Document.getElementsByTagName("INPUT")
    If objElement.Type = "file" Then
        objElement.Focus
        SendKeys "{TAB} c:\test\GC0112C.jpg{ENTER}"
    End If
Next objElement

編集 削除
LESIA  2005-03-10 15:32:49  No: 88792  IP: [192.*.*.*]

あ、間違えた
SendKeys "{TAB} c:\test\test.jpg{ENTER}"
ですね。

編集 削除
appa  2005-03-10 15:47:56  No: 88793  IP: [192.*.*.*]

LESIA様、早速のご返答ありがとうございます。
現在、下記のコードでファイルダイアログを開いた状態です。

Dim objIE As Object
Set objIE = CreateObject("InternetExplorer.application")
objIE.Navigate "URL"
objIE.document.all.ボタン.Click

このコード後に、LESIA様のご返答にある「WebBrowser1.Document…」の箇所を「objIE.Document…」として実行してみました。
結果ファイルダイアログには値は送られず、ダイアログ終了後に、開かれているWebページに「sendkeys」が送られるという結果となりました。
私の現在のコードがおかしい可能性が高いのですが。
申し訳ありません。稚拙な私のコードの場合でのご助言をお願いいたします。

編集 削除
LESIA  2005-03-10 16:13:11  No: 88794  IP: [192.*.*.*]

ページが表示される前に処理してしまってるからでしょう。

Dim objIE As Object
Set objIE = CreateObject("InternetExplorer.application")
objIE.Navigate "URL"

Do While objIE.Busy = True
    DoEvents
Loop

Do While objIE.Document.ReadyState <> "complete"
    DoEvents
Loop

objIE.document.all.ボタン.Click

Do While objIE.Busy = True
    DoEvents
Loop

Do While objIE.Document.ReadyState <> "complete"
    DoEvents
Loop

編集 削除
appa  2005-03-10 16:15:19  No: 88795  IP: [192.*.*.*]

「objIE.document.all.ボタン.Click」を実行しないで、LESIA様のコードを実行してみましたが、やはり<type=input>なので、値を入力(sendkeys)することはできませんでした。
クリップボードに入れた値を貼り付けようとも考えたのですが、貼り付けのキーも受け付けないようです…。

編集 削除
appa  2005-03-10 16:26:53  No: 88796  IP: [192.*.*.*]

何度もご返答ありがとうございます。
すいません文章を送信後にLESIA様のご返答に気づきまして。

Do While objIE.Busy = True
    DoEvents
Loop

Do While objIE.Document.ReadyState <> "complete"
    DoEvents
Loop

のコードは私も実行しておりまして。
待ち時間を強引にもうけても、<input type=file>ボタンをクリック後に開かれるファイルダイアログには、「sendkeys」できません…。
このファイルダイアログが開いたとき、フォーカスはファイル名入力の場所にちゃんと移っております。

編集 削除
LESIA  2005-03-10 16:34:46  No: 88797  IP: [192.*.*.*]

SendKeysするデータは、{TAB}とファイル名の間にはスペースが必要なんですが
入れてますでしょうか?(^^;
問題なければ、そのページのURLを教えていただければ、こちらでもテストが
出来るんですが・・・

編集 削除
INA  2005-03-10 16:42:03  No: 88798  IP: [192.*.*.*]

マルチポストはマナー違反だと思います。

編集 削除
LESIA  2005-03-10 17:01:55  No: 88799  IP: [192.*.*.*]

マルチポストだったのか・・・でも、ひとつだけ。

SendKeysするデータの最後の{ENTER}はファイルダイアログの[開く]ボタンを
クリックするもので、ファイルダイアログは一瞬で閉じてしまい、SendKeys
出来たかどうか確認することは不可能だと思いますが(^^;
<input type=file>のテキストボックスの部分にファイル名が入ってたら
うまくいったことになります。

編集 削除
appa  2005-03-10 17:13:26  No: 88800  IP: [192.*.*.*]

すいません初めてQ&A掲示板を利用したもので,マナーを知らずに申し訳あり
ませんでした。

LESIA様,何度も丁寧なご返答をどうもありがとうございます。
実験しているページは,
<input type=file>
を記述しただけのhtmlファイルです。
やはりファイルダイアログが開いたままでした。
LESIA様,何度も本当にありがとうございました。
マナー違反だったもので,ここで解決とさせていただきます。

編集 削除
LESIA  2005-03-10 17:46:37  No: 88801  IP: [192.*.*.*]

ひとつずつSendKeysして、どこまでうまくいくか確認してみるとか。
(1)SendKeys "{TAB}" '参照ボタンにフォーカスが移る
(2)SendKeys "{TAB} " 'ファイルダイアログが表示される。
(3)SendKeys "{TAB} c:\test\test.jpg" 'ファイル名が入力される
(4)SendKeys "{TAB} c:\test\test.jpg{ENTER}" '[開く]ボタンがClickされる

って、もう解決したんですね(T_T)

編集 削除
INA  2005-03-10 18:19:19  No: 88802  IP: [192.*.*.*]

>って、もう解決したんですね(T_T)

こちらが情報元です。
http://www2.moug.net/app/bbs/message.php?cat=exvba&id=20050310-000026

編集 削除