非表示にできる< 目次 >
はじめに
EXCEL VBAでIE (Internet Exploer) を制御する方法について触れようと思います。
本ブログ記事は、Crowd Works で納品まで行い、実際にお金になったコードを元に紹介します。
本記事でできること
EXCEL-VBAにおけるDOM(Document Object Model)でのブラウザ制御内で発生する、
“アップロードするファイルの選択”のシステムダイアログウィンドウを制御することができます。
尚、違う手法で同内容の制御を行っている記事もあるため、本記事で制御ができなかった場合の参考になれば幸いです。
【解説付】EXCEL-VBAで”アップロードするファイルの選択”を制御する方法(方法①)
アップロードするファイルの選択とは?
(【解説付】EXCEL-VBAで”アップロードするファイルの選択”を制御する方法(方法①) と同様のことを記載してますので、既に読了されているかたは読み飛ばしてOKです。)
VBAでWebブラウザ制御の自動化プログラムを作成するにおいて、
たまにWeb制御ではなく、システム制御をしないといけない場合があります。
例えば このようなウィンドウです。
Webブラウザだけの制御しか知らなかった当時の僕は、
この『アップロードするファイルの選択』をWebブラウザと思い込んでました。
Google検索などでたくさん探したのですが 全くの見当違いの調べ方だったことから途方にくれる結果に。。。
(プログラム初学者にとってGoogle検索やプログラム書籍などで直感的に調べることができないのがプログラムスキル取得のおいてのハードルを上げる要因だと思います。)
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
'Sleep機能を使うAPI Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 'システムダイアログのウィンドウを特定するために使うAPI Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _ ByVal hWndParent As Long, _ ByVal hwndChildAfter As Long, _ ByVal lpszClass As String, _ ByVal lpszWindow As String) As Long 'ダイアログウィンドウに メッセージを送信するAPI Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" _ (ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Any) As Long Sub ファイルをアップロードする_2つ目の方法() '〜変数格納〜 Dim IEAP As Object '制御しているIEブラウザ と仮定 Dim tagInput As Object 'ボタン押下する時に使う Dim fileURL As String '変数内にアップロードしたいファイルのディレクトリ情報を格納するために利用する 〜省略〜 'どこかしらのタイミングでアップロードしたいファイルのディレクトリをfileURL変数に格納する fileURL = "〇〇〇" 'C:¥Users¥ みたいなパソコン内でのファイルの住所(ディレクトリ)を入れてあげる。 〜省略〜 Set tagInput = IEAP.document.getElementsByTagName("input") 'inputタグ i = 0 For i = 0 To tagInput.Length - 1 If tagInput(i).Name = "uploadedFile" Then '処理完了メール送信 '↑でtagInput(i).Name = "uploadedFile"で”正”となったボタンにフォーカスする。 tagInput(i).Focus '↑でフォーカスされたボタンに対し、キーボードのスペースを押す SendKeys (" ") Do DoEvents 'DoLoop無限ループのフリーズ対策用。これによりESPボタンでVBAから離脱できようになる。 Sleep 200 ’PCの処理負担を軽減させるために、連続したDo〜Loopを回避する hWindow = FindWindow("#32770", "アップロードするファイルの選択") 'FindWindowで ”アップロードするファイルの選択”が見つかるまでLoopさせる。 Loop Until hWindow = 0 'FindWindowの戻り値は 正数(1以上)になるため、Do Loopを抜ける条件として ”0でない場合”とすればOK。 SendKeys fileURL '変数fileURLに入れたディレクトリ情報(文字列)をSendKeysする Sleep 500 ’気持ちでSleep入れてるだけです。 SendKeys ("{ENTER}") 'PCのキーボードのEniterキーを押す意味 Exit For End If Next Do While IEAP.readyState <> 4 Or IEAP.Busy = True DoEvents Loop STime = Now Do While DateAdd("S", 1, STime) > Now DoEvents Loop end Sub |
コードの説明
↑のコード内のコメントに説明を記載しておりますので、そちらを参照ください。(将来的には体系的にわかりやすく説明できる記事を作成するつもりです)
オススメ書籍(もっとIEブラウザ連携知りたい人向け)
EXCEL VBAにおけるIEブラウザ連携でオススメする書籍をご紹介します。
コーディングにおいて かなり効率が良くなります。
今回紹介したソースコードの直接的な説明はありませんが、
ヒントになる情報は十分に有り コードを完成するまでに至りました。
インターネットだけでは分かり得ない体系的な情報も合ったりなど、
ハッキリいってコスパが良いで代物だと思っています。
DOM(Document Object Model)の書籍は数が少ないというものありますが、
良書であることは間違いないため、
DOMで効率化を図りたい人ならば1冊は持っておいて損はしないと思います。
また、IEブラウザ連携は 専門用語が多くわかりにくい分野でもありますので、
もし コーディング効率をあげつつ、専門用語についても学びたいのであれば、
この1冊で一石二鳥ですのでオススメします。
終わりに
いかがでしたでしょうか。
今後もVBA↔IEブラウザ制御については需要があると思いますので、投稿していこうと思います。
また、プログラムの難しさは、独学するにおいて 自分のやりたいことが専門用語で書かれているケースが多く、直感的に調べることができないことだと思っています。
ゆくゆくは『1から始めるVBA ↔IEブラウザ 連携 講座』もシリーズものとして、なるべくわかりやすい内容のもので投稿しようと考えますので、よろしくお願いいたします。
少しでも読者の方の役に立てれば良いなと考えておりますので、 重ね重ねになってしまいますが、今後とも本ブログをどうぞよろしくお願いいたします。
ちょっとだけ宣伝
プログラミング学習(全般)における間違えない学習方法を理由を含めて説明した記事がございます。
当然 無料ですので、学習方法において不安に感じている方がいらっしゃれば 是非ご覧くださいませ。
参考記事
続きを見る 続きを見る 続きを見る
【解説付】EXCEL-VBAで"アップロードするファイルの選択"を制御する方法(方法①)
【解説付】EXCEL-VBAでWebページからのメッセージのOKを押す方法
【解説付】EXCEL-VBA 既にタスクバーにあるIEブラウザをobject変数に格納する