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

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

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

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

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

4回答

21103閲覧

VBA IE制御でファイル選択ダイアログにファイルパス入力

otojiro

総合スコア35

VBA

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

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2017/01/22 01:14

ACCESSで商品データベースを持っており、通販サイトへ商品登録作業を簡略化しようとVBAで出品プログラムを作っております。

本来は通販サイトへの画像の登録はWEBブラウザでドラッグ&ドロップで登録するか、ドロップできる箇所をクリックして画像ファイル選択ダイアログが開き選択する手順です。

もっと他にも方法があるのかもしれませんが、<input type="file">の箇所へIE制御で値を直接入力ができなかったので、原始的ですが、

objIE.Document.getElementsByClassName("〇〇〇")(0).Click

でクリックし、ファイル選択ダイアログボックスが開くところまでは完成しました。

ACCESS の商品テーブル上にローカルの画像ファイルのフルパスをテキストデータとして持たせているので、VBAでクリップボードにコピーし、ファイル選択ダイアログボックスが開いたときに

sendkeys "^v",true 'Ctrl+vのキー入力

でコピペできないかなと考えていたのですが、うまくいきません。

流れとしてまとめますと、ACCESSの商品フォーム上から、コマンドボタンクリック時にVBAで
1:テーブル上の画像ファイルのフルパスをクリップボードにコピー
2:VBAからIEで商品登録ページを開く
3:画像選択ダイアログボックスを開くために、所定の箇所をクリック
4:開いたダイアログボックスにSendkeys でCtrl+v
5:ダイアログボックスの開くボタンクリックで閉じる
6:IEに戻り引き続きVBA処理で商品登録

以上が今回ACCESS VBAから行いたい作業です。

1、2、3までは問題なく動作しており、4のCtrl+vの部分がダイアログボックスではなくIEのブラウザ上で動作してしまっています。画面上ではダイアログボックスは最前面に表示されているのですが。。。
ダイアログボックスのファイル名を入力するテキストボックスには何も入力されてない状態でVBAは終了している状態です。
この状態でキーボードから直接Ctrl+vを押すと問題なくファイルパスは入力されますので、クリップボードにもデータはわたっております。

5:の開くクリックは、Ctrl+vの後にEnterクリックで登録できると思います。

宜しくお願いいたします。

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

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

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

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

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

guest

回答4

0

確認結果

VBAからのIE制御ということで、Access環境が用意できなかったのでExcel環境で確認してみました。

objIE.document.getElementsByClassName("〇〇〇")(0).Clickでクリックした後、sendkeys "^v",trueを実行されているとのことでしたので、同様の記述をExcelVBAで作成し、参照ボタンのある適当なWebページを開いて確認しました。
1行ずつデバッグ実行してみましたが、こちらで確認する限りClick処理実行後は開かれた参照ダイアログを閉じるまでVBA側に制御が返ってきませんでした。
参照ダイアログを閉じるとVBA側に制御が戻り、Sendkeysコマンドを実行する動きとなりました。
※「Ctrl+Tab」が親ページ上で実行されたというのもこのためではないでしょうか?

対応

上記の現象を調べてみたところ、下記のサイトに関連しそうな情報ありました。
⇒参考

この情報を参考に、

objIE.document.parentWindow.execScript "window.setTimeout(""document.getElementsByTagName('input')(0).click();"",10);" '1秒待機 Sleep (1000) SendKeys "^v", True

としたところ、参照ダイアログにクリップボードの内容が貼り付けられました。

コード内にSleep命令がありますが、これはボタンクリック直後にSendkeysしてもまだ参照ダイアログが開かれていないための対応です。
利用するには標準モジュールでAPI宣言が必要です。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

環境が異なるため動作の違いがあるかもしれませんが、参考になれば幸いです。

投稿2017/01/25 05:02

jawa

総合スコア3013

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

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

otojiro

2017/01/25 10:53

