VBAのIE(InternetExplorer)制御からエクセルVBAからIEでJavaScriptを実行する方法について解説しています。
<< エクセルVBAでIEウィンドウの各種バーを表示・非表示にする :前の記事
前回は、IEウィンドウの各種バーを表示・非表示にする方法について解説しました。表示・非表示の設定自体は難しくありませんが、InternetExplorerオブジェクトのToolBarプロパティを利用する場合は、注意する必要があります。今回は、エクセルVBAからIE(InternetExplorer)でJavaScriptを実行する方法について解説します。
以前、「IE(InternetExplorer)を起動した後に別のURLを表示する」でNavigateメソッドの利用方法について解説しましたが、NavigateメソッドではJavaScriptを実行することもできます。
JavaScriptは実行処理に利用されることが多く、通常のHTML操作だけでは補えない部分となります。JavaScript処理を理解できれば応用力が身につきますので、是非マスターしましょう。
以下が今回の処理の流れになります。
今回利用するサブルーチン・メソッド・Windows API関数は以下になります。
ieViewサブルーチンは指定したURLをInternetExplorerで起動させ、Webページが完全に読み込まれるまで待機処理をするマクロです。
ieCheckサブルーチンは指定したInternetExplorerオブジェクトのWebページが完全に読み込まれるまで待機処理をするマクロです。
InternetExplorerオブジェクトのNavigateメソッドは指定したURLをIE(InternetExplorer)で表示させます。5つの引数が用意されていますが、こちらでは必須項目であるURLだけを利用していきます。
objIE.Navigate ("IEに表示させるWebページのURL")
API(Application Programming Interface)は、アプリケーションからOSやプログラム言語を操作するためのライブラリです。このAPIを利用することでファイル制御やウインドウ制御などを行うことが出来ます。また、Windows APIはMicrosoft WindowsのAPIのことで、Windowsのバージョン毎に拡張されており16ビットは「Win16 API」32ビットは「Win32 API」と呼ばれます。
Windows APIのSleep関数は、指定した時間(ミリ秒間)だけ処理を中断するAPI関数です。
Sleep "実行を中断する時間(ミリ秒)"
こちらのVBAコードは、「テスト用フォームページ」を利用してNavigateメソッドにJavascriptを設定し実行するマクロです。
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If
Sub sample()
Dim objIE As InternetExplorer
'テストページをIE(InternetExplorer)で起動
Call ieView(objIE, "http://www.vba-ie.net/code/test.html")
'JavaScript実行①
objIE.navigate "JavaScript:alert('送信ボタンが押されました')"
Sleep 10000
'JavaScript実行②
objIE.Document.Script.setTimeout "javascript:alert('送信ボタンが押されました')",1000
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
※必要な項目のみ抽出しています。
ポップアップ画面が2回表示されます。こちらではボタンのクリック処理は行わずJavaScriptを直接実行させています。
#If VBA7 Then
Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr)
#Else
Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long)
#End If
※ドラッグ(スワイプ)すると全体を確認できます。
まず、処理を停止するWindows APIのSleep関数を使用できるようにAPIの宣言をします。宣言する場合は、宣言セクション内に記述します。通常のAPI宣言であれば1行記述するだけで済むのですが、こちらでは条件分岐ができるIf~Then~Elseステートメントを利用して、宣言内容を設定しています。
これは、office2010で64bit(ビット)版を利用している場合、API宣言の記述方法が異なるためです。使用するPC環境に合わせた記述方法でも問題ありませんが、汎用性を持たせるために条件分岐させています。こちらの問題については「32ビット版のOffice2010プログラムでVBAマクロを編集すると・・・」に詳しく解説されていますので、一度確認してください。
ちなみに宣言ステートメントは、最初のプロシージャ宣言の前に配置する必要がありますので、一番上に記述してください。
Sub sample()
Dim objIE As InternetExplorer
※ドラッグ(スワイプ)すると全体を確認できます。
こちらはSubステートメントに引数の設定がないsampleプロシージャになります。 まずは、変数宣言でメモリ領域を割り当てるDimステートメントを利用してオブジェクト変数objIEに「InternetExplorer型」を変数宣言しています。
'テストページをIE(InternetExplorer)で起動
Call ieView(objIE, "http://www.vba-ie.net/code/test.html")
※ドラッグ(スワイプ)すると全体を確認できます。
次に他のプロシージャを呼び出すCallステートメントを利用してieViewサブルーチンを呼び出しています。それぞれの第一引数にはオブジェクト変数の「objIE」を第二引数には表示させるURLの「http://www.vba-ie.net/code/test.html」を設定しています。これによりInternetExplorerでテスト用フォームページが表示されます。
'JavaScript実行①
objIE.navigate "JavaScript:alert('送信ボタンが押されました')"
※ドラッグ(スワイプ)すると全体を確認できます。
Navigateメソッドを利用する場合は、「JavaScript:"Javascriptプログラム"」で実行することができます。こちらはウィンドウに警告ダイアログを表示させるJavaScriptのalertメソッドを利用して「送信ボタンが押されました」を表示させています。
Sleep 10000
※ドラッグ(スワイプ)すると全体を確認できます。
これまでIEにWebページを表示させる場合は、Webページが完全に読み込まれるまで待機する処理を入れていました。しかし、JavaScriptを実行する場合、同じ処理を加えても待機してくれません。
エクセルVBAではJavaScriptで処理したものを制御できませんので、明示的にWIndwos APIのSleep関数を利用して処理を10秒間停止させています。
10秒後に次の処理を実行しますので、それまでJavaScriptで表示されたダイアログボックスの「OK」をクリックしてください。
'JavaScript実行②
objIE.Document.Script.setTimeout "javascript:alert('送信ボタンが押されました')",1000
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
こちらはScriptオブジェクトを利用した別のJavaScriptを実行させる処理です。setTimeout関数はJavaScriptのタイマーメソッドで今回の例で言えば、1秒後に「送信ボタンが押されました」のポップアップ画面を表示する処理となります。
どちらを利用しても同じ結果になりますので、お好きなほうをご利用ください。私は前者の方を基本利用しています。
「objIE.Document.Script.setTimeout "javascript:alert('送信ボタンが押されました')",1000」について、現在実行時エラーで「実行時エラー '-2147024891 (80070005)':アクセスが拒否されました。」と表示されます。
おそらくIE(InternetExplorer)のセキュリティ更新プログラムの影響と考えられます。JavaScript以外にもフレーム処理でも同じようなエラーが表示されていますが、こちらについてはnavigateメソッドを利用してJavaScriptを実行するようにしましょう。
JavaScriptで制御しているサイトも数多く存在しますので、こちらもサブルーチン化させていきます。
Sub ieJS(objIE As InternetExplorer, jsCode As String)
objIE.navigate "JavaScript:" & jsCode
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
こちらはSubステートメントに引数を2つ設定しているieForegroundサブルーチンになります。こちらの構文と引数の内容は以下になります。尚、引数はすべて参照渡しで渡されます。
構文 | ieJS(objIE,jsCode) | ||||
---|---|---|---|---|---|
引数名 | データ型 | 内容 | 値の事例 | 初期値 | 省略 |
objIE | InternetExplorer | IEオブジェクト | objIE,objIE2 | × | |
jsCode | String | JavaScriptコード文字列 | "alert('送信ボタンが押されました')" | × |
「objIE」「jsCode」は必須項目です。「objIE」にはIEオブジェクトを設定します。複数のIEオブジェクトを操作する場合には「objIE」「objIE2」といった複数のIEオブジェクトを指定してください。オブジェクト作成により、プロパティやメソッドの利用が可能となりIE(InternetExplorer)を制御することがでます。
「jsCode」は実行させるJavaScriptコードの文字列を入力します。
こちらは引数に設定したInternetExplorerオブジェクトのnavigateメソッドに引数に設定したJavaScriptのコードを実行します。それでは、ieJSサブルーチンを利用して見ていきましょう。
Sub sample()
Dim objIE As InternetExplorer
'本サイトをIE(InternetExplorer)で起動
Call ieView(objIE, "http://www.vba-ie.net/")
'JavaScriptを実行
Call ieJS(objIE, "alert('送信ボタンが押されました')")
End Sub
※ドラッグ(スワイプ)すると全体を確認できます。
まず、変数objIEに「InternetExplorer型」を宣言しています。次にCallステートメントを利用してieViewサブルーチンを呼び出し、本サイトをIE(InternetExplorer)で表示させます。そして、「ieJS」の引数にInternetExplorerオブジェクトとJavaScriptコードを格納しJavaScriptを実行します。
今回は、IE(InternetExplorer)でJavaScriptを実行する方法について解説しました。JavaCsriptの実行がメインでしたので単純にメッセージボックスを表示させただけですが、フォーム送信ボタンなどにJavascriptが利用されることが多いです。
単純に送信ボタンをクリックするだけでは処理ができない場合もありますので、その際はこちらを利用するようにしましょう。次回は、JavaScriptを利用してIEウィンドウを自動でスクロールする方法について解説します。
次の記事: エクセルVBAでJavaScriptを利用したIEウィンドウを自動スクロールする >>
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。
VBAのIE制御についてのQ&A掲示板↑VBAのIE操作で分からない事があればこちらの掲示板よりご質問ください。
ExcelのVBA初心者入門↑こちらはVBAをマスターできるよう初心者向けのエクセルVBA入門コンテンツになります。
こちらでは、これまでに紹介したIE(InternetExplorer)操作で便利な機能をツール化しています。無償でダウンロードできますので、目的に合わせたご利用ください。
こちらでは、IE(InternetExplorer)オブジェクトのメソッド・プロパティをまとめています。
こちらでは、エクセルVBAのIE(InternetExplorer)操作で利用されたVBA関数をまとめています。
こちらでは、エクセルVBAのIE(InternetExplorer)操作で利用されたステートメントをまとめています。ExcelのVBAで基本的な部分になりますので、しっかり理解しましょう。
こちらでは、これまでに作成したIE(InternetExplorer)操作で役立つサブルーチンをまとめています。
全てをコピーする必要はありませんが、目的に合わせたサブルーチンをご利用ください。