処理状況表示 ②プログレスバー

YouTube VBA

  この続きですので、こちらからご覧ください

プログレスバーの追加

ユーザーフォームにプログレスバーを追加します

ツールボックスその他のコントロールMicrosoft ProgressBar Control
チェックを入れます

追加したプログレスバーを選択し、ドラッグ


オブジェクト名:ProgressBar1

プログレスバーの表示

モーダレスでフォーム表示

frmTest.Show vbModeless

プログレスバーの最小値・最大値を代入

frmTest.ProgressBar1.Min = 0
frmTest.ProgressBar1.Max = 10000

プログレスバー表示

For i = 0 To 10000
  frmTest.ProgressBar1.Value = i
Next i

時間の計測&描画回数の変更

時間の計測

Dim StartT As Double
StartT = Timer

Call main   ’メインの処理を呼び出す

MsgBox Timer – StartT & “秒 処理が終了しました”

処理にどれぐらいかかっているのか確認してみましょう!

描画回数の変更

毎回処理状況を描画するのではなく、例えば10回に1回にしてみます
If i Mod 10 = 0 Then
i を10で割った余りが0の時だけ、描画する

プログレスバーを表示させると、処理時間が長くなるので
状況により回数を変更して、ベストな描画回数を探ってみましょう

For i = 0 To 10000

        '10回に1回フォームを表示
        If i Mod 10 = 0 Then
            'OSに処理を返す(画面描画を更新)
            DoEvents
            frmTest.txtJyoukyou.Value = i
            frmTest.ProgressBar1.Value = i
        End If

        '時間のかかる処理はIF文の外に
        Cells(8, 3) = i

Next i

仮想処理状況を表示するPG作成しました
main2で実行してください
あっという間に終わるので、描画回数の変更はしていません
mainは描画回数の変更するバージョンです
モードレスにしています
実行してみてください

フォーム
オブジェクト名:frmTest
Caption:実行中…

コマンドボタン
オブジェクト名:btnClose
Caption:閉じる

テキスト
オブジェクト名:txtJyoukyou

ラベル
オブジェクト名:lblJyoukyou
Caption:なし
オブジェクト名:変更なし
Caption:回目/10000回中

Module1

Option Explicit
Sub test()
    'frmTest.Show vbModal   'モーダル(規定値)
    frmTest.Show vbModeless 'モードレス
        
    frmTest.ProgressBar1.Min = 0
    frmTest.ProgressBar1.Max = 10000
        
    Dim StartT  As Double
    StartT = Timer
    
    'メインの処理を呼び出す
    Call main2
    
    '処理終了のメッセージを表示
    MsgBox Timer - StartT & "秒 処理が終了しました。"
    'フォームをアンロードする
    Unload frmTest
    
End Sub
Sub main()
    Dim i As Long
        
    For i = 0 To 10000

        '10回に1回フォームを表示
        If i Mod 10 = 0 Then
            'OSに処理を返す(画面描画を更新)
            DoEvents
            frmTest.txtJyoukyou.Value = i
            frmTest.ProgressBar1.Value = i
        End If

        '時間のかかる処理はIF文の外に
        Cells(8, 3) = i

    Next i
    
End Sub

Sub main2()
    Dim i As Long
    
   'ここにFile 読み込み処理を書く
    Cells(8, 3) = "File 読み込み中"
    frmTest.lblJyoukyou.Caption = "File 読み込み中"
    For i = 1 To 3000
        'OSに処理を返す(画面描画を更新)
        DoEvents
        Cells(10, 3) = i
        frmTest.txtJyoukyou.Value = i
        frmTest.ProgressBar1.Value = i
        'frmTest.Repaint        '画面がちらつくのでコメントに
    Next i
    
    'ここに計算処理実行処理を書く
    Cells(8, 3) = "計算処理実行中"
    frmTest.lblJyoukyou.Caption = "計算処理実行中"
    For i = 3001 To 7000
        'OSに処理を返す(画面描画を更新)
        DoEvents
        Cells(10, 3) = i
        frmTest.txtJyoukyou.Value = i
        frmTest.ProgressBar1.Value = i
        'frmTest.Repaint        '画面がちらつくのでコメントに
    Next i
    
    'ここにFile 書き込み処理を書く
    Cells(8, 3) = "File 書き込み中"
    frmTest.lblJyoukyou.Caption = "File 書き込み中"
    For i = 7001 To 10000
        'OSに処理を返す(画面描画を更新)
        DoEvents
        Cells(10, 3) = i
        frmTest.txtJyoukyou.Value = i
        frmTest.ProgressBar1.Value = i
        'frmTest.Repaint        '画面がちらつくのでコメントに
    Next i
    
    frmTest.lblJyoukyou.Caption = "処理終了しました"
    Cells(8, 3) = "処理終了しました"

End Sub

frmTest

Option Explicit
Private Sub btnClose_Click()
    Dim CloseYesNo  As Long
    
    CloseYesNo = MsgBox("処理を中止しますか?", vbYesNo)
    If CloseYesNo <> vbYes Then Exit Sub
    
    Unload frmTest
    End
End Sub

プログラムソース

YouTube動画のソースコードです

Sub test()
    'frmTest.Show vbModal   'モーダル(規定値)
    frmTest.Show vbModeless 'モードレス
        
    'メインの処理を呼び出す
    Dim i As Long
    Dim StartT  As Double
    
    frmTest.ProgressBar1.Min = 0
    frmTest.ProgressBar1.Max = 10000
    StartT = Timer
    For i = 0 To 10000
    
        '10回に1回フォームを表示
        If i Mod 10 = 0 Then
            'OSに処理を返す(画面描画を更新)
            DoEvents
            frmTest.txtJyoukyou.Value = i
            frmTest.ProgressBar1.Value = i
        End If
        
        '時間のかかる処理はIF文の外に
        Cells(8, 3) = i
        
    Next i
    
    '処理終了のメッセージを表示
    MsgBox Timer - StartT & "秒 処理が終了しました。"
    'フォームをアンロードする
    Unload frmTest
    
End Sub

Sub main()
    'ここにメイン処理を書いてもOK!
End Sub
Private Sub btnClose_Click()
    Dim CloseYesNo  As Long
    
    CloseYesNo = MsgBox("処理を中止しますか?", vbYesNo)
    If CloseYesNo <> vbYes Then Exit Sub
    
    Unload frmTest
    End
End Sub

コメント