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

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

ただいまの
回答率

90.52%

  • VBA

    1785questions

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

  • Access

    428questions

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

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

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 6,206

otojiro

score 17

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クリックで登録できると思います。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+2

確認結果

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 19:53

    jawaさん
    お返事遅くなり申し訳ございません。
    先ほど、ご回答いただきましたソースをもとに修正したところ、見事にACCESS環境でも動作いたしました。
    今までかなり苦労していろいろ試して駄目だってので、パスがペーストされた瞬間本当に感動いたしました。

    ベストアンサーとしたいところですが、一度ベストアンサーを別の回答者様につけさせていただき、解決済みとさせていただいた後ですので、高評価だけでお許しいただけますでしょうか(汗)。
    これで一歩前に進めます。ありがとうございました。

    キャンセル

checkベストアンサー

0

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

sendkeys "^v", False

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/24 08:00

    hatena19様
    ご回答ありがとうございます。
    sendkeys "^v", False
    は試しては見ましたが、駄目でした。

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

    キャンセル

  • 2017/01/24 11:49

    そうなると、Windows API を使って、ダイアログボックスのウィンドウハンドルを取得、ダイアログボックスをアクティブにする、キー送信する、という高度なことをすることになると思います。(自分にはそのスキルはありません。)

    UWSC はこのような処理を自動生成してくれる便利なものなので有効活用させていただいています。

    キャンセル

  • 2017/01/24 12:27

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

    キャンセル

0

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/23 21:56

    回答ありがとうございます。
    キー入力の自動化のソフトは最初に検討はしたのですが、できればACCESS VBAで完結させたかったので見送っていました。
    ただ、UWSCを最終手段として使う場合の記述がわかったので助かりました。

    現在のVBAは。

    objIE.Document.getElementsByClassName("〇〇〇")(0).Click 'WEBページ上をクリックしてダイアログが開く
    sendkeys "^v", True 'Ctrl+vのキー入力

    という順序で、ダイアログが開ききる前にsendkeysのCtrl+vが行われているのも疑って、間に1秒等ストップをかけてみたのですが駄目でした。

    回答いただいたように、waitをFalseにしてダイアログが開くクリック前に
    sendkeysを入れてみましたがペーストされませんでした。。。

    やはりsendkeysでは厳しいですかね?

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • VBA

    1785questions

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

  • Access

    428questions

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