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 | エクスプローラーの場合は使えない(実行時エラーになる) |