起動済みのIE(InternetExplorer)を制御する
<< InternetExplorerオブジェクトのQuitメソッドでIEを閉じる :前の記事
前回は、開いているInternetExplorerを閉じる方法について解説しました。こちらは1行で完了するステートメントですので、InternetExplorerを閉じる場合は、直接InternetExplorerオブジェクトのQuitメソッドを利用するようにしましょう。
ここまででIE(InternetExplorer)を「開く・閉じる」の処理はマスターしたかと思います。ここまでの単純な処理であれば特に問題はありませんが、サイトのデータをループ処理で抽出したいなど複雑な処理になればエラーが起こることもよくあります。その際に誤って処理を終了させたりIE(InternetExplorer)を閉じてしまうと、それまでの処理が無駄になることもあります。
どう対応するかについては処理の内容にもよりますが、最初からやり直す方もいれば途中から処理ができるようにプログラムを書き換える方もいるかと思います。もちろんどちらで処理をするのが正解とういわけではなく、効率の良い方を選択するのが良いかと思います。
今回こちらで解説するのはそのような場合の対策の1つとして、エクセルVBAからIE制御ができないIE(InternetExplorer)を制御できるようにする方法について解説していきます。
目次
- 手動でIE(InternetExplorer)を閉じた場合のエラー確認
- エラー確認サンプルコードの実行結果
- 起動済みのIE(InternetExplorer)を制御する処理の流れ
- 利用するサブルーチン・VBA関数について
- 起動済みのIE(InternetExplorer)を制御するサンプルコード
- 起動済みのIE(InternetExplorer)を制御するサブルーチン「ieFind」の解説
- 「ieFind」を利用して起動済みのIE(InternetExplorer)を制御するサンプルコード
- まとめ
手動でIE(InternetExplorer)を閉じた場合のエラー確認
まずは途中で誤ってIE(InternetExplorer)を閉じた場合、どのようなエラーが表示されるのかを確認します。下記は、わざとエラーを表示させるマクロになります。
処理の内容は最初にIE(InternetExplorer)が自動で起動します。次にメッセージボックスが表示されますので、その間に自動で起動したIEを閉じてから再度手動でIEを起動させてください。手動で起動できたら、メッセージボックスの「OK」をクリックします。するとエラーが発生しますので、そちらを確認してください。
Sub sample()
Dim objIE As InternetExplorer
'本サイトをIE(InternetExplorer)で起動
Call ieView(objIE, "http://www.vba-ie.net/")
MsgBox "自動で起動したIEを閉じてから再度手動でIEを起動させてください。"
'指定したURLをIE(InternetExplorer)に表示
Call ieNavi(objIE, "http://www.vba-ie.net/ie/position-size.html")
End Sub
エラー確認サンプルコードの実行結果
エラーの確認はできたでしょうか?一度閉じてしまったIE(InternetExplorer)を再度エクセルVBAで制御しようと思ったらこれまでの解説した内容では解決することができません。制御できていないIEを制御するためにはSetステートメントでオブジェクトをセットする必要がありますので、この方法について解説していきます。
起動済みのIE(InternetExplorer)を制御する処理の流れ
以下が今回の処理の流れになります。
- ①変数宣言
- ②ieViewサブルーチンを利用して本サイトをIEで起動
- ③メッセージボックス「自動で起動したIEを閉じてから再度手動でIEを起動させてください。」を表示
- ④手動でIEを削除
- ⑤手動でIEを起動
- ⑥メッセージボックスの「OK」を押下
- ⑦Shellオブジェクトを生成
※Shellオブジェクトのメソッド・プロパティを利用できる状態にします。 - ⑧現在開いている実行可能なプログラムを取得しその数だけループ処理
- ⑨プログラムの名前に「Internet Explorer」が含まれている場合にIEオブジェクトをセット
- ⑩手動で開いたIEを制御して本サイトのトップページを開く
利用するサブルーチン・VBA関数について
- ieViewサブルーチン
- ieCheckサブルーチン
- ieNaviサブルーチン
- CreateObject関数
ieViewサブルーチンとは
ieViewサブルーチンは指定したURLをInternetExplorerで起動させ、Webページが完全に読み込まれるまで待機処理をするマクロです。
ieCheckサブルーチンとは
ieCheckサブルーチンは指定したInternetExplorerオブジェクトのWebページが完全に読み込まれるまで待機処理をするマクロです。
ieNaviサブルーチンとは
ieNaviサブルーチンは制御中のInternetExplorer指定したURLのWebページを表示させるマクロです。
CreateObject関数とは
CreateObject関数はオートメーション機能を利用して一時的なオブジェクトを作成する関数です。この関数を利用すると、外部アプリケーションをオブジェクトとして操作することが可能となります。
Set オブジェクト変数名 = CreateObject("アプリケーション名・オブジェクトの種類")
起動済みのIE(InternetExplorer)を制御するサンプルコード
起動済みのIE(InternetExplorer)を制御して本サイトのトップページを表示させるマクロです。
Sub sample()
Dim objIE As InternetExplorer
Dim objShell As Object, objWin As Object
'Shellオブジェクトを作成する
Set objShell = CreateObject("Shell.Application")
For Each objWin In objShell.Windows
If objWin.name = "Internet Explorer" Then
'InternetExplorerオブジェクトをセット
Set objIE = objWin
Exit For
End If
Next
'本サイトをIE(InternetExplorer)で表示する
Call ieNavi(objIE, "http://www.vba-ie.net/")
End Sub
実行結果
制御できていなかったIE(InternetExplorer)を制御し 「VBAのIE制御」サイトのトップページを表示します。
解説
Sub sample()
Dim objIE As InternetExplorer
Dim objShell As Object, objWin As Object
こちらはSubステートメントに引数の設定がないsampleプロシージャになります。 まずは、変数宣言でメモリ領域を割り当てるDimステートメントを利用してオブジェクト変数objIEにInternetExplorer型をオブジェクト変数objShell,objWinにオブジェクト型(Object)を変数宣言しています。
'Shellオブジェクトを作成する
Set objShell = CreateObject("Shell.Application")
次にオブジェクトを参照するSetステートメントとオブジェクトを作成するCreateObject関数を利用してShellオブジェクトを作成します。Shellオブジェクトは開いているウィンドウの情報を取得するために利用します。
For Each objWin In objShell.Windows
If objWin.name = "Internet Explorer" Then
'InternetExplorerオブジェクトをセット
Set objIE = objWin
Exit For
End If
Next
こちらでは、コレクションに対し一括して同じ処理を繰り返すFor Each~Nextステートメントを利用して、現在開いているウィンドウの数だけループ処理を行っています。設定するコレクションは、ShellオブジェクトのWindowsプロパティで取得した現在開いているウィンドウ(Windowsコレクション)になります。
次にFor Each~Nextステートメント内の処理を見ると条件分岐ができるIf~Then~Elseステートメントを利用して開いているウィンドウの名前が「Internet Explorer」の場合、その対象オブジェクトをオブジェクト変数objIEにセットし、ループ処理を強制終了しています。
対象オブジェクトのNameプロパティはウィンドウの名前を取得するプロパティです。IE(InternetExplorer)の場合はウィンドウ名に「Internet Explorer」を返しますので、一致するウィンドウがあった場合はさらに次の処理へ移ります。
一致するウィンドウがあった場合は、オブジェクトを参照するSetステートメントを利用してオブジェクト変数objIEに対象オブジェクトをセットします。オブジェクトがセットできたら後のループ処理は不要ですので、Exit Forステートメントを利用してループを抜け、Nextステートメントの次のステートメントに制御を移します。
この処理によりInternetExplorerオブジェクトが取得できましたので、InternetExplorerオブジェクトを制御することができます。
'本サイトをIE(InternetExplorer)で表示する
Call ieNavi(objIE, "http://www.vba-ie.net/")
End Sub
次に他のプロシージャを呼び出すCallステートメントを利用してieViewサブルーチンを呼び出しています。第一引数には先ほど取得したオブジェクト変数の「objIE」を第二引数には表示させるURLの「http://www.vba-ie.net/」を設定しています。これにより本サイトがInternetExplorerで表示されます。
IE(InternetExplorer)が制御できたら、Endステートメントを利用してプロシージャを終了させます。
実際に処理をしてIE(InternetExplorer)が制御できたのを確認できたでしょうか。今回は1つのIE(InternetExplorer)に対して制御処理を行いましたが複数のIE(InternetExplorer)が起動している場合、こちらの方法では対応することができません。そこで複数のIE(InternetExplorer)でも対応できるよう改良を加えサブルーチン(ユーザー定義関数)を作成してみたいと思います。
起動済みのIE(InternetExplorer)を制御するサブルーチン「ieFind」の解説
こちらは、起動済みのIE(InternetExplorer)を制御するサブルーチン(ユーザー定義関数)になります。
Function ieFind(urlName As String) As InternetExplorer
Dim objShell As Object, objWin As Object
'Shellオブジェクトを作成する
Set objShell = CreateObject("Shell.Application")
For Each objWin In objShell.Windows
If objWin.name = "Internet Explorer" And _
objWin.LocationURL = urlName Then
'InternetExplorerオブジェクトを代入
Set ieFind = objWin
Exit For
End If
Next
Set objShell = Nothing
End Function
こちらでは、起動しているInternetExplorerオブジェクトを取得するために戻り値が必要になりますので、戻り値を返すFunctionプロシージャを利用しています。それでは、VBAコードを1つずつ見ていきましょう。
Function ieFind(urlName As String) As InternetExplorer
こちらはFunctionステートメントに引数が1つと戻り値にInternetExplorer型を設定しているieFindサブルーチン(ユーザー定義関数)になります。こちらの構文と引数の内容は以下になります。尚、引数はすべて参照渡しで渡されます。
構文 | ieFind(urlName) | ||||
---|---|---|---|---|---|
引数名 | データ型 | 内容 | 値の事例 | 初期値 | 省略 |
urlName | String | 制御したい対象のサイトURLの文字列を指定します。 | "http://www.vba-ie.net/" | × |
引数urlNameは必須項目で、制御したい対象のサイトURLの文字列を設定します。
Dim objShell As Object, objWin As Object
まずは、Dimステートメントを利用してオブジェクト変数objShell,objWinにオブジェクト型(Object)を変数宣言しています。
'Shellオブジェクトを作成する
Set objShell = CreateObject("Shell.Application")
次にSetステートメントとCreateObject関数を利用してShellオブジェクトを作成します。
For Each objWin In objShell.Windows
If objWin.name = "Internet Explorer" And _
objWin.LocationURL = urlName Then
'InternetExplorerオブジェクトを代入
Set ieFind = objWin
Exit For
End If
Next
こちらでは、For Each~Nextステートメントを利用して現在開いているウィンドウの数だけループ処理を行っています。設定するコレクションは、ShellオブジェクトのWindowsプロパティで取得した現在開いているウィンドウ(Windowsコレクション)になります。
さらにIf~Then~Elseステートメントを利用して「開いているウィンドウの名前がInternet Explorer」かつ「サイトのURLが引数urlNameと一致」したオブジェクトを戻り値ieFindにセットします。これにより、InternetExplorerオブジェクトを制御する環境が整いました。
サイトのURLを取得する場合は、InternetExplorerオブジェクトのLocationURLプロパティを利用して取得します。InternetExplorerオブジェクトをセットしたらExit Forステートメントを利用してループを抜けます。
Set objShell = Nothing
End Function
ループ処理を抜けたらSetステートメントを利用して、Nothingを指定することでShellオブジェクトを解除します。プロシージャレベルで宣言した変数については、そのプロシージャの実行が終了した時点で自動的に開放されるで基本不要なのですが、こちらでは記載することとしています。
最後はEndステートメントを利用してieFindサブルーチン(ユーザー定義関数)を終了させます。それでは、実際にieFindサブルーチン(ユーザー定義関数)を利用したサンプルコードを見ていきましょう。
「ieFind」を利用して起動済みのIEを制御するサンプルコード
こちらはieFindサブルーチンを利用したVBAコードになります。以下の処理を実行する前に手動で2つのIEを起動させ「http://www.vba-ie.net/ie/navigate2.html」「http://www.vba-ie.net/ie/subroutine2.html」のページを開いた状態で実行してください。
Sub sample()
Dim objIE As InternetExplorer
Dim objIE2 As InternetExplorer
'ieNaviサブルーチン解説ページを表示しているIEオブジェクトをセット
Set objIE = ieFind("http://www.vba-ie.net/ie/navigate2.html")
'ieViewサブルーチン解説ページを表示しているIEオブジェクトをセット
Set objIE2 = ieFind("http://www.vba-ie.net/ie/subroutine2.html")
'本サイトをIEで表示
Call ieNavi(objIE, "http://www.vba-ie.net/")
'yahooサイトをIEで表示
Call ieNavi(objIE2, "http://www.yahoo.co.jp/")
End Sub
本サイトとyahooサイトが表示されます。
解説
Sub sample()
Dim objIE As InternetExplorer
Dim objIE2 As InternetExplorer
まず、Dimステートメントを利用してオブジェクト変数objIE,objIEにInternetExplorer型を宣言しています。これによりInternetExplorerオブジェクトを作成した際にプロパティやメソッドを利用できるようになりました。
'ieNaviサブルーチン解説ページを表示しているIEオブジェクトをセット
Set objIE = ieFind("http://www.vba-ie.net/ie/navigate2.html")
'ieViewサブルーチン解説ページを表示しているIEオブジェクトをセット
Set objIE2 = ieFind("http://www.vba-ie.net/ie/subroutine2.html")
こちらはオブジェクト変数objIE,objIE2にそれぞれieFindサブルーチン(ユーザー定義関数)の戻り値をセットしています。戻り値はそれぞれ指定したURLのInternetExplorerオブジェクトになります。これにより起動済みの2つのIE(InternetExplorer)を操作することができます。
'本サイトをIEで表示
Call ieNavi(objIE, "http://www.vba-ie.net/")
'yahooサイトをIEで表示
Call ieNavi(objIE2, "http://www.yahoo.co.jp/")
End Sub
そしてCallステートメントを利用してieNaviサブルーチンを呼び出しています。第一引数にはオブジェクト変数の「objIE」「objIE2」を第二引数には表示させるURLの「http://www.vba-ie.net/」「http://www.yahoo.co.jp/」を設定しています。これによりそれぞれ本サイトとyahooサイトがIE(InternetExplorer)で表示されます。
まとめ
今回は、起動済みのIE(InternetExplorer)を制御する方法について解説しました。本来であれば、エラーがでないようなプログラムにすることが大前提なのですが、対象サイトのHTML構文に間違いや、規則性に沿って処理していたもののイレギュラーなページでエラーが起こることはよくあることです。
全てを考慮してプログラムを構築することは難しいので、そのような場合にこちらの処理を行うことで効率よく対処することができます。もし、そのような状況になったら焦らずこちらを再度確認の上、利用してください。
また、今回InternetExplorerオブジェクトを特定するための条件としてサイトURLでチェックを行いましたが、特定ができるものであればサイトの名前でも何でも構いません。サイトURLを選択したのは、単にコピペができるので楽に記述しやすいという点で選びました。他にも色々な方法がありますので、その1つとして覚えておきましょう。
次回はIE(InternetExplorer)ウィンドウの位置やサイズを設定する方法について解説します。
次の記事: エクセルVBAでIEウィンドウの位置やサイズを設定する >>
近田 伸矢, 植木 悠二, 上田 寛
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。