0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Excel VBAメモ プログレスバー

Last updated at Posted at 2025-06-14

ユーザーフォームによるプログレスバー

ユーザーフォーム以外に
Application.StatusBar も併用して
ステータスバーでのメッセージ更新している。

参考:https://kowaza.withinit.com/vba/vba_ProgressBarForm.html

GUIイメージ
image.png

コード1 UserForm1

'キャンセル処理用フラグ
Public IsCancel As Boolean

'初期化
Private Sub UserForm_Initialize()
'キャンセルフラグにFalseを設定
    IsCancel = False
End Sub

'キャンセルボタンクリックイベント
Private Sub BtnCancel_Click()
'キャンセルフラグにTrueを設定
    IsCancel = True
End Sub

コード 標準モジュール

'参考   https://kowaza.withinit.com/vba/vba_ProgressBarForm.html

Option Explicit

Public g_progressMax As Long
Public g_progressCnt As Long

'事前にUserFormを作成しておく
' ツール⇒その他のコントロールより、Microsoft ProgressBar Control を選択して追加。


'実行ボタンClickイベント
Sub sub_run_progressBar()

    Dim i As Long
    Dim sum As Long
    Dim percent As Integer
    Dim tmp_flag As Integer
    
    g_progressMax = CLng(4) * CLng(10000)   'Clng付けないとオーバーフローする
    g_progressCnt = 0
    

    'プログレスバーFormを表示
    UserForm1.Show vbModeless
    'プログレスバーの最小値を設定
    UserForm1.ProgressBar1.Min = 1
    'プログレスバーの最大値を設定
    UserForm1.ProgressBar1.Max = g_progressMax
    'プログレスバーの現在値を設定
    UserForm1.ProgressBar1.Value = 1
    
    'DoEventsの度にマウスカーソルがちらつく為アイコンを待機中に固定
    Application.Cursor = xlWait
    
    'ステータスバーのメッセージ更新
    Application.StatusBar = "処理進行中 STEP 1/4 "
    
    '時間の掛かる処理を行う
    For i = 0 To g_progressMax / 4
        sum = sum + i
        
        'キャンセルボタン処理
        If UserForm1.IsCancel = True Then
            Call sub_cancel_progressBar
            Exit Sub
        End If
            
        'STEP1
        'プログレスバーの値表示を更新
        If UserForm1.ProgressBar1.Min < i And UserForm1.ProgressBar1.Max >= i Then
            'プログレスバーのLabel表示を更新
            g_progressCnt = g_progressCnt + 1
            percent = CInt(g_progressCnt / g_progressMax * 100)
            UserForm1.Label1.Caption = percent & "%完了 実行中 STEP1/5 "
            'プログレスバーの値を更新
            UserForm1.ProgressBar1.Value = g_progressCnt
            '他のイベントを処理できるようにする ユーザー操作など
            DoEvents
        End If
    
    Next
    
    'ステップ2
    tmp_flag = func_test1(2)
    If tmp_flag = 0 Then
        '終了処理
        Call sub_end_end_progressBar
        Exit Sub
    End If
    
    'ステップ3
    tmp_flag = func_test1(3)
    If tmp_flag = 0 Then
        '終了処理
        Call sub_end_end_progressBar
        Exit Sub
    End If
    
    'ステップ4
    tmp_flag = func_test1(4)
    If tmp_flag = 0 Then
        '終了処理
        Call sub_end_end_progressBar
        Exit Sub
    End If
    
    
    '結果をセルに表示
    ActiveSheet.Cells(1, 1).Value = g_progressCnt
    'プログレスバーFormを閉じる
    Unload UserForm1
    'マウスカーソルをデフォルトに戻す
    Application.Cursor = xlDefault
    
End Sub


Sub sub_cancel_progressBar()
    'キャンセルボタン処理
    'If UserForm1.IsCancel = True Then
        'プログレスバーFormを閉じる
        Unload UserForm1
        'マウスカーソルをデフォルトに戻す
        Application.Cursor = xlDefault
        MsgBox "処理を中断しました。"
        '※今回はロールバック処理を考慮せずにバッサリ処理を終了しています。
    'End If
End Sub


Sub sub_end_end_progressBar()
    '結果をセルに表示
    ActiveSheet.Cells(1, 1).Value = g_progressCnt
    'プログレスバーFormを閉じる
    Unload UserForm1
    'マウスカーソルをデフォルトに戻す
    Application.Cursor = xlDefault
End Sub

Function func_test1(in_step As Long) As Integer
    '返り値 正常終了なら 1, 途中中断などの場合は 0

    Dim i As Long
    Dim sum As Long
    Dim percent As Integer
    
    DoEvents
    
   
    '時間の掛かる処理を行う
    'プログレスバーのラベル
    UserForm1.Label1.Caption = "実行中 STEP" & in_step & "/4 "
    
    For i = 0 To g_progressMax / 4
        sum = sum + i
    
        'キャンセルボタン処理
        If UserForm1.IsCancel = True Then
            Call sub_cancel_progressBar
            func_test1 = 0
            Exit Function
        End If
        
        '他のイベントを処理できるようにする ユーザー操作など
        DoEvents
    Next
        
    
    'プログレスバーの値を更新
     g_progressCnt = g_progressCnt + (g_progressMax / 4)
    UserForm1.ProgressBar1.Value = g_progressCnt
    
    'ステータスバーのメッセージ更新
    Application.StatusBar = "処理進行中 STEP" & in_step & "/4 "
    
        
    func_test1 = 1  '返り値
    
End Function
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?