VBScript でプログレスバー的なモノを作りたい

VBScript で進捗状況を示すプログレスバー的なモノを作りたい。

それらしい API はないようなので、IE を起動させ、処理中にメッセージを表示させていくことにする。

' IE の宣言と初期化
Dim ie
initializeIe()

updateMsg "処理を開始します..."

' 処理…
updateMsg "○○処理を実行しています..."
WScript.Sleep 5000  ' サンプル用・処理している風に少し止める

' 完了
updateMsg "スクリプト処理完了!"
MsgBox "スクリプト処理が完了しました。"

' IE を終了させスクリプトを閉じる
closeIe()
WScript.Quit



' IE の初期化
Sub initializeIe()
  Set ie = CreateObject("InternetExplorer.Application")
  With ie
    .Navigate("about:blank")
    .ToolBar = False
    .StatusBar = False
    ' 幅・高さの設定
    .Width = 300
    .Height = 200
    ' 画面右上に配置する。"parentWindow.screen" はパスカルケースで書くと認識されない
    .Top = 0
    .Left = .Document.parentWindow.screen.Width - 300
    .Document.Charset = "UTF-8"
    .Visible = True
    .Document.Title = "スクリプト実行中"
  End With
End Sub

' メッセージを IE に追記する
' 
' 引数のメッセージを IE の最終行に追記する。
' 最終行が表示されるようにスクロール位置を最下部に設定する。
Sub updateMsg(value)
  With ie
    .Document.Body.innerHTML = .Document.Body.innerHTML & value & "<br>"
    .Document.Script.setTimeout "javascript:scrollTo(0," & .Document.Body.ScrollHeight & ");", 0
  End With
End Sub

' IE を終了する
Sub closeIe()
  ie.Quit
  Set ie = Nothing
End Sub

小さめのウィンドウの IE を画面右上に配置し、処理中にメッセージを追記していくことで、進捗状況を示すようにする。

変数 ie をプロシージャ内から操作できるように、Dim ie はグローバル変数として定義しておく。初期化と終了処理は扱いやすいようにプロシージャに外出ししておいた。

メッセージの追記もプロシージャにした。関数名を短くしておけば、デバッグログというか、コメントの代わりとして使えるかなと思い。IE でのメッセージ表示が必要なくなった時は何も処理しない関数にしてしまえば良いし。

parentWindow.screenParentWindow.Screen などとパスカルケースで書くとエラーになる。ココは JavaScript チックな DOM オブジェクトを見ているってことなのかな。Document とか Width とかはパスカルケースでもキャメルケースでも良いのに。これらは VBScript 側で同じオブジェクトを持っているってことなのかしら。よく知らない。

スクロールバーの追随は、VBScript から IE に向けて JavaScript を投げて、scrollTo() を呼び出すようにしている。

作るにあたって参考にしたページ