AccessのRoundは特定条件で四捨五入にならないので注意(ExcelのRoundとは違う)


ExcelのRound

まず最初に、ExcelはRoundに第二引数が必要です。(この時点でAccessのRoundと違ってる)
んでもって結果は下記。

=ROUND(0.4,0) の結果は 0 (画像割愛)
=ROUND(1.4,0) の結果は 1 (画像割愛)

四捨五入。

AccessのRound

下記の結果は…

Debug.Print "0.5をRoundすると " & Round(0.5)
Debug.Print "1.5をRoundすると " & Round(1.5)

0.5を通した場合、四捨五入で 1 になるかと思いきや 0 になっています。

AccessでのRoundの厄介なところは、 端数が0.5の時だけ 偶数に近くなるように丸められるということです…。

下記の結果はどうかというと…

Debug.Print "0.6をRoundすると " & Round(0.6)
Debug.Print "1.6をRoundすると " & Round(1.6)

四捨五入です…。

テストデータの値が閾値になっていないとバグがテストをすり抜ける可能性があります。

AccessでRoundを使わずに小数点第一位を四捨五入

0.5を足して小数点を切り捨てるInt()を通す。

Int(四捨五入対象 + 0.5)

下記の結果は…

Dim test_ As Double

test_ = 0.4
Debug.Print test_ & "の時は" & Int(test_ + 0.5)

test_ = 0.5
Debug.Print test_ & "の時は" & Int(test_ + 0.5)

test_ = 0.6
Debug.Print test_ & "の時は" & Int(test_ + 0.5)

test_ = 1.4
Debug.Print test_ & "の時は" & Int(test_ + 0.5)

test_ = 1.5
Debug.Print test_ & "の時は" & Int(test_ + 0.5)

test_ = 1.6
Debug.Print test_ & "の時は" & Int(test_ + 0.5)

四捨五入です。

Accessで小数点〇桁を四捨五入したい時の注意点

小数点〇桁もRoundを使わずに四捨五入しようとしたらつまずきました。
『 * 』で一旦桁を上げてInt()四捨五入 ⇒ 『 / 』で桁下げる
なんて感じで任意の桁の小数点四捨五入ができると思っていました。

Dim test_ As Double
test_ = 1.15

'【1】
'1.15の小数点第二位を四捨五入したい
'(結果は1.2にならない)
Debug.Print Int(test_ * 10 + 0.5) / 10

'【2】
'1.15の小数点第二位を四捨五入したい'
'桁を上げる段階でCDbl()を通す
'(結果は1.2になる)
Debug.Print Int(CDbl(test_ * 10) + 0.5) / 10

'【3】
'1.15の小数点第二位を四捨五入したい'
'1ステップずつ結果を変数に格納
'(結果は1.2になる)
test_ = test_ * 10
test_ = test_ + 0.5
Debug.Print Int(test_) / 10

実行結果は下記。

コンパイルする時に何か最適化していて、その影響で結果が違うのかなあ…(´・ω・`)

ひとまず対象の値を一旦文字列にキャストして、 ドット を元に整数部と小数部を分けて……
みたいな愚直な自作関数を作って対応しました…(´・ω・`)

参考サイトさん

バージョン

Windows10 Pro バージョン20H2 OSビルド19042.685
Access for Microsoft 365 MSO(16.0.13426.20270)32ビット
Excel for Microsoft 365 MSO(16.0.13426.20270)32ビット