VBAのIE(InternetExplorer)制御に便利なサブルーチンを紹介しています。
エラーや誤ってIE(InternetExplorer)を削除した場合など制御できていないIEを見つけて制御する方法について解説しています。本来であれば、エラーがでないようなプログラムにすることが大前提なのですが、対象サイトのHTML構文に間違いや、規則性に沿って処理していたもののイレギュラーなページでエラーが起こることはよくありますので、こちらを利用するととても便利です。
サブルーチンとは、プログラム処理の中で繰り返し利用されるルーチン作業をモジュール化(部品化)してまとめたものになります。また、呼び出す側をメインルーチンと呼ぶのに対して「サブルーチン」と呼ばれます。
繰り返し利用されるルーチン作業をモジュール化(部品化)することで、同じ処理のプログラムを何度も書く手間が省け、プログラムも全体的に見やすくなります。これによりプログラムソースの可読性や保守性を高く保つことができます。
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
こちらの構文と引数の内容は以下になります。尚、引数はすべて参照渡しで渡されます。
構文 | 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サブルーチン(ユーザー定義関数)を終了させます。