非表示にできる< 目次 >
はじめに
EXCEL VBAでIE(InternetExploer)を制御する方法について触れようと思います。
過去にも 同作業についてTIPS形式で紹介した記事がありますが、
今回は、JavaScriptを利用した別アプローチについて触れようと思います。
過去記事
本過去記事では結構シンプルに Webからのメッセージ をクリックするコードを紹介しています。 続きを見る
【解説付】EXCEL-VBAでWebページからのメッセージのOKを押す方法
本記事でできること
本記事では以下のことができます。
出来ること
①EXCEL-VBAにおけるDOM(Document Object Model)でのブラウザ制御で、
WebからのメッセージのOKボタンをクリックすることができます。
②EXCEL-VBA上でJavaScriptを利用し、上記①を実現します。
③JavaScriptのおかげでEXCEL側の制御を保ったまま、上記①を実現できます。
Webページからのメッセージとは?
Webページからのメッセージとは、システムウィンドウです。
↑こんなウィンドウです。
初めてDOM制御する際は、このウィンドウの存在で自動化の妨げになった人も多いのではないでしょうか。
こいつのやっかいなのは、実行中のVBA制御がシステムウィンドウに持っていかれることがあり、
VBA側に制御が返ってこないことから VBAが止まった状態になる、という点です。
VBA上でJavaScriptを使う優位性
VBAのClickメソッド等で システムウィンドウを出現させると、システムウィンドウに制御がもっていかれます。
イメージとしては こんな感じです。
それを回避するために、Javascriptで システムウィンドウを出現させるようにします。
こうすることで、VBAに制御が残ったまま、システムウィンドウに対してアプローチを行うことが出来ます。
(やろうと思えば、Javascriptで システムウィンドウ出現→OKで完結できそうですが)
何をいってるの?という人向けに図を用意しました。(ざっくりですが)
見てもピンとこなければ、スキップして問題有りません。
コードの紹介
コードの紹介をします。各コードの解説はインラインコメントに記載しております。
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 |
'Sleep機能を使うAPI Private Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long) 'ダイアログウィンドウを探す Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 'ダイアログウィンドウに メッセージを送信する Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long '=========================================== Sub WebからのメッセージをJavascriptで制御() Dim ojtIE As Object '←HTMLDocument。変数ojtIEでIEブラウザを制御している前提とする。 Dim i As Long '←IEブラウザ制御で使う Dim h As Long '←IEブラウザ制御で使う 〜省略〜 '★Javascriptで Webからのメッセージが出るボタンを押すコード(HTMLタグは Input、Value="受付"を想定) Set tagInput = ojtIE.document.getElementsByTagName("input") 'inputタグ i = 0 For i = 0 To tagInput.Length - 1 If tagInput(i).Value = "受付" Then 'Value値が「受付」のもの探す 'Javascriptで対象のinputを押して「Web からのメッセージ」を表示させる。 'ポイントはJavascriptでクリックするからEXCEL側の制御が外れない。 ojtIE.document.Script.setTimeout "javascript:document.getElementsByTagName('input')(" & i & ").click()", 200 '←200は0.2秒後にクリックしてねの意味 'Javascriptのsettimeoutで 0.2秒後にクリックされるから、Sleepで待っておく必要がある。 Sleep 2000 '「Webからのメッセージ」のウィンドウをキャッチする h = FindWindow("#32770", "Web ページからのメッセージ") 'OKボタンを押す PostMessage h, WM_COMMAND, 1, 0 Exit For End If Next 〜省略〜 End Sub |
コードの解説
途中のコードは省きましたが、
システムダイアログのウィンドウをWebブラウザ制御(IEブラウザ制御)で出現させるタイミングで
↑のコードを元に試してみましょう。
この際の注意点ですが、
Sub〜EndSubの本番プログラムの手前に、システム制御を行うためのプログラムを記載しておく準備が必要です。
1 2 3 4 5 6 7 8 |
'Sleep機能を使うAPI Private Declare Sub Sleep Lib "KERNEL32" (ByVal dwMilliseconds As Long) 'ダイアログウィンドウを探す Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 'ダイアログウィンドウに メッセージを送信する Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long |
Private Declare Function で
事前に宣言していたシステム制御プログラムは、Sub〜EndSub内で使用可能となります。
実際に、Webブラウザ制御で、システムダイアログが発生したら、以下のコードを記載しましょう。
(Dim の変数部分は 必要に応じて削除や変更してください)
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 |
Dim ojtIE As Object '←変数ojtIEでIEブラウザを制御している前提とする。 Dim i As Long '←IEブラウザ制御で使う Dim h As Long '←IEブラウザ制御で使う '★Javascriptで Webからのメッセージが出るボタンを押すコード(HTMLタグは Input、Value="受付"を想定) Set tagInput = ojtIE.document.getElementsByTagName("input") 'inputタグ i = 0 For i = 0 To tagInput.Length - 1 If tagInput(i).Value = "受付" Then 'Value値が「受付」のもの探す 'Javascriptで対象のinputを押して「Web からのメッセージ」を表示させる。 'ポイントはJavascriptでクリックするからEXCEL側の制御が外れない。 ojtIE.document.Script.setTimeout "javascript:document.getElementsByTagName('input')(" & i & ").click()", 200 '←200は0.2秒後にクリックしてねの意味 'Javascriptのsettimeoutで 0.2秒後にクリックされるから、Sleepで待っておく必要がある。 Sleep 2000 '「Webからのメッセージ」のウィンドウをキャッチする h = FindWindow("#32770", "Web ページからのメッセージ") 'OKボタンを押す PostMessage h, WM_COMMAND, 1, 0 Exit For End If Next |
オブジェクト変数 ojtIE で IEブラウザを制御している前提でのコードとなるため、注意してくださいね。
過去記事
オブジェクト変数にIEブラウザを格納する方法が分からない人は、こちらの過去記事を参照ください。 続きを見る
【解説付】VBA-IEブラウザを変数へ格納する方法【EXCEL】
オブジェクト変数自体を知らない人は、こちらの過去記事を参照ください。 続きを見る
【解説付】VBA-オブジェクト変数を理解する│完全理解│【EXCEL VBA】
終わりに(編集後記)
ここまでお読みいただいてありがとうございます。
VBAのDOM操作は、意外とニッチな分野ですので、記事を通じてとはなりますが、
読者の皆様と繋がることが出来て 結構ハッピーだったりします。
筆者は Twitterも行っているため、フォローしてくれると嬉しいです。(更新頻度が かなり低いですが。)
たまに、VBAとかDOMの有益な情報が…発信できたら良いな、と思ったまま、あまり活用できてませんが。
Twitterアカウントは 「nkmr_dai」となります。
↓のボタンからもフォローできます。
ちょっとだけ宣伝となりますが、
もしプログラミングの学習方法に悩みをお持ちの方がいましたら、
別記事で 学習方法を紹介していますのでご覧になってください。
今回はここまでとなります。
末筆とはなりますが、ここまでの長文を読んでいただきありがとうございました。
細々とはなりますが、引き続き ブログ更新していきますので、
引き続き NakamuraBlog(ナカログ)をよろしくお願いいたします。
でわでわ。