Excel2000のマクロ(VB6.0)から、インターネットエクスプローラーを開くことが出来る。(ここではWindowsXPで実験)
Sub IE_test()
On Error GoTo label_err
Dim IE As Object
Set IE = CreateObject("InternetExplorer.Application")
Dim s As Single, t As Single, f As Single
s = Timer
f = s
IE.Navigate "http://www.ne.jp/asahi/hishidama/home/soft/phi/stage.html"
IE.Visible = True
Dim busy As Boolean, b As Boolean
Dim stat As Long, r As Long
busy = IE.Busy
stat = IE.ReadyState
Do
b = IE.Busy
r = IE.ReadyState
s = Timer
If b <> busy Or r <> stat Then
Debug.Print s, s - t, b, r
busy = b
stat = r
t = s
End If
If stat = 4 Then GoTo label_end
If s - f > 10 Then
IE.Stop
Debug.Print "タイムアウト"
GoTo label_end
End If
DoEvents
Loop
label_err:
Debug.Print Err.Description
label_end:
Set IE = Nothing
End Sub
VBAの関数。IEのウィンドウを新しく作り、そのインスタンスを返す。
たぶん実体はWebBrowserじゃないかと思う。(「TypeName(IE)」の結果はIWebBrowser2だった)
URLを指定する。第2引数以降もオプションで何かが指定できる。
Navigateを実行した時点で、ウェブページの取り込みは始まる。
NavigateとNavigate2の違いは、第1引数であるURLの型が、NavigateはStringでNavigate2はVariantであること。
Navigate2は(シェルインテグレーションの為の)Navigateの拡張で、Windowsのシェルネームスペースというものも扱えるらしい。シェルネームスペースは ディレクトリやファイルを番号で管理するようなイメージ(?)らしく、番号で扱うから、数値も受け入れられるようにする為にVariant型になっているのかな。
いずれにしても、そんなものは知らない扱わないならNavigateで充分でしょう。
VisibleプロパティにTrueをセットすると、IEのウィンドウが表示される。
ウェブページの読み込みが完了していなければ、ページが生成されていく過程が見られるようになる。
Busyプロパティは、忙しいとき…もとい、データの取り込み中ならTrueになる。
あるページにimgタグがあって画像も取り込む場合、そのページの全画像を取り込み終わるまでFalseにならない。
スクリプト(JavaScript等)でデータを読み込む場合や、スクリプトファイル(*.js等)そのものの取り込みの最中もTrueになっていた。
location.hrefを使ったページ遷移でも、Trueが維持されていた。
ページ内にframeタグやiframeタグがあって別のHTMLを読み込む場合は、フレーム毎にフラグが切り替わる。すなわち、フレームの読込開始時にTrueになり、終了すると一旦Falseになる。次のフレームの読込開始時に再びTrueになる。
実際問題としては、Busyフラグのチェック(ExcelVBA)と実際のIEの動作は別プロセスで行われるので、IEの読み込みの方が早ければ Busyフラグのチェックをしていても「常にTrueのまま」と認識してしまう可能性はある。
自分も、フレーム付きのHTMLに帯域制限をかけて
ようやく気付いたから。
また、inputタグでボタンを作り、そのボタンの動作としてスクリプトが動くような場合(通信が伴わなくても)は、その間もTrueになる。
ReadyStateプロパティは、ドキュメントの状態を表す。
読み込みが終わって表示できる状態になると、4(complete)になる。
これはBusyと異なり、フレームであれば、全フレームが読み込み終わってから完了になる。
(BusyがTrueのときに)読込処理を終了させるのに使う。
現在表示されている内容をリロード(更新)する。
VBAの関数。OSに制御を返す。
自分は何もせず待っている間に、他のアプリケーションのイベントを処理させることが出来る。
VBAの関数。午前0時からの経過時間(秒単位だが、小数点以下も有り)を返す。
したがって、日をまたがるような処理で使う場合は注意。
ドキュメントを取得できる。
| IE.document.Title | タイトルを取得する。 |
| IE.document.body.innerHTML | HTMLを取得する。 |
既に開いているIEを探すには、以下のようにする。(この例のままだと、実行ファイル名が変わったら対応できないが)
Sub findIE()
Dim win As Object
Set win = CreateObject("Shell.Application")
'Debug.Print TypeName(win)
For Each w In win.Windows
Debug.Print TypeName(w), w.FullName, w.locationURL
If Right$(w.FullName, 12) = "iexplore.exe" Then
Debug.Print w.document.Title
End If
Next
End Sub
CreateObject("Shell.Application")で返されるのは、IShellDispatch4オブジェクト。
これのWindowsプロパティで、現在開いている(ファイルやディレクトリを扱う)エクスプローラーとインターネットエクスプローラーのウィンドウが列挙できる。これはどちらもIWebBrowser2のオブジェクトだが、使えるプロパティは共通だったり違ったりする。
あとは、下表のようなプロパティを駆使して、自分が対象としたいウィンドウを選び出せばよい。
| プロパティ | 内容 | 例 |
|---|---|---|
| Name | エクスプローラーでもIEでも同じ値 | 「Microsoft Internet Explorer」 |
| FullName | 実行ファイル(exe)のフルパス名 | 「C:\WINDOWS\Explorer.exe」「C:\Program Files\Internet Explorer\iexplore.exe」 |
| Path | 実行ファイル(exe)のディレクトリ名 | 「C:\WINDOWS\」「C:\Program Files\Internet Explorer\」 |
| locationName | ウィンドウのタイトル(キャプション)のようなもの | 「temp」「検索結果」 |
| locationURL | エクスプローラーの場合はディレクトリ、IEの場合はURL | 「file://C:/temp」「http://〜」 |
| statusText | ステータスバーに表示されている内容(に、ゴミが付いたもの(爆)) | |
| document | エクスプローラーの場合は使えない(実行時エラーになる) |