当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

【VBA】Round関数で銀行丸めを実行する

Round(数値1, 数値2) は小数点以下 [数値 2] + 1 の桁の値が 4 以下なら切り捨て、6 以上なら切り上げて [数値 2] の桁で丸めます。ただし [数値 2] + 1 の桁の値が 5 であった場合は [数値 2] の桁が偶数ならば切り捨て、奇数であれば切り上げます。戻り値は Single 型(単精度浮動小数点数型)です。

銀行丸め

VBA の Round は Excel の ROUND 関数とは異なり、少し特殊な丸め処理をする関数です。たとえば、2 番目の引数に 0 を指定した場合で調べてみると、

Round(0.5,0)  戻り値 0
Round(1.5,0)  戻り値 2
Round(2.5,0)  戻り値 2
Round(3.5,0)  戻り値 4
Round(4.5,0)  戻り値 4
Round(5.5,0)  戻り値 6
Round(6.5,0)  戻り値 6
Round(7.5,0)  戻り値 8
Round(8.5,0)  戻り値 8
Round(9.5,0)  戻り値 10

上の例では小数部分の値が 5 である場合、整数部分の値をみて偶数 (0, 2, 4, 6, 8) であれば切り捨てていますが、奇数 (1, 3, 5, 7, 9) であれば切り上げています。このように端数が 5 であった場合に偶数寄りに丸めることを銀行丸め (banker’s rounding) とよび、その名のとおり主に金融業務に用いられる丸め方です。

割り算して得た値について、指定した桁で銀行丸めを実行するファンクションマクロ(ユーザー定義関数)を載せておきます。

'[VBA] 除算と銀行丸めを同時に実行する関数
Function DIV_BR(a As Double, b As Double, c As Long) As Double
  DIV_BR = Round(a / b, c)
End Function

DIV_BR() 関数は引数に被除数 a, 除数 b, 残す桁 c を指定して、a/b を計算し、c + 1 の桁を参照して「銀行丸め」を実行します。たとえば

=DIV_BR(10,3,2)

と入力すると「 3.33 」を返します。ちなみに、DIV_BR の DIV は division (除算) の略、BR は banker’s rounding (銀行丸め) の略です。

しかし、「銀行丸めでは困る!」というケースも頻繁に生じるはずです。そういうときは普通に四捨五入を実行する Excel の ROUND 関数を呼び出して使います。さきほどの DIV_BR() を普通の四捨五入バージョンに書き換えると次のようになります。

'[VBA] 除算と四捨五入を同時に実行する関数
Function DIV_R(a As Double, b As Double, c As Long) As Double
  DIV_R = Application.WorksheetFunction.ROUND(a / b, c)
End Function

DIV_R() の引数に被除数 a, 除数 b, 残す桁 c を指定して実行すると、a/b を計算し、c + 1 の桁を参照して「四捨五入」を実行します。

エクセルや数学に関するコメントをお寄せください