質問

以前の質問)とVBAソリューションを選択しました。上記のアプリケーションを使用する過程で、値0.5の結果が正しくないことに気付きました。ワークシートのラウンド関数は1を返しますが、VBAラウンド関数は1.5を返します2 VBAの代わりにワークシート関数を使用する必要がありました。

何かが足りませんか?

役に立ちましたか?

解決

これは既知の問題です。 VBA Round()関数はBankerの丸めを使用し、スプレッドシートセル関数は算術丸めを使用します。ここで詳細を確認してください:

PRB:VBA 6とExcelスプレッドシートで異なるラウンド関数

Microsoftが提案する回避策は、目的の結果を得るためにカスタム関数を作成することです。

銀行家の四捨五入は常に0.5を最も近い偶数の数値に四捨五入し、会計の標準であるため、Excelはそのように動作します。 算術丸めは、0.5を次の数に切り上げます。

他のヒント

Microsoftのせいにすることができます: http://support.microsoft.com/kb/194983

これを回避する方法のリストを次に示します。 http://www.excelforum.com/excel-programming/401104-worksheet-rounding-vs-vba-rounding.html

質問は完全にこちらに回答し、ここにコピーしました(by著者の許可:):

VBA Round関数は、Bankerの丸めを使用し、0.5を偶数に丸めます。次のように注意してください:

Round (12.55, 1) would return 12.6 (rounds up) 
Round (12.65, 1) would return 12.6 (rounds down) 
Round (12.75, 1) would return 12.8 (rounds up)   

Excel Worksheet Function Roundは、常に0.5を切り上げます。

いくつかのテストを行ったところ、0.55の切り上げ(対称の丸め)がセルの書式設定にも使用され、列幅の丸めにも使用されるようです(一般的な数値形式を使用する場合)。 「表示されたままの精度」フラグは、それ自体で丸めを行うようには見えません。セル形式の丸められた結果を使用するだけです。

丸めのためにMicrosoftのSymArith関数をVBAに実装しようとしましたが、Fixに58.55などの数値を指定しようとするとエラーが発生することがわかりました。 58.6ではなく58.5の結果を与える関数。そして、ようやくExcel Worksheet Round関数を使用できることを発見しました。

  

Application.Round(58.55、1)

これにより、VBAで通常の丸めを行うことができますが、カスタム関数ほど高速ではない場合があります。これは質問から完全に一巡したことを理解していますが、完全を期すためにそれを含めたかったのです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top