質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

ダイアログ

ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

Q&A

解決済

2回答

2171閲覧

ファイル選択ダイアログが開かない

VBA-IE

総合スコア16

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

ダイアログ

ユーザーにウィンドウやボックス等の形で個別で表示されるフォームであり、ユーザーに判断を促す目的で表示される。ユーザーが見逃す事のないよう、操作中のフォーム上にポップアップして表示される。

0グッド

0クリップ

投稿2017/09/14 05:47

EXCEL VBAでホームページ(IE)にファイルをアップさせる記述を書いています。
ファイル選択のダイアログのところに直接フルパスでアップするファイル名を入力させたいと考えたいます。
objIE.document.getElementsByName("csv")(0).Click
でクリックできファイル選択ダイアログボックスが開くのですが、その後にVBAに制御が戻って来ないため、色々調べていたところ「VBA IE制御でファイル選択ダイアログにファイルパス入力(62945)」を見つけ、window.setTimeoutを使いVBAに戻ったところで、SendKeys "^v", Trueを実行すればできると分かり、下記のように記述しましたが、かんじんのファイル選択ダイアログボックスが開きません。
window.setTimeoutを使う前のobjIE.document.getElementsByName("csv")(0).Click
では確実にファイル選択ダイアログボックスが開いたので、記述がどこか間違えているのでしょうか?
window.setTimeoutを使う場合の方法を教えていただきたく、よろしくお願いします。

<関連場所のスクリプト記述>
objIE.document.parentWindow.execScript "window.setTimeout(""document.getElementsByName('csv')(0).Click();"",10);"
'1秒待機
Sleep (1000)
SendKeys "^v", True

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

私もweb系には強くないのに今回参考にされている質問で回答してしまった者です。(^-^;;

以下、推測交じりのアドバイスになってしまいますがご了承ください。

対応

objIE.document.parentWindow.execScript "window.setTimeout(""document.getElementsByName('csv')(0).Click();"",10);"
.Click().click()と小文字に変更すれば動作するのではないでしょうか?

原因はおそらく・・・

正常な動作が確認できている
objIE.document.getElementsByName("csv")(0).Click
という処理は、objIEが持つdocument内で'csv'というname属性を持つエレメントを探し、その中で先頭の要素に対してクリックイベントを行っています。
すべてVBA上で実行されるコードです。

これに対し、
objIE.document.parentWindow.execScript "window.setTimeout(""document.getElementsByName('csv')(0).Click();"",10);"
でVBA側が行っているのは、objIEに対して「一定時間後に指定したコマンドを実行しなさい」と指示しているところまでです。
実際に'csv'というname属性を持つエレメントを探して、その中で先頭の要素に対してクリックイベントを行うのは、IE側(のJavaScript)になると思います。
つまり""で括られた中身document.getElementsByName('csv')(0).Click();の部分はJavaScriptの記述ということです。
JavaScriptでは関数名の大文字小文字なども厳密に区別されますので、.Click()では動作しないのだと思います。

余談

~"window.setTimeout(""document.getElementsByName('csv')(0).click();"",10);"
の代わりに
~"window.setTimeout(""alert(document.getElementsByName('csv')(0).name);"",10);"
のように記述すると、想定したエレメントが取得できていればIE上で"csv"というメッセージが表示されるようになります。
エレメントが取得できていなければメッセージは表示されませんので、問題点を絞り込むのに使えると思いますよ。

参考になれば幸いです。

投稿2017/09/15 08:58

編集2017/09/15 09:22
jawa

総合スコア3013

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

VBA-IE

2017/09/19 04:22

Jawaさん、 回答いただきましたClickを小文字に変えclickに変更したところ、見事にうまくいきました。 ダイアログが開き、無事ファイル名が流し込まれ、感激です。 javaScriptの記述とは、javaも勉強せねば。 大変ありがとうございました。
guest

0

document.getElementsByNameではなくdocument.getElementsByTagNameだと、どうなりますか?

投稿2017/09/14 06:22

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

VBA-IE

2017/09/14 07:00

ByTagNameでも同じくファイル選択ダイアログボックスは開きませんでした。
VBA-IE

2017/09/15 00:24

記述を変えてファイル選択ダイアログボックスが開くかどうか試した結果は下記です。 objIE.document.forms("form1").csv.Click
VBA-IE

2017/09/15 00:35

記述を変えてファイル選択ダイアログボックスが開くかどうか試した結果は下記です。 解決のヒントになりませんでしょうか? ①objIE.document.getElementsByName("csv")(0).Click ・・・・ 正常に開いた ②objIE.document.parentWindow.execScript "window.setTimeout(""document.getElementsByName('csv')(0).Click();"",10);" ・・・ 開かない ③objIE.document.forms("form1").csv.Click ・・・・ 正常に開いた ④objIE.document.parentWindow.execScript "window.setTimeout(""document.forms('form1').csv.Click();"",10);" ・・・・ 開かない ⑤objIE.document.getElementsByTagName("csv")(0).Click ・・・・ 実行時エラー91 ⑥objIE.document.parentWindow.execScript "window.setTimeout(""document.getElementsByTagName('csv')(0).Click();"",10);" ・・・・ 開かない
sazi

2017/09/15 00:37

web系には疎いので、テストに使えそうなサイトと項目が見つけ切れて無いんですよね。 自前で作ればいいとは思うんですが、結構時間かかりそうなので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問