top of page
執筆者の写真yuji fukami

進行状況をステータスバーに表示する

更新日:1月17日


<概要>


今回は、進行状況をステータスバーに表示する汎用プロシージャを紹介します。



作成したプログラムの進行状況をユーザーに知らせるための処理は、時間を要する処理において実装するのはマナーのようなものです。


進行状況、いわゆるプログレスバーは開発者によっていろいろ個性がでるので面白いところですが、私の場合はステータスバーを利用して最小限の情報とコードで実装しています。



<用途>


・時間を要する処理の進行状況をお知らせする。




<プロシージャ紹介>


Public Sub ShowStatusBarProgress(Value As Long, MaxValue As Long, [Divide As Long = 1], [Message As String = ""])


名前:ShowStatusBarProgress/Subプロシージャ


説明:進行状況をステータスバーに表示する



引数


Value ・・・現在個数


MaxValue ・・・全体個数


[Divide] ・・・分割幅(Valueが何回に1回のときにスターテスバーを更新するか)/省略なら1で毎回更新


[Message]・・・表示メッセージ



<実行例>


次のようなコードを記述します。


ステータスバー



実行すると左下のステータスバーには次のような表示がされます。


ステータスバー

この汎用プロシージャを使用する上での注意点ですが、ループ数が多いときは分割数「Divide」をしっかり指定することです。


「スターテスバーに文字列を表示する」処理自体に処理時間を要するため、デフォルト値で「Divide=1」とするとループ毎にスターテスバーが更新されて余計に処理に時間がかかってしまいます。


ちなみに、今回のように進行状況をお知らせせずに実行するのが一番処理時間が短くてすみます。その代わり「どのくらい進んでいるか」が分からなくなります。それぞれ長所短所ですね。


<コード>

 

 Gist

Public Sub ShowStatusBarProgress(ByRef Value As Long, _
                              ByRef MaxValue As Long, _
                       Optional ByRef Divide As Long = 1, _
                      Optional ByRef Message As String = "")
'進行状況をスターテスバーに表示する
'20220204
'20220421 経過時間、終了予定時刻なども表示可能に
'20220530 先頭にメッセージを表示可能に
'20221217 分割幅(Divide)を指定可能に
'20230219 イミディエイトウィンドウにも表示
'https://www.softex-celware.com/post/showstatusbarprogress

'引数
'Value    ・・・現在個数
'MaxValue ・・・全体個数
'[Divide] ・・・分割幅(Valueが何回に1回のときにスターテスバーを更新するか)/省略なら1で毎回更新
'[Message]・・・先頭メッセージ
    
    Static StartTime As Double
    If StartTime = 0 Then
        StartTime = Now()
    End If
    
    If Value Mod Divide <> 0 Then 'Divide=10の場合、Value=1,11,21...のときのみ処理
        If Value <> MaxValue Then 'Value=MaxValueのとき(最後の位置)は処理する
            Exit Sub '処理しない
        End If
    End If
    
    Dim Per           As Double: Per = Value / MaxValue                          '作業完了率
    Dim ElapsedTime   As Double: ElapsedTime = Now() - StartTime                 '経過時間
    Dim TimePerSingle As Double: TimePerSingle = ElapsedTime / Value             '1件当たり作業時間
    Dim RemainTime    As Double: RemainTime = (MaxValue - Value) * TimePerSingle '残り予定時間
    Dim FinishTime    As Double: FinishTime = RemainTime + Now()                 '終了予定時刻
    
    Dim strMessage As String: strMessage = Format(Per, "0.0%完了") & ", " & _
                                           Value & "/" & MaxValue & ", " & _
                                           "残り時間:" & Format(RemainTime, "h時間mm分ss秒") & ", " & _
                                           "完了予定時刻:" & Format(FinishTime, "h時mm分")
                                           
                                               
'    strMessage = Message & " " & strMessage
    strMessage = strMessage & " " & Message
                                   
    Application.StatusBar = strMessage
    Debug.Print strMessage 'イミディエイトウィンドウにも表示'20230219
    DoEvents 'スターテスバー表示で固まらないようにするための処理
    
    If Value = MaxValue Then StartTime = 0
    
End Sub





閲覧数:126回0件のコメント

最新記事

すべて表示

留言


bottom of page