【環境】Office Excel2007、Excel2010
VBAでプログレスバーを表示する為のサンプルコードです。
このサンプルではフォームを利用して以下の様なプログレスバーを表示します。
以下、プログレスバーの実装手順です。
VisualBasicEditorを表示して、VBAProjectを右クリック⇒挿入⇒ユーザーフォームの順に操作して追加します。
コントロールボックスにプログレスバコントロールが無い場合は、以下の手順で追加する必要があります。
ツール⇒その他のコントロールより、Microsoft ProgressBar Control を選択して追加。
※Officeのバージョンによってはプログレスバーコントロールが無いこともあります。
ツールボックスにProgressBarが追加されているので、以下のようにフォームへ配置します。
オブジェクト名はデフォルトのProgressBar1のままにしています。
その他、キャンセル処理用の『キャンセル』ボタン、進捗をテキストで表示する為の『ラベル』も追加しています。
キャンセルボタンのオブジェクト名はBtnCancelとしました。ラベルのオブジェクト名はデフォルトのLabel1のままにしています。
プログレスバーフォームのコードは以下の内容になります。
'キャンセル処理用フラグ
Public IsCancel As Boolean
'初期化
Private Sub UserForm_Initialize()
'キャンセルフラグにFalseを設定
IsCancel = False
End Sub
'キャンセルボタンクリックイベント
Private Sub BtnCancel_Click()
'キャンセルフラグにTrueを設定
IsCancel = True
End Sub
ここではプログラムを実行する為にActiveXコントロールのコマンドボタンを利用しています。
オブジェクト名を「BtnExcute」にしています。
実行ボタンClickイベントを呼び出します。
プログレスバーを呼び出す側のコードを追加します。
コマンドボタンをダブルクリックすると自動でClickイベントが追加されます。もしくは、VBEから直接Clickイベントのプロシージャを記述します。
Option Explicit
'実行ボタンClickイベント
Private Sub BtnExcute_Click()
Dim i As Long
Dim sum As Long
Dim percent As Integer
Dim count As Long
count = 20000
'プログレスバーFormを表示
UserForm1.Show vbModeless
'プログレスバーの最小値を設定
UserForm1.ProgressBar1.Min = 1
'プログレスバーの最大値を設定
UserForm1.ProgressBar1.Max = count
'プログレスバーの現在値を設定
UserForm1.ProgressBar1.Value = 1
'DoEventsの度にマウスカーソルがちらつく為アイコンを待機中に固定
Application.Cursor = xlWait
'時間の掛かる処理を行う
For i = 0 To count
sum = sum + i
'キャンセルボタン処理
If UserForm1.IsCancel = True Then
'プログレスバーFormを閉じる
Unload UserForm1
'マウスカーソルをデフォルトに戻す
Application.Cursor = xlDefault
MsgBox "処理を中断しました。"
End
'※今回はロールバック処理を考慮せずにバッサリ処理を終了しています。
End If
'プログレスバーの値表示を更新
If UserForm1.ProgressBar1.Min < i And _
UserForm1.ProgressBar1.Max >= i Then
'プログレスバーのLabel表示を更新
percent = CInt(i / count * 100)
UserForm1.Label1.Caption = percent & "%完了"
'プログレスバーの値を更新
UserForm1.ProgressBar1.Value = i
'滞留処理を実行
DoEvents
End If
Next
'結果をセルに表示
ActiveSheet.Cells(1, 1).Value = sum
'プログレスバーFormを閉じる
Unload UserForm1
'マウスカーソルをデフォルトに戻す
Application.Cursor = xlDefault
End Sub
以上で完了です。
実行ボタンを押すとプログレスバーが表示されます。
上記サンプルでは、count = 20000のところが時間の掛かる処理(処理回数)になっています。
実際に利用するコード内で処理回数を取得して設定してください。
プログレスバーの表示処理を行うと処理速度が若干落ちてしまいますが、
多少処理が遅くなっても表示した方が良いケースが多いです。
連絡無しに1時間待たされるのと、少し遅くなるよと連絡を受けて1時間半待つのでは、心理的負担が違いますし、予期せぬ事故も減らせます。
また、エクセルシートへ値表示を行う場合は、描画処理を一時停止するようにすると速度改善に繋がる事があります。