小技プログラミング

VBAでプログレスバーフォームを表示する

記事作成日:2017/12/3 - 最終更新日:2019/3/30
【環境】Office Excel2007、Excel2010

この記事では、ExcelVBAでプログレスバーを表示する実践レベルのサンプルコードをご紹介致します。
時間の掛かる処理を行う時は、利用者に不安を与えないようにするためにも是非利用してみましょう。

このサンプルではフォームを利用して以下の様なプログレスバーを表示します。

では早速プログレスバーの実装手順をご紹介して行きたいと思います。

1.まずはVisualBasicEditorを表示して、VBAProjectを右クリック⇒挿入⇒ユーザーフォームを追加します。

2.次にプログレスバーコントロールの追加方法です。
通常は、コントロールボックスにプログレスバコントロールが無い為追加する必要があります。

ツール⇒その他のコントロールより、Microsoft ProgressBar Control を選択して追加します。

※Officeのバージョンによってはプログレスバーコントロールが無いこともあります。
その場合、パーセント表示用のラベルで進捗率のみを表示させてあげるだけでも十分だと思われます。

3.ツールボックスに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

4.プログラムを実行する為に今回はActiveXコントロールのコマンドボタンを利用します。


5.オブジェクト名をBtnExecuteにしました。


6.次に、プログレスバーを呼び出す側のコードを追加します。
コマンドボタンをダブルクリックすると自動で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時間半待つのでは、心理的負担が違います。

また、エクセルシートへ値表示を行う場合は、描画処理を一時停止するようにすることで速度改善に繋がる事があります。