W.I.S. Laboratory
menu-bar

ExcelとVBA


ExcelとVBAでRound関数の挙動が違う

「2.5」という数値をExcelシートのRound関数で整数に丸めると「3」になるが、VBAのRound関数で同様のことをすると「2」になる。
ExcelのRound関数は四捨五入を行うのだが、VBAのRound関数は「銀行丸め(別名:JIS丸め)」を行うために、このような違いが生まれる。

銀行丸めとは、端数が5よりも小さい時は切り捨て、5よりも大きい時は切り上げ、5の時は結果が偶数になる方向へ丸めるという方法。
つまり、対象となる数値が2.5ならば結果は2になり、3.5ならば結果は4になる。
四捨五入は、切り捨ての対象が1~4の4通りだが切り上げの対象が5~9の5通りあるので、対象となる数値が大量にあった場合に結果の平均値が少し大きめの方向へズレてしまう。
銀行丸めを行うと、切り捨て・切り上げの対象がほぼ半々になるため、結果の平均値のズレがより少なくなる。

VBAで四捨五入をする場合は、WorksheetFunctionクラスのRoundメソッドを使えば可能。

例)2.5を小数点第一位で四捨五入し、変数Aに格納する場合

A = WorksheetFunction.Round(2.5, 0)

Excel側には銀行丸めをする関数が用意されていない。
どうしてもExcelで銀行丸めが必要な場合は、複数の関数を組み合わせて自力で解決するしかない。

例)セルA1に入っている数値を小数点第一位で銀行丸めする場合

=if(mod(abs(A1),1)=0.5,even(abs(A1)-0.5)/sign(A1),round(A1,0))

同じ関数名なのにVBAだけが銀行丸めを行う仕様になっている理由はよく分からない。
ExcelとVBAにはこのような仕様の違いが散見され、例えば1900年2月28日以前のDate形式シリアル値が1つずつズレているという面倒な仕様もある。

[ 戻る ]
saluteweb