やっぱり0から始めるのは便利

今日職場で、次のようなマクロについて意見交換することがあった。
このようなテーブルに、開始日から終了日までの日付を追加するときのお話。
f:id:Infoment:20201208231010p:plain

例えば今日(12/8)から明後日(12/10)までの三日間、つまり三行をテーブルに追加したい。このとき、ループを0始まりにするか1始まりにするかで、書き方が変わってくる。

1始まりの場合。1、2、3と日頃数えるので、直感的に理解し易い。

Sub test()
    Dim i As Long
    Dim 開始日 As Date
        開始日 = #12/8/2020#
    Dim 終了日 As Date
        終了日 = #12/10/2020#
        
        For i = 1 To 終了日 - 開始日 + 1
            With ActiveSheet.ListObjects(1).ListRows.Add
                .Range(1) = 開始日 + i - 1
            End With
        Next
End Sub

個人的には以下の二か所が、慣れないと少し難しいかも?と思う。

  • 終了日 - 開始日 + 1 (12/10と12/8の差は二日間。12/8を含めるので+1)
  • 開始日 + i - 1 (開始日+i だと、翌日から始まってしまう。なので-1)


一方で0始まりの場合。
0番目という考え方は日常に無いため、直感的に理解しにくい。

Sub test()
    Dim i As Long
    Dim 開始日 As Date
        開始日 = #12/8/2020#
    Dim 終了日 As Date
        終了日 = #12/10/2020#
        
        For i = 0 To 終了日 - 開始日
            With ActiveSheet.ListObjects(1).ListRows.Add
                .Range(1) = 開始日 + i
            End With
        Next
End Sub

直感的な理解からは遠ざかったものの、先程の二か所は1を足したり引いたりが無くなって、とてもスッキリしている。

  • 終了日 - 開始日
  • 開始日 + i

0始まりか1始まりかでこのように差が出るのは、本業がブログらミンクではない身としては、非常に面白いと思う。

それでもやっぱり、ここだけの話、時々混乱してます。

参考まで。