[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 の桁を参照して「四捨五入」を実行します。

コメント

タイトルとURLをコピーしました