進捗を確認する

処理中に、進捗状況を知りたい時がある。処理速度に影響するらしく、多用は出来ないが、そんな時は「ステータスバー」を使う方法がある。
f:id:Infoment:20190130211826p:plain
Excel VBAでは以下で、ステータスバーに任意の文字を表示することが出来る。

Application.StatusBar = "任意の文字"

従って、例えば「何件終わったか」を知るのであれば、こんな方法が考えられる。

Sub Macro1()
    Dim i As Long
        For i = 1 To 1000
            Application.StatusBar = i
        Next
        Application.StatusBar = False
End Sub

変数iをループさせる際、i番目であることをステータスバーに表示している。
f:id:Infoment:20190130212413g:plain

最初から全数が分かっている場合は、それを示した方が、更に進捗が分かり良い。
例えば、こんな感じだ。

Sub Macro1()
    Dim iMax As Long: iMax = 1000
    Dim i As Long
        For i = 1 To iMax
            Application.StatusBar = i & " / " & iMax
        Next
        Application.StatusBar = False
End Sub

f:id:Infoment:20190130212816g:plain

上記例のように、全数から進捗をイメージしやすい場合は良い。
しかし、例えばこんな場合はどうだろう。
f:id:Infoment:20190130213155g:plain
「436 / 2659」と言われても、頭の中で何某かの換算が必要で、直感的理解に繋がりにくい。或いは百分率に変換などすれば、少しは分かり良くなるかもしれない。

Sub Macro1()
    Dim iMax As Long: iMax = 2659
    Dim i As Long
        For i = 1 To iMax
            Application.StatusBar = Format(i / iMax * 100, "0.0%(全数:" & iMax & ")")
        Next
        Application.StatusBar = False
End Sub

f:id:Infoment:20190130213936g:plain

更に直感的な理解を求めるなら、進捗の見える化が良いと思う。
例えば、こんな感じだ。

Sub Macro1()
    Dim iMax As Long
        iMax = 2659
    ' 最大値のおおよそ十分の一 ※小数点切り上げ
    Dim OneTenth As Long
        OneTenth = iMax / 10 - 1
    ' 進捗度 ※10%単位
    Dim Progress As Long
    Dim i As Long
        For i = 1 To iMax
            If i Mod OneTenth = 0 Then
                Progress = i / OneTenth
                Application.StatusBar = WorksheetFunction.Rept("■", Progress - 1) & _
                                        WorksheetFunction.Rept("□", 10 - Progress + 1) & _
                                        "(全数:" & iMax & ")"
            End If
        Next
        Application.StatusBar = False
End Sub

f:id:Infoment:20190130220235g:plain

どのような表現が分かり易いか、好みに合わせて記号を変えるのも良いと思う。

明日に続きます。

参考まで。