教えて!ExcelVBA!

ExcelVBAの基礎知識・書き方について紹介します。

【ExcelVBA フォーム&コントロール】ラベルを利用して処理を中断できるプログレスバーを作成する方法を教えて!

内容

フォームに設置したラベルを利用して、処理の進行状況を表示するプログレスバーを作成します。フォームにラベルを2つ配置し、そのうちの1つ(Label1)は、処理の進行に合わせて右方向へ伸びて行くプログレスバーとし、もう一方(Label2)は、プログレスバーの外枠と数値による%表示として使用します。開始ボタン(CommandButton1)をクリックすると処理が表示され、処理状況が100%に達すると処理終了のメッセージを表示します。また、中断ボタン(CommandButton2)をクリックすると処理を途中で終了します。

プログラミング例

以下の手順に従って、Excel VBAフォーム上にプログレスバーを作成し、処理の進行状況を表示します。

1.VBA フォームの作成

デベロッパー タブを表示し、「挿入」ボタンをクリックしてUserFormを挿入します。

2.ラベルの配置

フォーム上に2つのラベル(Label1、Label2)を配置します。Label1はプログレスバー本体、Label2は外枠と%表示のためです。

3.ボタンの配置

フォーム上にコマンドボタン(CommandButton1、CommandButton2)を配置します。これをクリックすると処理が開始されます。CommandButton1は開始ボタンとし、CommandButton2は中断ボタンとします。

3.VBA コードの追加

UserFormのコードモジュールに以下のコードを追加します。

Dim myAddWidth As Long
Dim myExitFlg As Boolean

Private Sub UserForm_Initialize()
    myAddWidth = Label1.Width / 100
    Label1.Width = 0
    myExitFlg = False
End Sub

Private Sub CommandButton1_Click()
    Dim i As Long
    For i = 1 To 100
        Application.Wait Now() + TimeValue("00:00:01")
        Label1.Width = Label1.Width + myAddWidth
        Label2.Caption = i & "%"
        DoEvents
        If myExitFlg = True Then
            If MsgBox("処理を中断しますか?", vbYesNo) = vbYes Then
                Label1.Width = 0
                Label2.Caption = ""
                myExitFlg = False
                Exit Sub
            Else
                myExitFlg = False
            End If
        End If
    Next i
    MsgBox "処理終了"
    Unload Me
End Sub

Private Sub CommandButton2_Click()
    myExitFlg = True
End Sub

4.プログレスバーの更新と中断ボタン

中断ボタン(CommandButton2)をクリックすると、CommandButton2_Click サブルーチンが実行され、IsProcessing 変数が False に設定され、処理が中断されます。
処理中は中断ボタンを押しても無視されますが、処理が終了するか中断ボタンが押されると、メッセージが表示されます。