wanna.jp VBAリファレンス
Top > VBA関数リファレンス > VBA Roundの使い方

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円の誤差」を生む原因なのです。

「正しい四捨五入」を実現する2つの回避方法

  1. Application.WorksheetFunction.Round を使う
    これが最も簡単で推奨される方法です。VBAからExcelのワークシート関数を呼び出すことで、Excelシートで普段使っているROUND関数と全く同じ挙動を実現できます。VBAのRound関数と異なり、Application.WorksheetFunction.Round(2.5, 0) は期待通り3を返します。
  2. 自作の四捨五入関数を使う
    上記コードで紹介した正しい四捨五入関数のように、自分で四捨五入のロジックを実装する方法です。消費税計算のように常に正の数を扱う場合は、Int(数値 + 0.5)が最もシンプルで効果的です。この方法は、Excelアプリケーションへの依存がないため、よりポータブルなコードになります。

まとめ:正確な消費税計算で経理業務の信頼性を高める

VBAのRound関数が「銀行丸め」であるという特性は、見落とされがちな落とし穴です。しかし、この知識と適切な回避策を知っていれば、もう1円の誤差に悩まされることはありません。

  • VBAの標準Round関数は「銀行丸め(偶数丸め)」。
  • ExcelのROUND関数は「一般的な四捨五入(0.5は切り上げ)」。
  • 経理で使うべきは、Application.WorksheetFunction.Roundまたは自作の四捨五入関数。

今回ご紹介したコードと知識をぜひ日々の業務に活かし、正確で信頼性の高い消費税計算を実現してください。これにより、経理業務の効率化はもちろん、組織全体の会計の信頼性向上にも大きく貢献できるはずです。

VBAでの業務効率化、悩み解決します

「このマクロ、もっと速くならないかな?」「エラーが消えない…」
Access/VBA専門のwanna.jpにご相談ください。

無料相談はこちら