時間数計算で30分単位に四捨五入!

労働局の見解では「日毎に切り捨てを行なうのは切り捨て時間分の賃金が未払いとなる」のだそうです。
このような方法で計算していませんか?   従来は「事務上の簡便的な方法」として暗黙的に認められてきていて一般的な方法だと思うのですが、最近では、この問題によって億単位の未払いを指摘される大手企業も出てきています。 要は月次までは「分単位集計」の上で給与計算に引き渡す時間数として「まるめ」が必要なら切り捨てではなく四捨五入にしなさい、ということのようです。
でも、「30分単位の四捨五入」ってどうやるのでしょう!?
上記のコラムでの方法は月間時間合計の「まるめ」ですが、1日を例にしてやってみます。(03_JIKAN6.xlsx)
単位時間で四捨五入の例
(画像をクリックすると、このページのサンプルがダウンロードできます)
四捨五入する単位を一旦「整数」に置き換えてやるのが、最も簡単な方法でしょう。このためには「日付(時刻)型」のデータ属性を理解しなければなりません。 以前から説明している通り「日付(時刻)型」は1日を「1」の増分とするシリアル値ですから、24倍すれば1時間を「1」の増分とする値になり、48倍すれば1時間を「1」の増分とする値となります。 この時の「24倍」「48倍」は1日の「1」を単位時間で割ってやれば良いわけです。
単位時間で四捨五入の例
ここに表示されている「時刻の実値」は単位時間である「0:15」「0:30」を標準書式で表示させただけのものです。これがシリアル値の実数になります。「1を時刻で割った値」が今回の重要なポイントで「15分は1日の96分の1」、「30分は1日の48分の1」であることを示しています。

ならば、一旦、単位時間が1日のn分の1かを示す値で乗じてから四捨五入して、再度、その値で割れば良いことになります。
単位時間で四捨五入の例
このサンプルでは、15分単位なら、時間数を一旦96倍すれば15分単位に「1」の増分となるシリアル値が求められるため、その段階でROUND関数で四捨五入し、その結果を再度96で割って時間数形式に戻しています。
同様に30分単位なら、時間数を一旦48倍すれば30分単位に「1」の増分となるシリアル値が求められるため、その段階でROUND関数で四捨五入し、その結果を再度48で割って時間数形式に戻せば良いわけです。
でも「時刻の実値」を見て分かるように、実値は無限小数なのに実際はデータ型による「まるめ」を受けているわけで、誤差問題がないのか気になるところです。

単位時間でまるめる「ユーザー定義関数」を作ってみましょう。
「ユーザー定義関数」の実体はマクロですから、本来はマクロに関する充分な知識を要求されるわけです。
ですが、その「充分な知識」がないからといって最初からあきらめるというものでもないと思います。 ここでの「ユーザー定義関数」に関するマクロ上での構文は数行でしかないので「勉強」する範囲も限られます。 こんなことをきっかけにしてマクロにトライするのはいかがでしょうか。

もちろん、「マクロの記録」で操作して得られるようなコードではありませんが、

'*******************************************************************************
'   指定分数で四捨五入処理
'*******************************************************************************
'*【戻値】:四捨五入の処理結果の時間数(Date)
'*【引数】:時間数(Date)、指定時間単位(Date)
'*【注意】:字類チェックは行なっていない
'*******************************************************************************
Public Function ROUND_MIN(vntJIKAN As Variant, vntTANI As Variant) As Variant
    Dim dblMod As Double

    dblMod = 1 / vntTANI
    ROUND_MIN = CDate(WorksheetFunction.Round(vntJIKAN * dblMod, 0) / dblMod)
End Function
この程度のコードです。
この関数を使って、上記同様の計算をしているのがこちらです。(03_JIKAN7.xlsm)
単位時間で四捨五入の例(2)