VBA(Visual Basic for Applications)の組み込み関数 Round
は、数値を指定した小数点以下の桁数に四捨五入するための関数です。しかし、Excelのワークシート関数 ROUND
と異なり、VBA の Round
は 「銀行丸め(Banker’s Rounding)」という特有の丸め方式を採用しているため、特に「.5」の処理に関して誤解や混乱が起きやすい関数でもあります。
■ 1. Round関数の概要
Round
関数は、与えられた数値を指定した小数点以下の桁数に丸める関数です。通常の四捨五入と思われがちですが、実際には「偶数丸め(Banker’s Rounding)」という統計的に偏りのない丸め方式を採用しており、これが Excel の ROUND
関数との最大の違いです。
■ 2. 構文と使用方法
Round(expression, [numdecimalplaces])
パラメータ:
expression
: 丸めたい数値(必須)numdecimalplaces
: 小数点以下の桁数(省略可能、既定値は0)
戻り値:
- 指定された小数点以下の桁数に四捨五入された値(
Double
型)
■ 3. 基本例
例1:整数への四捨五入
MsgBox Round(2.4) ' → 2
MsgBox Round(2.5) ' → 2 (←ここが重要!)
MsgBox Round(3.5) ' → 4
この挙動に驚いた方も多いかもしれません。Round(2.5)
が「2」になるのは、Banker’s Rounding だからです。
■ 4. Banker’s Rounding(偶数丸め)とは?
通常の四捨五入(いわゆる算術丸め)では、「5以上は切り上げ、未満は切り捨て」というルールに従います。一方、Banker’s Rounding(偶数丸め)では、端数が正確に.5のときに、最も近い偶数に丸めるというルールが採用されます。
例:
入力値 | 算術丸め | Banker’s Rounding (VBAのRound) |
---|---|---|
2.5 | 3 | 2 |
3.5 | 4 | 4 |
4.5 | 5 | 4 |
5.5 | 6 | 6 |
これは、統計的に丸め誤差を最小限に抑えるために採用されている手法であり、金融・会計などで使われることもあります。
■ 5. 少数点以下の桁指定
例:
MsgBox Round(3.456, 2) ' → 3.46
MsgBox Round(3.454, 2) ' → 3.45
MsgBox Round(3.455, 2) ' → 3.46(5のときは偶数方向)
MsgBox Round(3.465, 2) ' → 3.46
■ 6. 他の関数との比較
関数 | 丸め方式 | 特徴 |
---|---|---|
Round (VBA) | 偶数丸め | デフォルトで Banker’s Rounding |
WorksheetFunction.Round | 算術丸め | Excelワークシートと同じ処理 |
Fix | 小数点以下切り捨て | 0方向に切り捨て |
Int | 小さい方向に切り捨て | 負の数に注意 |
FormatNumber | 表示上の丸め | 数値は変化しない |
■ 7. WorksheetFunction.Roundとの違い
VBAで Excel ワークシートの ROUND
関数を使いたい場合は WorksheetFunction
を使います。
MsgBox Application.WorksheetFunction.Round(2.5, 0) ' → 3
MsgBox Round(2.5, 0) ' → 2(VBAのRound関数)
同じ「Round」でも挙動が異なるため、使用目的に応じて使い分けが重要です。
■ 8. 応用例
● 金額の端数処理(消費税など)
Dim 金額 As Double
金額 = 1234.5678
MsgBox Round(金額, 2) ' → 1234.57
● 統計データの集計時の丸め誤差削減
大量のデータに四捨五入を繰り返すと、偏りが累積します。Banker’s Rounding はこの問題を軽減するため、集計業務で有効です。
■ 9. 注意点
● .5の扱いに注意!
Round(2.5)
が 3
ではなく 2
になるのは、VBAにおける最も混乱されがちな仕様です。この挙動は意図的であり、誤りではありません。
もし常に「5以上は切り上げ」にしたい場合は、独自の四捨五入関数を定義する必要があります。
独自四捨五入関数の例:
Function NormalRound(val As Double, Optional digits As Integer = 0) As Double
NormalRound = Int(val * 10 ^ digits + 0.5) / 10 ^ digits
End Function
' 使用例
MsgBox NormalRound(2.5) ' → 3
■ 10. 使用場面のまとめ
使用場面 | Round関数の利点 |
---|---|
金融業務 | 偶数丸めにより誤差が分散される |
データ分析 | 大量のデータの平均・合計で精度確保 |
小数処理 | 小数桁数の明確な調整 |
見積・請求処理 | 金額の見た目を整える |
■ 11. まとめ
VBAの Round
関数は、単なる四捨五入ではなく、「偶数丸め(Banker’s Rounding)」という方式を採用した高度な丸め関数です。このため、見慣れた「.5 → 切り上げ」とは異なる結果になる点に注意が必要です。
- 「誤差を偏らせない」ことを目的とした設計であり、金融・統計・科学計算などに適している。
- Excelとの互換性を求める場合は
WorksheetFunction.Round
を使用する。 - 独自の四捨五入が必要であれば、カスタム関数を作成する。
VBAの Round
を正しく理解し、使いこなすことで、より正確かつ意図通りの数値処理が可能になります。