ある数値がどの範囲にあるかを知りたい

仕事で作成中のツールにて。
ある数値が100単位で、どの範囲にあるか知る必要がでてきた。具体的には、例えば以下のとおり。
数値:130 ⇒ 0100~0199
数値:351 ⇒ 0300~0399
要は、「351」(数値)という入力に対し、「0300~0399」(文字列)という戻り値を得る関数があれば良い訳で。

そこで今回は、二通りの方法を考えてみた。
f:id:Infoment:20181022205754p:plain

1.引いて引いて余りが0

とにかく、入力した値を1ずつ引いていく。で、100で割って余りが0なら、そこは100の倍数となり、つまり求める範囲の最小値になる。

Function GetNumberRange(val As Long) As String
    Dim i As Long
        If val Mod 100 <> 0 Then
            For i = 1 To 100
                val = val - 1
                If val Mod 100 = 0 Then
                    Exit For
                End If
            Next
        End If
        GetNumberRange = Format(val, "0000") & _
                        "~" & _
                        Format(val + 99, "0000")
End Function

最初に余りを確認しているのは、入力値が100などの場合、そこが最小値だから。
ループで1~100としたのは、100回以内に最小値へ到達するから。
1つずつ引くという地味な作業だが、初学者がFor ~ Next ループを学ぶ題材に使えるかもしれない。

2.最寄りの値を求めてみる。

MROUND関数を用いて、入力した値が100飛びで最も近い値を求めてみる。
例えば、

MROUND(1,100)=0

となる。1 は 0 と 100 の間にあって、0 の方が近いから。その後、50から先の戻り値は100となる。

MROUND(48,100)=0
MROUND(49,100)=0
MROUND(50,100)=100
MROUND(51,100)=100

そこでMROUND関数で求めた値と元の値の大小を比較して、最小値を求めてみた。

Function GetNumberRange(val As Long) As String
    Dim Temp As Long
        Temp = WorksheetFunction.MRound(val, 100)
        If Temp > val Then
            Temp = Temp - 100
        End If
        GetNumberRange = Format(Temp, "0000") & _
                        "~" & _
                        Format(Temp + 99, "0000")
End Function

f:id:Infoment:20181023071740p:plain

行数が少ない分、こちらの方がお勧めです。

参考まで。