Round関数の罠。VBAで数値を四捨五入する時の注意点

vbaroundeyecatch

エクセルVBAでも数値を四捨五入したい時は、ワークシート関数のRoundを利用することが多いです。
Round関数の使い方はワークシートと同様ですが、ただ大きな注意点があります。
ここではその注意点も含めて使い方の説明を行います。

こんにちは、じゅんぱ店長(@junpa33)です。

今回のテーマは、エクセルワークシート関数 「Round関数」についてです。

「Round関数」は、数値を四捨五入したい時に使う関数です。

エクセルシートでは、皆さんお馴染みの関数だと思います。

Round関数の罠? 注意点とはどういうこと?

vbaroundp004

例えば、

金額計算時などに商品値引きや消費税計算をする場合は、必ずと言っていいほど小数点以下の数字が発生します。

そういった時は、皆さんほぼ必ず、金額マルメを行うでしょう。

そしてエクセルの計算式の中で働いてくれるのが、

「四捨五入」「切り上げ」「切り捨て」を行うエクセルワークシート関数の「Round関数」などです。

数値計算の関数の中で、SUM関数に並ぶ重要関数だと思います。

そんな有用な「Round関数」ではありますが、エクセルVBAで利用するにあたっては、

「いつものRound関数」「毒針のRound関数」の2種類が存在することも知っておきましょう。

「切り上げ」「切り捨て」については「RoundUp関数」「RoundDown関数」になります。

vbaroundupdowneyecatch RoundUpとRoundDown関数の使い方。数値の切り方に注意

「いつものRound関数」の構文

「いつものRound関数」つまり「ワークシート関数の方のRound関数」です。

ワークシート関数のRound関数

  • WorksheetFunction . Round ( 数値 , [ 桁数 ] )

「WorksheetFunction . 」は関数の前に必ずつけます。(接頭語のようなものです。)[ 桁数 ] は、

どの位置で四捨五入するかを指定します。

整数値で指定しますが、0の戻り値整数値をセンターに、正の整数の場合は小数点以下何位か、負の整数の場合は小数点以上何位かを表します。

桁数-3-2-10123
四捨五入桁100の位
(100の位以下は常に0)
10の位
(10の位以下は常に0)
1の位
(1の位は常に0)
整数値小数点第1位小数点第2位小数点第3位

省略することもできます。省略の場合は、整数値になるように四捨五入処理をします。

注意点「罠があるRound関数」の構文

「罠があるRound関数」つまりVB由来の関数で、エクセルシートではほぼ無縁の関数です。

通常のエクセル計算概念とは違って挙動が変則です。

(実際にコードとして成立しているので、何かの存在理由があるのでしょう)

でも、VBAでコード記述すると、普通に作動してしまいます。構文は取違いやすいので十分注意しましょう。

毒針のRound関数

  • Round ( 数値 , [ 桁数 ] )
[ 桁数 ] は、0以上の整数値

普通でない挙動とは

4以下を切り捨て、6以上を切り上げ、ちょうど真ん中の5の時はマルメた後の値が偶数になるようにする。

ということです。

「罠とは?」のテスト結果

マルメ計算するときに、整数値マルメならその下の小数点第1位小数点第1位マルメならその下の小数点第2位という様に、

いずれにしても、普段使いはしないと思いますので、近づかないでおきましょう。

vbaround001a

毒針Round関数への対策

対策としては、

関数名の前に必ず、『「WorksheetFunction . 」は関数の前に必ずつけます。』を実行することです。

これで、Round関数の毒を消すことが出来ます。

ワークシート関数「Round関数」の使い方

vbaroundp005

ワークシート関数の「Round関数」について使い方のサンプルで説明していきます。

四捨五入計算の方法

商品Aの単品価格が設定されています。
まとめ買いで5個の場合と大人買いの11個の場合の価格値引きで、
「単品での値引きx個数」と「個数合計価格x値引き」の販売価格の違いを調べます。

vbaround002a
VBA
Sub ワークシート関数Round関数サンプル1()
'単品価格マルメ0.85
        Range("D5") = Range("D3") * 0.85
        Range("E5") = WorksheetFunction.Round(Range("D5"), 0)
        Range("G5") = Range("E5") * 5
'合計価格マルメ0.85
        Range("D6") = Range("D3") * 0.85
        Range("E6") = Range("D6")
        Range("G6") = WorksheetFunction.Round(Range("E6") * 5, 0)
'単品価格マルメ0.68
        Range("D8") = Range("D3") * 0.68
        Range("E8") = WorksheetFunction.Round(Range("D8"), 0)
        Range("G8") = WorksheetFunction.Round(Range("E8") * 11.5, 0)
'合計価格マルメ0.68
        Range("D9") = Range("D3") * 0.68
        Range("E9") = Range("D9")
        Range("G9") = WorksheetFunction.Round(Range("E9") * 11.5, 0)
End Sub

どちらの価格ポリシーを採用するかはお店次第ですか、

計算方式で、微妙に価格差異が発生しています。

構文に基づく記述方法ですが、四捨五入桁数「0」は省略せずに記述しています。(視認性のための記述の統一)

端数金額のマルメ計算

ワークシート関数Round関数では、

販売価格や時給支払いなどでもよく使う、端数マルメを行うことが出来ます。

例題

PCプリンター販売価格を、価格改定に付き十円の桁より端数マルメを行う

PCプリンター販売価格は、C社29,885円 E社19,835円 B社22.898円

vbaround003a
[ 桁数 ]をマイナスにすることで、数値の整数部分の四捨五入(数値マルメ)を行うことが出来ます。
VBA
Sub ワークシート関数Round関数サンプル2()
    Dim i As Long
        For i = 4 To 6
          Range("D" & i) = WorksheetFunction.Round(Range("C" & i), -2)
        Next i
End Sub
こういう方法もあります

VBAコード記述で、『[ 桁数 ]をマイナスにする』ことに違和感を感じる場合は、

次のようなコード記述も可能です。

VBA
Sub ワークシート関数Round関数サンプル3()
    Dim i As Long
        For i = 4 To 6
          Range("E" & i) = WorksheetFunction.Round( _
                Range("C" & i) / 100, 0) * 100
        Next i
End Sub

慣れ不慣れの問題ですが、Round関数は小数点以下を四捨五入の認識が強い人には、こちらの方が分かり易いのではないでしょうか。

Round関数の罠対策と使い方のまとめ

vbaroundp006

エクセルシートで非常に使い慣れた「Round関数」ですので、

エクセルVBAでも利用したいと思ってコード記述して動かしてみたら、

「使えるでしょ」となります。

でもそこで単に、「Round(〇〇,0)とか」記述しただけなら、

ある一定条件を満たした時には、戻り値として異常値を吐き出します。

エクセルシートで使っている関数を、エクセルVBAで利用したい時は

必ず「WorksheetFunction.」を先頭に付けることを覚えておきましょう。

参考記事

「切り上げ」「切り捨て」については「RoundUp関数」「RoundDown関数」

になりますが、詳しくはこちらの記事をご覧ください。

vbaroundupdowneyecatch RoundUpとRoundDown関数の使い方。数値の切り方に注意

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。

vbastudyeyecatch2 エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です

今回の記事はここまでです。   最後までご覧いただき有難うございました。

エクセルVBA最速理解で必要な知識を集めよう!

エクセルVBA業務ツールで日常の業務改善を行いましょう。

VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。

アンケートでポイ活しよう!!

アンケートに答えれば答えるほど ”使える” ポイントがたまります。

NTTコム サーチ

af_banner01

Dstyle web

dstyleweb_logo
dstyle_320x50-min