既に開かれているInternetExplorerを取得する
'サンプル1.3.1_既に開かれているInternetExplorerを取得する Public Sub getIE() Dim ie As Object 'IEを格納する変数(オブジェクト型) Dim sh As Object '起動中のShellWindow一式を格納する変数 Dim win As Object 'ShellWindowを格納する変数 '起動中のShellWindow一式を変数winsに格納 Set sh = CreateObject("Shell.Application") 'ShellWindowから1つづつ取得して処理 For Each win In sh.windows 'タイトルバーにGoogleが含まれるかチェック If InStr(win.document.Title, "Google") > 0 Then '変数ieに取得したwinを格納 Set ie = win 'ループを抜ける Exit For End If Next 'URLを表示する MsgBox ie.LocationURL End Sub
考え方としては、起動中ウィンドウのうち、特定種類のものを取得して1つ1つ取得対象のIEかどうかをチェックしていく流れ。これもはじめのうちは「呪文」として扱ってもかまわない。Shellと呼ばれる種類のアプリケーション一式(への参照)を変数shに格納するのがこの処理。
変数shが取得できたら、その中の各ウィンドウに対して、document.Titleが検索対象と一致するかを評価すればいい。
Set sh = CreateObject("Shell.Application")なおここで取得できるShellのウィンドウは実行ユーザのものだけになるから、IEが別ユーザで実行されている場合に取得できない。その場合はウィンドウハンドルを取得してDOMオブジェクトに変換して...という、少しややこしいやり方になる。
変数shが取得できたら、その中の各ウィンドウに対して、document.Titleが検索対象と一致するかを評価すればいい。
For Each win In sh.windows If InStr(win.document.Title, "Google") > 0 Thenただしこの処理はエラーになる可能性が高い。shにはInternetExplorer以外、つまりdocument.Titleというメソッドを持たないものも含まれている。それらに対してこのような処理をすれば、実行時エラーが発生してしまう。その点を踏まえて修正したのが次のサンプルコードよ。
'サンプル1.3.2_既に開かれているInternetExplorerを取得する(エラー処理済み) Public Sub getIE2() Dim ie As Object 'IEを格納する変数(オブジェクト型) Dim sh As Object '起動中のShellWindow一式を格納する変数 Dim win As Object 'ShellWindowを格納する変数 Dim document_title As String 'ドキュメントタイトルの一時格納変数 '起動中のShellWindow一式を変数winsに格納 Set sh = CreateObject("Shell.Application") 'ShellWindowから1つずつ取得して処理 For Each win In sh.windows 'ドキュメントタイトル取得失敗を無視(処理継続) On Error Resume Next document_title = "" document_title = win.document.Title On Error GoTo 0 'タイトルバーにGoogleが含まれるかチェック If InStr(document_title, "Google") > 0 Then '変数ieに取得したwinを格納 Set ie = win 'ループを抜ける Exit For End If Next 'URLを表示する MsgBox ie.LocationURL End Sub
考え方はシンプル。エラーを無視する状況下でdocument.Titleの取得を行うようにすればいい。
あと念のため注意しておくけど、On Error GoTo 0でエラー無視のオフをすることと、評価対象変数に一旦空文字列を格納して初期化する...といった安全対策も忘れないで。
On Error Resume Next document_title = "" document_title = win.document.Title On Error GoTo 0なおIf文の評価そのものに対してOn Error Resume Nextを設定するのはダメ。エラーだったとき、文字通り無視して次の行に進んでしまうから、条件評価結果が「True」だったときと同じ動作になってしまう。
あと念のため注意しておくけど、On Error GoTo 0でエラー無視のオフをすることと、評価対象変数に一旦空文字列を格納して初期化する...といった安全対策も忘れないで。