VBA Round関数で消費税の端数計算を完璧に!経理担当者必見の1円誤差回避術
経理業務に携わる皆様、消費税の端数計算で頭を悩ませた経験はありませんか? Excelシートで計算した結果と、VBAで組んだマクロの計算結果が「なぜか1円だけ違う…」そんな恐ろしい事態に直面したことはありませんか? 実は、その原因の多くはVBAのRound関数の意外な挙動にあります。この記事では、VBAのRound関数が引き起こす「銀行丸め」の落とし穴を徹底解説し、経理業務で求められる「正しい四捨五入」を確実に実現する実用的なコードをご紹介します。もう、1円の誤差で悩む日々は終わりにしましょう!
実務でコピペ!正しい消費税端数計算VBAコード
まずは、VBAのRound関数がどのように動作し、いかにして「一般的な四捨五入」を実現するかを比較するコードをご覧ください。このコードをVBAエディタに貼り付けて実行し、イミディエイトウィンドウ(Ctrl+G)で結果を確認してください。
Sub 消費税端数計算_正しい丸め方()
Dim 計算値 As Double
' -----------------------------------------------------------------
' ◆ VBAの標準Round関数は「銀行丸め(偶数丸め)」です!
' 経理で期待される「四捨五入」とは異なるので注意!
' -----------------------------------------------------------------
Debug.Print "--- VBA.Round関数の動作(銀行丸め) ---"
計算値 = 2.5
Debug.Print "VBA.Round(" & 計算値 & ", 0) の結果: " & Round(計算値, 0) ' 期待は3、実際は2
計算値 = 3.5
Debug.Print "VBA.Round(" & 計算値 & ", 0) の結果: " & Round(計算値, 0) ' 期待は4、実際は4 (たまたま一致)
計算値 = 1234.5 ' 消費税計算でよくある例
Debug.Print "VBA.Round(" & 計算値 & ", 0) の結果: " & Round(計算値, 0) ' 期待は1235、実際は1234
Debug.Print "---------------------------------------"
' -----------------------------------------------------------------
' ◆ 【推奨】経理で求められる「一般的な四捨五入」を実現する方法
' -----------------------------------------------------------------
Debug.Print "--- 経理向け「正しい四捨五入」の実現 ---"
' 方法1: ExcelのROUND関数をVBAから呼び出す(最も簡単で確実)
' Excelシート上のROUND関数と同じ挙動をします。
Dim 消費税額_Excel方式 As Double
消費税額_Excel方式 = 2.5
Debug.Print "ExcelのROUND関数 (2.5) で処理: " & Application.WorksheetFunction.Round(消費税額_Excel方式, 0) ' -> 3
消費税額_Excel方式 = 3.5
Debug.Print "ExcelのROUND関数 (3.5) で処理: " & Application.WorksheetFunction.Round(消費税額_Excel方式, 0) ' -> 4
消費税額_Excel方式 = 1234.5
Debug.Print "ExcelのROUND関数 (1234.5) で処理: " & Application.WorksheetFunction.Round(消費税額_Excel方式, 0) ' -> 1235
Debug.Print "---------------------------------------"
' 方法2: 自作の四捨五入関数を使用する(応用が利き、外部依存がない)
' 消費税は通常正の数なので、このシンプル版で十分です。
Dim 消費税額_自作方式 As Double
消費税額_自作方式 = 2.5
Debug.Print "自作関数 (2.5) で処理: " & 正しい四捨五入(消費税額_自作方式) ' -> 3
消費税額_自作方式 = 3.5
Debug.Print "自作関数 (3.5) で処理: " & 正しい四捨五入(消費税額_自作方式) ' -> 4
消費税額_自作方式 = 1234.5
Debug.Print "自作関数 (1234.5) で処理: " & 正しい四捨五入(消費税額_自作方式) ' -> 1235
End Sub
' 【自作関数】0.5を切り上げる一般的な四捨五入
' 消費税計算で負の数を扱うことは稀なので、正の数に特化したシンプルな実装です。
Function 正しい四捨五入(ByVal 数値 As Double) As Long
正しい四捨五入 = Int(数値 + 0.5)
End Function
解説:VBAのRound関数が引き起こす「銀行丸め」の落とし穴と回避策
先ほどのコードを実行してみて、VBAのRound関数の結果に驚かれた方もいるかもしれません。特にRound(2.5, 0)が2になったこと。これは、VBAのRound関数が「銀行丸め(偶数丸め)」という丸め方を採用しているためです。
- 銀行丸め(偶数丸め)とは?
端数がちょうど0.5の場合、その値を最も近い偶数に丸めるルールです。
例:2.5 → 2 (2は偶数)
例:3.5 → 4 (4は偶数)
この丸め方は統計的な偏りを減らす目的で使われますが、経理業務で一般的に使われる「四捨五入(0.5は切り上げ)」とは異なります。 - ExcelのROUND関数との違い
Excelのワークシート関数であるROUNDは、0.5を切り上げる「一般的な四捨五入」を行います。
例:ROUND(2.5, 0) → 3
例:ROUND(3.5, 0) → 4
この違いこそが、VBAのマクロとExcelシートの結果がズレて「1円の誤差」を生む原因なのです。
【警告!】1円の誤差は経理上の大問題!
たかが1円、されど1円。消費税の計算におけるわずかな誤差は、帳簿の不一致、監査での指摘、さらには企業会計の信頼性に関わる重大な問題に発展する可能性があります。VBAで消費税計算を自動化する際は、必ず正しい丸め方を採用してください。
「正しい四捨五入」を実現する2つの回避方法
-
Application.WorksheetFunction.Roundを使う
これが最も簡単で推奨される方法です。VBAからExcelのワークシート関数を呼び出すことで、Excelシートで普段使っているROUND関数と全く同じ挙動を実現できます。VBAのRound関数と異なり、Application.WorksheetFunction.Round(2.5, 0)は期待通り3を返します。 -
自作の四捨五入関数を使う
上記コードで紹介した正しい四捨五入関数のように、自分で四捨五入のロジックを実装する方法です。消費税計算のように常に正の数を扱う場合は、Int(数値 + 0.5)が最もシンプルで効果的です。この方法は、Excelアプリケーションへの依存がないため、よりポータブルなコードになります。
まとめ:正確な消費税計算で経理業務の信頼性を高める
VBAのRound関数が「銀行丸め」であるという特性は、見落とされがちな落とし穴です。しかし、この知識と適切な回避策を知っていれば、もう1円の誤差に悩まされることはありません。
- VBAの標準
Round関数は「銀行丸め(偶数丸め)」。 - Excelの
ROUND関数は「一般的な四捨五入(0.5は切り上げ)」。 - 経理で使うべきは、
Application.WorksheetFunction.Roundまたは自作の四捨五入関数。
今回ご紹介したコードと知識をぜひ日々の業務に活かし、正確で信頼性の高い消費税計算を実現してください。これにより、経理業務の効率化はもちろん、組織全体の会計の信頼性向上にも大きく貢献できるはずです。