• ベストアンサー

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関数のバグなりスペックなのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • arata
  • ベストアンサー率49% (139/279)
回答No.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.を付けて シートの関数を使うようにするのが簡単だと思います。

参考URL:
http://www.microsoft.com/JAPAN/support/kb/articles/J045/8/59.htm
komatta_kun
質問者

お礼

ありがとうございます。「丸め」と「四捨五入」、一般人にはどうも同じに思えてしまいます。別の関数にするとかしてほしいですよねぇ。

その他の回答 (2)

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.2

18.5以外でも、数値の整数部分が偶数であれば、同様の現象が起こるみたいですね。 ヘルプには -+-+-+-+ 機能 指定された小数点位置で丸めた数値を返します。 -+-+-+-+ とあり、四捨五入とは一言も書いていないため、厳密に言えば間違いではないですが、一般常識的観点からすれば、どう見てもバグですよね(笑)。 ちなみに、ワークシート関数のRoundのヘルプには、四捨五入すると書いてありました。 で、解決策としては、四捨五入する版のRound 関数を自作してみてはいかがでしょうか。 方法とかわからなければ、補足していただければ私が作ってもいいです。

komatta_kun
質問者

お礼

ありがとうございます。他の方にいただいたように、「丸め」と「四捨五入」は違うらしいですね。

noname#1296
noname#1296
回答No.1

 スペックだそうです。MicrosoftのKnowledgeBassでもありました。丸めの方法で誤差を無くす為に結果が常に偶数になるようにしているみたいです。ISOかなんかでも認定されている方法らしいです。Excelだけに限らずAccessなどのVBAでも同じです。  ワークシート上でも同様になるのならしょうがないかなとも思うんですが、なんか納得いかないですよね。

komatta_kun
質問者

お礼

ありがとうございます。そうですよねぇ、なんかまぎらわしいですよねぇ。

関連するQ&A