S-JIS[2006-08-04] 変更履歴

ExcelからIEを呼び出す方法

Excel2000のマクロ(VB6.0)から、インターネットエクスプローラーを開くことが出来る。(ここではWindowsXPで実験)

VB.NET2003のWebBrowserコントロール


サンプルソース

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

関係する関数・プロパティ

CreateObject("InternetExplorer.Application")

VBAの関数。IEのウィンドウを新しく作り、そのインスタンスを返す。
たぶん実体はWebBrowserじゃないかと思う。(「TypeName(IE)」の結果はIWebBrowser2だった)

Navigate URL
Navigate2 URL

URLを指定する。第2引数以降もオプションで何かが指定できる。
Navigateを実行した時点で、ウェブページの取り込みは始まる。

NavigateとNavigate2の違いは、第1引数であるURLの型が、NavigateはStringでNavigate2はVariantであること。
Navigate2は(シェルインテグレーションの為の)Navigateの拡張で、Windowsのシェルネームスペースというものも扱えるらしい。シェルネームスペースは ディレクトリやファイルを番号で管理するようなイメージ(?)らしく、番号で扱うから、数値も受け入れられるようにする為にVariant型になっているのかな。
いずれにしても、そんなものは知らない扱わないならNavigateで充分でしょう。

Visible

VisibleプロパティにTrueをセットすると、IEのウィンドウが表示される。
ウェブページの読み込みが完了していなければ、ページが生成されていく過程が見られるようになる。

Busy

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

ReadyStateプロパティは、ドキュメントの状態を表す。
読み込みが終わって表示できる状態になると、4(complete)になる。

これはBusyと異なり、フレームであれば、全フレームが読み込み終わってから完了になる。

Stop

BusyがTrueのときに)読込処理を終了させるのに使う。

Refresh
Refresh2 〔レベル〕

現在表示されている内容をリロード(更新)する。

DoEvents

VBAの関数。OSに制御を返す。
自分は何もせず待っている間に、他のアプリケーションのイベントを処理させることが出来る。

Timer

VBAの関数。午前0時からの経過時間(秒単位だが、小数点以下も有り)を返す。
したがって、日をまたがるような処理で使う場合は注意。

document

ドキュメントを取得できる。

IE.document.Title タイトルを取得する。
IE.document.body.innerHTML HTMLを取得する。

既存のIEを探す方法

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

Excelへ戻る / 技術メモへ戻る
メールの送信先:ひしだま