VBScriptでプログレスバーを表示する方法

## VBScriptからIEを起動します
* IEを起動し、DIVを使ってプログレスバーのようなものを表示します
* 途中実績から平均処理速度を算出し、全体処理量から残時間を計算して表示させます

## 使い方
### 必要となるスクリプトを読み込みます

  ```vb
  Set objFS = CreateObject("Scripting.FileSystemObject")
  Execute objFS.OpenTextFile("FProgressBar.vbs", 1).ReadAll()
  ```
この２行をスクリプトの冒頭に記述して、クラス定義本体を取り込みます
メインクラス本体FProgressBar.vbsは後述します

### コンストラクタを呼び出して表示タイトルを設定
```vb
Set objPB = new ProgressBar
objPB.SetTitle "サンプルです"
```
IEが起動し画面の左上に配置されます

### 途中経過の表示
全体の作業量をm、現在完了している作業量をnとしたとき、n/mが全体量と現在完了量との割合になります
作業量の割合は0.0が未着手、1.0が終了を表します
作業量を指定してプログレスバーを再表示するには以下を記述します

```vb
objPB.SetProgress n/m
```

### 完了
全体の作業が終わったらデストラクタを呼び出します

```vb
Set objPB = Nothing
```
IEが終了しプログレスバー画面が消えます

## サンプルコード
以下のサンプルでは乱数を使って約10秒の処理を行います
途中50回プログレスバーの更新をしています

```vb:sample.vbs
'-------------------------------------------------------------------------------
' sample.vbs : 進捗バー表示サンプル
'-------------------------------------------------------------------------------
Option Explicit
'-------------------------------------------------------------------------------
' 変数定義
'-------------------------------------------------------------------------------
Dim objPB, objFS
Dim i
'-------------------------------------------------------------------------------
' 外部定義ファイル読み込み
'-------------------------------------------------------------------------------
	Set objFS = CreateObject("Scripting.FileSystemObject")
	Execute objFS.OpenTextFile("FProgressBar.vbs", 1).ReadAll()

'-------------------------------------------------------------------------------
' メイン処理
'-------------------------------------------------------------------------------
	WScript.Echo "sample.vbs 開始"

	Set objPB = new ProgressBar
	objPB.SetTitle "サンプルです"

	Randomize					' 乱数の初期化
	For i = 1 To 50
		objPB.SetProgress i / 50		' 実行数／全体数　（1.00で全部終了）
		WScript.Sleep(Rnd * 400)		' 適当な時間SLEEPさせるため
	Next
	
	Set objPB = Nothing

	WScript.Echo "sample.vbs 終了"
	WScript.Quit(0)
```

## プログレスバーメインクラス
実行VBSと同一フォルダに配置します

```vb:FProgressBar.vbs
'-------------------------------------------------------------------------------
' ProgressBar : 進捗バークラス
'-------------------------------------------------------------------------------
Const WIDTH = 400
Const HEIGHT = 150
Const BAR_WIDTH = 350
Const BAR_HEIGHT = 16
Const BAR_BG = "#C0C0C0"
Const BAR_FG = "#0066FF"

Class ProgressBar

	'----------------------------------------------------
	' クラス変数定義
	'----------------------------------------------------
	Private strTitle1
	Private nCurrent1
	Private nStartTime, nCurrentTime
	Private objIE
	Private div1, div2, div3

	'----------------------------------------------------
	' コンストラクタ
	'----------------------------------------------------
	Private Sub Class_Initialize
		Set objIE = CreateObject("InternetExplorer.Application")
    	objIE.Visible = False
		objIE.Navigate2 "about:blank"
		objIE.Document.Title = "進捗状況"
		objIE.AddressBar = False
		objIE.MenuBar = False
		objIE.ToolBar = False
		objIE.Resizable = False
		objIE.Width = WIDTH
		objIE.Height = HEIGHT
		objIE.Top = 0
		objIE.Left = 0
		Set div1 = objIE.Document.CreateElement("div")
		div1.Id = "div1"
		div1.style.position = "absolute"
		div1.style.top = "10px"
		div1.style.left = "10px"
		div1.style.backgroundColor = BAR_BG
		div1.style.width = BAR_WIDTH & "px"
		div1.style.height = BAR_HEIGHT & "px"
		div1.style.border = "1px solid"
		div1.style.overflow = "hidden"
		Set div2 = objIE.Document.CreateElement("div")
		div2.Id = "div2"
		div2.style.position = "relative"
		div2.style.top = "1px"
		div2.style.left = "1px"
		div2.style.backgroundColor = BAR_FG
		div2.style.width = "0px"
		div2.style.height = (BAR_HEIGHT - 2) & "px"
		div2.style.overflow = "hidden"
		Set div3 = objIE.Document.CreateElement("div")
		div3.Id = "div3"
		div3.style.position = "absolute"
		div3.style.top = "45px"
		div3.style.left = "10px"
		
		objIE.Document.Body.AppendChild(div1)
		div1.AppendChild(div2)
		objIE.Document.Body.AppendChild(div3)

		nStartTime = Timer()
	End Sub

	'----------------------------------------------------
	' デストラクタ
	'----------------------------------------------------
	Private Sub Class_Terminate
		on error resume next
		objIE.Quit
		Set objIE = Nothing
		on error goto 0
	End Sub

	'----------------------------------------------------
	' 表示タイトルの設定
	'----------------------------------------------------
	Public Sub SetTitle (t)
		strTitle1 = t
		objIE.Document.Title = t & String(40, "　")
    	objIE.Visible = True
	End Sub

	'----------------------------------------------------
	' 進捗パーセントの設定
	'----------------------------------------------------
	Public Sub SetProgress(n1)
		nCurrent1 = n1
		Repaint
	End Sub

	'----------------------------------------------------
	' 進捗バー再描画
	'----------------------------------------------------
	Private Sub Repaint

	Dim nAverage
	Dim nElapsedTime
	Dim nRemain
	Dim strRemain
	Dim strPercent

	Dim w1
	Dim style1, style2

		nCurrentTime = Timer()
		nElapsedTime = nCurrentTime - nStartTime

		w1 = BAR_WIDTH * (nCurrent1)
		strRemain = "不明"
		If nElapsedTime <> 0 Then
			nAverage = nCurrent1 / nElapsedTime
			If nAverage <> 0 Then
				nRemain = Round((1 - nCurrent1) / nAverage, 1)
			End If
			If nRemain > 60 Then
				strRemain = "約" & CStr(Round(nRemain / 60, 0)) & "分"
			Else
				strRemain = FormatNumber(nRemain, 1) & "秒"
			End If
		End If
		
		strPercent = FormatNumber(nCurrent1 * 100, 1)

		on error resume next
		div2.style.width = (w1 -1) & "px"
		div3.innerText = strPercent & "%終了　--　残り推定：" & strRemain
		objIE.Visible = True
		objIE.Document.all(0).Click
		on error goto 0
	End Sub
End Class

```

## サンプルの実行方法
sample.vbsをダブルクリックするか、コマンドプロンプトから、`cscript sample.vbs`を実行します