- ベストアンサー
EXCEL-VBA の round関数
EXCEL-VBAで Cells(1, 1) = Round(Cells(3, 3), 0) として、 C3 に28.5 を入力し、上のマクロを実行すると、 A1には、28と表示されてしまいます。 ワークシート関数の =round(c3,0) を他の適当なセルに入力すると、 その返り値は、29 とちゃんとなります。 c3が 28.5001 とかだと両者ちゃんと 29 となります。 これは、VBA関数のバグなりスペックなのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
これは、バグではなく、仕様です。 Roundは四捨五入ではなくて、丸めを行うもので、Excelでは、算術型の丸めを、VBでは、銀行型の丸めを行うようになっています。 銀行型の丸めは、0.5は偶数になるようになっています。 元の値 |0.4|0.5|0.6|1.4|1.5|1.6 --------------------------------- 算術型 | 0| 1| 1| 1| 2| 2 --------------------------------- 銀行型 | 0| 0| 1| 1| 2| 2 ですから、結果は上記のようになります。 四捨五入では、0.1~0.4の四つが切り捨て、 0.5~0.9の5つが切り上げになりますから、 値が大きくなる傾向がありますが、銀行型では 切り上げと切り捨ての交互になるため誤差が 四捨五入より、小さくなることが期待できる ようになっているのです。 ExcelのVBAでエクセルのシートのRoundと 同じ計算がしたい場合は、 Cells(1,1).Value = Application.Round(Cells(3,3).Value,0) のように、Roundの前に、Application.を付けて シートの関数を使うようにするのが簡単だと思います。
その他の回答 (2)
- ARC
- ベストアンサー率46% (643/1383)
18.5以外でも、数値の整数部分が偶数であれば、同様の現象が起こるみたいですね。 ヘルプには -+-+-+-+ 機能 指定された小数点位置で丸めた数値を返します。 -+-+-+-+ とあり、四捨五入とは一言も書いていないため、厳密に言えば間違いではないですが、一般常識的観点からすれば、どう見てもバグですよね(笑)。 ちなみに、ワークシート関数のRoundのヘルプには、四捨五入すると書いてありました。 で、解決策としては、四捨五入する版のRound 関数を自作してみてはいかがでしょうか。 方法とかわからなければ、補足していただければ私が作ってもいいです。
お礼
ありがとうございます。他の方にいただいたように、「丸め」と「四捨五入」は違うらしいですね。
スペックだそうです。MicrosoftのKnowledgeBassでもありました。丸めの方法で誤差を無くす為に結果が常に偶数になるようにしているみたいです。ISOかなんかでも認定されている方法らしいです。Excelだけに限らずAccessなどのVBAでも同じです。 ワークシート上でも同様になるのならしょうがないかなとも思うんですが、なんか納得いかないですよね。
お礼
ありがとうございます。そうですよねぇ、なんかまぎらわしいですよねぇ。
お礼
ありがとうございます。「丸め」と「四捨五入」、一般人にはどうも同じに思えてしまいます。別の関数にするとかしてほしいですよねぇ。