最新閲覧日:

EXCEL-VBAで
Cells(1, 1) = Round(Cells(3, 3), 0)
として、
C3 に28.5 を入力し、上のマクロを実行すると、
A1には、28と表示されてしまいます。
ワークシート関数の =round(c3,0) を他の適当なセルに入力すると、
その返り値は、29 とちゃんとなります。

c3が 28.5001 とかだと両者ちゃんと 29 となります。

これは、VBA関数のバグなりスペックなのでしょうか?

A 回答 (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/articl …
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/01/04 23:44

18.5以外でも、数値の整数部分が偶数であれば、同様の現象が起こるみたいですね。



ヘルプには
-+-+-+-+
機能

指定された小数点位置で丸めた数値を返します。
-+-+-+-+
とあり、四捨五入とは一言も書いていないため、厳密に言えば間違いではないですが、一般常識的観点からすれば、どう見てもバグですよね(笑)。
ちなみに、ワークシート関数のRoundのヘルプには、四捨五入すると書いてありました。

で、解決策としては、四捨五入する版のRound 関数を自作してみてはいかがでしょうか。
方法とかわからなければ、補足していただければ私が作ってもいいです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/01/04 23:34

 スペックだそうです。

MicrosoftのKnowledgeBassでもありました。丸めの方法で誤差を無くす為に結果が常に偶数になるようにしているみたいです。ISOかなんかでも認定されている方法らしいです。Excelだけに限らずAccessなどのVBAでも同じです。

 ワークシート上でも同様になるのならしょうがないかなとも思うんですが、なんか納得いかないですよね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2001/01/04 23:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報

カテゴリ