時間を10分きざみに丸めるVBA。Accessで使えるCeiling関数を使わない方法。

先日、美容院用顧客管理システムで予約時間をボタンひとつで、10分単位の時間で入力されるようにしました。この時、参照設定でExcel関数を読み込み、ExcelではよくつかわれるCeiling関数をつかったわけですが・・・。

作ったアプリをベータテストしてくれているアロマサロンさんで試してもらったところ思わぬ落とし穴。AccessRuntimeで動作させているPCにExcelがインストールされていなかったのです。

Excel関数つかえないのでINT関数を代わりに使う。

というわけで、代替案。INTを使います。INTはご存じの通り引数に小数が入ると、整数を返します。日付型は24時間を1と表し、時刻は小数として表します。試しにExcelで表示させてみました。

見ての通り、0:00はゼロ。10分加えるごとに0.0069444444となります。この数字は、ほぼ1/144(144分の1)です。同じ数で割ると1になります。(ほぼ)

こんどは0:10から1分ごとの変化です。1/144で割った値を比べると、1分増えるごとに0.1増えていることがわかります。0:20になった時点で2に繰り上がっています。

INT関数は小数点以下を切り捨てて整数にしますから、0.1ずつ増える部分は全部無視されて、10分刻みの整数だけが残りました。

ひとつ前の画像のように割った数字をもう一度かけると元に戻ります。1分単位の部分は切り捨てているので、もちろん1分毎で変化はありません。これをコードで表すと以下の通り。

Private Function intまるめ(t)
    intまるめ = (Int(t / (1 / 144)) * (1 / 144)) 
End Function

このままだと切捨てなので、切り上げにするには10分を表す1/144を足してみました。もうお気づきでしょうが、大体大丈夫なのですが、0分ちょうどだと、10分進みます。うーん。

まあいっか

Private Sub btn_excel_Click()
    Me.txt_marume = excelまるめ(Me.txt_moto)
End Sub

Private Sub btn_intmarume_Click()
    Me.txt_marume = intまるめ(Me.txt_moto)
End Sub

Private Function excelまるめ(t)
     excelまるめ = Excel.Application.Ceiling(t, 1 / 144)
End Function

Private Function intまるめ(t)
    intまるめ = (Int(t / (1 / 144)) * (1 / 144)) + (1 / 144)
End Function

今回の用途の場合、0分単位で10分進んでしまうことは特に大きな問題でなかったのでこのまま使っちゃいました。Accessで以下のように簡単なテストを作って比べてみると、やはり10分単位ぴったりの時は差がでますがご愛敬。というわけで、いま焦って脱Excel参照設定を進めてます。ENCODEURL関数も使っちゃっているので、道のりは長い・・。

誤差はいろいろ出てきそうな方法ですが、アバウトな用途でどうぞ。