【Excel VBA】途中経過の表示方法(ProgressBar)

Excel

ExcelVBAにて時間がかかる処理を行う場合に、プログレスバーを表示して途中経過を出す方法をご説明します。
なお、簡易的にステータスバーに途中経過を出す方法は、以下の記事をご覧ください。

プログレスバーを使う準備

プログレスバーを使うには、まずはユーザーフォームを作って、フォーム上にプログレスバーを配置する必要があります。

①Visual Basic Editorの画面で、[挿入]→[ユーザーフォーム] を選ぶと、ユーザーフォームが作成されます。

②[ツール]→[その他のコントロール] を選ぶと、[コントロールの追加]画面が表示されます。

③[利用可能なコントロール] から[Microsoft ProgressBar Contorol] を選択して [OK] をクリックすると、[ツールボックス]にプログレスバーが追加されます。

④先ほどツールボックスに追加したプログレスバーを、ユーザーフォームに追加します。

⑤プログレスバーを選択した状態で、プロパティ画面で、追加したプログレスバーの[オブジェクト名]を確認しておきます。(あとで使います。)
なお、[オブジェクト名]は必要に応じて変更できます。

⑥また、見た目を良くするために、[Scrolling]を「0 – ccScrollingStandard」→「1 – ccScrollingSmooth」に変えておきます。

⑦フォームの大きさを調整します。
プログレスバーが無い場所をクリックすると、フォームの大きさを調整できるようになります。

⑧フォーム全体を選択した(プログレスバーが無い場所をクリックする)状態で、プロパティ画面で、フォームの[オブジェクト名]を確認しておきます。(あとで使います。)
なお、[オブジェクト名]は必要に応じて変更できます。
また、[Caption]がフォームのタイトルバーに表示される文字になりますので、必要に応じて変更しておきます。

これで、プログレスバーを使う準備が出来ました。

プログレスバーの使い方

ステータスバーの説明記事(以下の記事)でも使った「FizzBuzz問題」を使って、プログレスバーを作りました。
【Excel VBA】途中経過の表示方法(StatusBar)

説明は、下記ソースのコメントに記載しましたので、ご参照ください。

Sub FizzBuzzProgress()

    Dim Idx1 As Long

    '--------------------------------------------------
    '初期設定
    '--------------------------------------------------
    'フォームを表示
    'vbModeless を付けないと、フォームが出たまま処理が止まってしまいます。
    UserForm1.Show vbModeless
    
    'プログレスバーの最大値を設定
    '以下の処理で10万行の処理をするため、「100000」を設定
    UserForm1.ProgressBar1.Max = 100000
    
    'プログレスバーの初期値「0」を設定
    UserForm1.ProgressBar1.Value = 0
    
    '制御をOSに戻す(これをやらないと初期設定がフォームに反映されません)
    DoEvents

    '--------------------------------------------------
    'FizzBuss問題
    '--------------------------------------------------
    For Idx1 = 1 To 100000
        'A列:数字を表示
        Sheets("Sheet1").Cells(Idx1, 1) = Idx1
        
        'B列:FizzBussの答えを表示
        If Idx1 Mod 3 = 0 And Idx1 Mod 5 = 0 Then
            Sheets("Sheet1").Cells(Idx1, 2) = "Fizz Buzz"
        ElseIf Idx1 Mod 3 = 0 Then
            Sheets("Sheet1").Cells(Idx1, 2) = "Fizz"
        ElseIf Idx1 Mod 5 = 0 Then
            Sheets("Sheet1").Cells(Idx1, 2) = "Buzz"
        Else
            Sheets("Sheet1").Cells(Idx1, 2) = Idx1
        End If
        
        '------------------------------------------------------
        '数字(行番号)が千の倍数のときに、プログレスバーを更新
        '------------------------------------------------------
        If Idx1 Mod 1000 = 0 Then
            'プログレスバーに、行番号「Idx1」を設定
            UserForm1.ProgressBar1.Value = Idx1
        End If
    Next
    
    '--------------------------------------------------
    '処理終了後、フォームを消去
    '--------------------------------------------------
    Unload UserForm1

End Sub

実行すると、こんな感じのフォームが表示されます。
処理が完了すると、フォームが消えます。

コメント

タイトルとURLをコピーしました