jawaさん お返事遅くなり申し訳ございません。 先ほど、ご回答いただきましたソースをもとに修正したところ、見事にACCESS環境でも動作いたしました。 今までかなり苦労していろいろ試して駄目だってので、パスがペーストされた瞬間本当に感動いたしました。 ベストアンサーとしたいところですが、一度ベストアンサーを別の回答者様につけさせていただき、解決済みとさせていただいた後ですので、高評価だけでお許しいただけますでしょうか(汗)。 これで一歩前に進めます。ありがとうございました。
guest

0

今回、VBAで質問内容の処理を試みましたが、うまく解決できませんでしたので、sendkeysでCtrl+Vの処理のところのみ、手動でキーボード入力でCtrl+vで処理することとしました。
ご回答いただきましてありがとうございました。

投稿2017/01/25 02:44

otojiro

総合スコア35

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

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

0

ベストアンサー

第2引数をFalseにしてみてもだめですか。

sendkeys "^v", False

投稿2017/01/23 18:23

hatena19

総合スコア33715

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

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

otojiro

2017/01/23 23:00

hatena19様 ご回答ありがとうございます。 sendkeys "^v", False は試しては見ましたが、駄目でした。 原因を探るために、sendkeysでTabをキー入力してみたところ、アップロードダイアログボックスの裏で、ダイアログを開いた元のWEBページ上でTAB移動しておりましたので、VBA上ではWEBエージがアクティブになっているのかなと推測しておりますが、ダイアログボックスがアクティブにできなくてこちらも対処できておりません。
hatena19

2017/01/24 02:49

そうなると、Windows API を使って、ダイアログボックスのウィンドウハンドルを取得、ダイアログボックスをアクティブにする、キー送信する、という高度なことをすることになると思います。(自分にはそのスキルはありません。) UWSC はこのような処理を自動生成してくれる便利なものなので有効活用させていただいています。
otojiro

2017/01/24 03:27

ご回答ありがとうございます。 私もいろいろネットで情報を探しているのですが、WindowsAPIでの処理でダイアログボックスをアクティブにする必要がありそうですね。ちょっと今回はこの処理のみ手動でCtrl+Vでしのぎます。 UWSCの情報大変参考になりました。 ありがとうございました。
guest

0

sendkeys はダイアログを開く前に、Wait引数をFalseで開く必用がありますが、してますか。

vb

1sendkeys "^v", False 'Ctrl+vのキー入力 2objIE.Document.getElementsByClassName("〇〇〇")(0).Click 3

自分も同じようなことをしたことがありますが、
sendkeys を使う方法は、不安定でタイミングによってうまくいく場合といかない場合があるようです。

そこで、ダイアログにファイル名を送る処理は UWSC を使って実行するようにしたら安定するようになりました。

vba

1 Shell "C:\UWSC\UWSC.exe C:\UWSC\FileDlg.UWS", vbMinimizedNoFocus 2 objIE.Document.getElementsByClassName("〇〇〇")(0).Click

FileDlg.UWS は、ダイアログにファイル名を入力する処理を、UWSC で自動記録して生成されたスクリプトファイルです。

投稿2017/01/23 02:32

hatena19

総合スコア33715

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

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

otojiro

2017/01/23 12:56

回答ありがとうございます。 キー入力の自動化のソフトは最初に検討はしたのですが、できればACCESS VBAで完結させたかったので見送っていました。 ただ、UWSCを最終手段として使う場合の記述がわかったので助かりました。 現在のVBAは。 objIE.Document.getElementsByClassName("〇〇〇")(0).Click 'WEBページ上をクリックしてダイアログが開く sendkeys "^v", True 'Ctrl+vのキー入力 という順序で、ダイアログが開ききる前にsendkeysのCtrl+vが行われているのも疑って、間に1秒等ストップをかけてみたのですが駄目でした。 回答いただいたように、waitをFalseにしてダイアログが開くクリック前に sendkeysを入れてみましたがペーストされませんでした。。。 やはりsendkeysでは厳しいですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問