非表示にできる< 目次 >
はじめに
EXCEL VBAでIE(InternetExploer)を制御する方法について触れようと思います。
本ブログ記事は、Crowd Works において納品まで行い、実際にお金になったコードを元に紹介します。
本記事でできること
EXCEL-VBAにおけるDOM(Document Object Model)でのブラウザ制御内で発生する、
"アップロードするファイルの選択"のシステムダイアログウィンドウを制御することができます。
アップロードするファイルの選択とは?
VBAでWebブラウザ制御の自動化プログラムを作成するにおいて、
たまにWeb制御ではなく、システム制御をしないといけない場合があります。
例えば このようなウィンドウです。
Webブラウザだけの制御しか知らなかった当時の僕は、
この『アップロードするファイルの選択』をWebブラウザと思い込んでました。
Google検索などでたくさん探したのですが 全くの見当違いの調べ方だったことから途方にくれる結果に。。。
また、私が制御したかった"アップロードするファイルの選択"を出現させる
Webブラウザのボタンがやっかいで、
通常のWeb制御(clickメソッドとか)で ボタンを押下したらWebブラウザ制御が解けずにシステムダイアログを制御するVBAコードまでプログラム実行がたどり着かず ずっと止まった状態に。。。
つまりは、Webブラウザ側に制御が持っていかれて動かない場合は、
Web制御が解ける形でボタンをクリックしてシステムダイアログ制御に移行させるプログラム が必要だったわけです。
(日本語が下手ですみません)
僕自身の日本語が下手なのが問題とは思うのですが、
プログラム初学者にとって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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
'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 ファイルをアップロードする_1つ目の方法() '〜変数格納〜 Dim IEAP As Object '制御しているIEブラウザ と仮定 Dim tagInput As Object 'ボタン押下する時に使う Dim hWindow As Long 'ファイルを選択するダイアログウィンドウで利用する Dim hInputBox As Long 'ファイルを選択するダイアログウィンドウで利用する Dim hButton As Long 'ファイルを選択するダイアログウィンドウで利用する Dim fileURL As String '変数内にアップロードしたいファイルのディレクトリ情報を格納するために利用する 〜省略〜 'どこかしらのタイミングでアップロードしたいファイルのディレクトリをfileURL変数に格納する fileURL = "〇〇〇" 〜省略〜 ' ボタンを押下(ファイルを選択するダイアログウィンドウが開くボタンを押下する) Set tagInput = IEAP.document.getElementsByTagName("input") 'inputタグ i = 0 For i = 0 To tagInput.Length - 1 If tagInput(i).Name = "uploadedFile" Then ' inputタグのname属性がuploaderFileだったと今回は仮定する。 'Javascriptで対象のinputを押す。 'Javascriptで押下することで'制御をPC側に戻すことができる。(web側に制御を持っていかれてシステムダイアログを制御出来ないときに活躍する方法。) IEAP.document.Script.setTimeout "javascript:document.getElementsByTagName('input')(" i ").click()", 200 '環境依存で使いたくないが、Sleepで間をおかないと動作が不安定になるので注意 Sleep 1000 ' 実際のファイル選択画面でのウィンドウタイトルが、 ' ”アップロードするファイルの選択”でない場合があります。(ex:ファイルを開く とか)。 ' その場合は、ウィンドウタイトルを差し替えて試してみてください。 hWindow = FindWindow("#32770", "アップロードするファイルの選択") hInputBox = FindWindowEx(hWindow, 0, "ComboBoxEx32", "") hInputBox = FindWindowEx(hInputBox, 0, "ComboBox", "") hInputBox = FindWindowEx(hInputBox, 0, "Edit", "") hButton = FindWindowEx(hWindow, 0, "Button", "開く(O)") 'ファイルパス入力 Call SendMessage(hInputBox, HC, 0, fileURL) 'URL入力 'ボタン押下' Call SendMessage(hButton, H6, 1, 0) 'ボタンをアクティブにする Call SendMessage(hButton, HF5, 0, 0) 'ボタンをクリックする Exit For End If Next 'Webブラウザが読込完了まで待機 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変数に格納する