7.1 IEオブジェクトを作る(IE7編)
 インターネットエクスプローラ7(Internet Explorer 7)はタブブラウズ機能が使えたりなど、とても便利ですが、迷惑なことに従来のCreateObject("InternetExplorer.Application")を使った方法では、IEオブジェクトがまともに作れなくなってしまいました。一瞬、オワタ\(^o^)/と諦めてしまいがちですが、別な方法を使えばちゃんとIEオブジェクトを作れますし、ほぼ従来通りのオートメーションも可能ですのでご安心を(笑)

 なお、7.2 IE画面を表示・非表示にする7.10 フォームの操作3のサンプルスクリプトは、Internet Explorer 6を前提としたスクリプトとなっています。Internet Explorer 7をお使いの場合は、「IEオブジェクトの作成の部分をInternet Explorer 7用に置き換える」「ページを表示するときはNavigate2メソッドを使う」の2点を踏まえた上で参考にしてください。また、Internet Explorer 7用のIEオブジェクト作成事例は2種類用意しました。オススメは特にありませんので、目的にあったケースを参考にしてください。
Internet Explorer 7でのIEオブジェクト作成方法・その1
 Internet Explorer 7では、CreateObject("InternetExplorer.Application")を実行するとIEオブジェクトが作成される(新しいIEのウィンドウが表示される)ところまでは同じです。しかし、その後Navigate2メソッドを実行すると次のような動作をします。

1.既存のInternet Explorer 7ウィンドウがあるとき
 既存のウィンドウの中に新しいタブが作成され、そこへ指定したページが表示される。
 CreateObjectで作成したオブジェクト(IEのウィンドウ)は変化せず。

2.既存のInternet Explorer 7ウィンドウがないとき
 新しいウィンドウが開き、そこへ指定したページが表示される。
 1と同様に、CreateObjectで作成したオブジェクト(IEのウィンドウ)は変化せず。

 このように、Internet Explorer 7 では、CreateObjectで作成したオブジェクト(IEのウィンドウ)は変化せず、代わりにShell.ApplicationWindowsコレクションの最終の要素に新しいIEオブジェクトが作成されます。そこで、Windowsコレクションから新しく開いたページのオブジェクトを取得し、これまで(IE6)のようなIEオブジェクトを作成します。なお、IEオブジェクトを作成した以降は、これまでと同様の方法でインターネットエクスプローラの操作が行えます。

 この事例は、常に新しいウィンドウ(タブ)で開きたいケースに最適です。

Option Explicit

Dim objIE
Dim objShell

'Shell.Applicationオブジェクトの作成
Set objShell = CreateObject("Shell.Application")

'IEオブジェクトの作成(ダミー)
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Visible = True 'IEウィンドウを表示
objIE.Navigate2 "http://www.google.co.jp/" '既存or新しいウィンドウで表示される
objIE.Quit 'ここで閉じるのはCreateObjectで作成したウィンドウ
Set objIE = Nothing 'いったんオブジェクトをクリア

'Shell.ApplicationオブジェクトのWindowオブジェクトからIEオブジェクトを取り出す
'作成されているポイントは、Windowsコレクションの最後の要素
'これ以降は、従来と同様の方法で操作が可能
Set objIE = objShell.Windows.Item(objShell.Windows.Count - 1)

MsgBox "ダイアログを閉じた後、5秒後にIE(タブ)を閉じます。"
WScript.Sleep 5000

'表示しているページの情報を表示
WScript.Echo objIE.LocationURL
WScript.Echo objIE.LocationName

objIE.Quit

Set objIE = Nothing
Set objShell = Nothing

 なお、Shell.ApplicationオブジェクトのWindows.Countプロパティは、IEなどのウィンドウの個数が設定されているプロパティです。ただし、Windowsコレクションは先頭の要素が0であるため、Windows.Countプロパティから1を引いた値が最終の要素になります。
Internet Explorer 7でのIEオブジェクト作成方法・その2
 今度は、CreateObject("InternetExplorer.Application")を使わない方法です。この事例では、Shell.ApplicationWindowsプロパティを使ってIEオブジェクトの作成を行います。既存のInternet Explorer(タブ)内のタブを操作したいときは、こちらの方がやりやすいかもしれません。

 この事例では、最初にShell.ApplicationWindowsプロパティ内に保存されているIEオブジェクトをカウントします。IEオブジェクトが無い(0個)のときは、Internet Explorerを起動していない状態です。しかし、(Shell.Applicationオブジェクトの)Windows.Item.Navigate2を実行すると、新しいインターネットエクスプローラが開き、指定したページが表示されます。

 また、既存のウィンドウがある(カウントした結果が1以上)のときは、最終要素を使ってページを開く操作を行います。このとき、第2引数に指定した内容によって、その後のタブの状態が変わります。

1.navOpenInNewTab(&H800)
 新しいタブで開き、さらに新しいタブが最前面に表示される。
2.navOpenInBackgroundTab(&H1000)
 新しいタブで開くが、新しいタブは背面(非アクティブ)で開く。
3.第2引数を省略
 既存のタブで開く。

 なお、IEオブジェクトを取り出す直前に行っているループ処理は、最終要素(=新しいタブ)がIEオブジェクトに変化するまで待機する処理です。Navigate2メソッドを実行してから(Windowsコレクションの最終要素が)IEオブジェクトに変化するまでに若干のタイムラグが発生する場合があるため行っています。

Option Explicit

Const navOpenInNewTab = &H800
Const navOpenInBackgroundTab = &H1000

Dim objIE
Dim objShell
Dim objWindow
Dim lngCount

'Shell.Applicationオブジェクトの作成
Set objShell = CreateObject("Shell.Application")

'IEウィンドウの個数をカウント
lngCount = 0
For Each objWindow In objShell.Windows
    lngCount = lngCount + 1
Next

With objShell.Windows

     'IEオブジェクトがないときは、新しく作成する
     If lngCount = 0 Then
        .Item.Navigate2 "http://www.google.co.jp/"
        lngCount = lngCount + 1

     'IEオブジェクトがあるときは、タブを操作する(新しいタブを作成)
     Else
        .Item(lngCount - 1).Navigate2 "http://www.google.co.jp/", navOpenInNewTab
        '第2引数を省略したときは、lngCountを減算してください
        'lngCount = lngCount - 1
     End If

     'オブジェクトが確定するまでの空ループ
     Do Until Not .Item(lngCount) Is Nothing
        WScript.Sleep 100
     Loop

     'IEオブジェクトを取得
     Set objIE = .Item(lngCount)

End With

MsgBox "ダイアログを閉じた後、5秒後にIE(タブ)を閉じます。"
WScript.Sleep 5000

'表示しているページの情報を表示
WScript.Echo objIE.LocationURL
WScript.Echo objIE.LocationName

objIE.Quit

Set objIE = Nothing
Set objShell = Nothing
 ※この事例では、既存のタブがある場合は、常に最後のタブを使っています。
Copyright(C) 1999-2006 結城圭介。 All rights reserved