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

vbaroundeyecatch

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

 

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

 

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

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

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

 

Round関数の毒針とは、注意点とはどういうもの?

 

例えば、

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

 

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

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

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

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

 

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

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

 

MEMO

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

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

エクセルVBA 数値の切り上げ、切り捨てに要注意「RoundUpとRoundDown関数」

 

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

 

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

 

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

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

 

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

[ 桁数 ] は、

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

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

桁数 -3 -2 -1 0 1 2 3
四捨五入桁 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位という様に、

数値の最下位の桁をマルメの計算対象とする場合について

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

という挙動をするようです。

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

vbaround001a

毒針Round関数への対策

対策としては、

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

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

 

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

 

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

 

四捨五入計算の方法

 

ワークシート関数Round関数サンプル1

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

vbaround002a

 

コード

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

 

ワークシート関数Round関数サンプル2
[ 桁数 ]をマイナスにすることで、数値の整数部分の四捨五入(数値マルメ)を行うことが出来ます。

コード

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

 

ワークシート関数Round関数サンプル3

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関数の毒針対策と使い方のまとめ

 

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

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

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

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

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

 

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

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

 

MEMO

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

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

エクセルVBA 数値の切り上げ、切り捨てに要注意「RoundUpとRoundDown関数」

 

エクセルVBAの基礎を学びなおすために

 

vbastudyeyecatch002 エクセルVBAを独学で習得する!ために大切な7つのポイントを解説します

一つの覚え間違いや思い込みでコードエラーが発生することが多々あります。

「え?こんなコト」があまり起こらないように、

基礎部分は、何度も復習見直ししておくことも必要かもしれません。

 

エクセルVBAの基礎部分の学ぶ方についての記事をUPしていますので参考にしてください。

 

エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習で良質な参考書を7冊選ぶ。良書との出会いは大切です

 

エクセルVBAの独習には動画学習という方法もあります。 目と耳両方を使って学習することでさらに勉強効率を上げることもできると思います。
エクセルVBA初級者がUdemyで動画学習する講座おすすめ5選と無料講座の上手な使い方。

 

「VBA最速理解」の記事一覧を開く

 

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

 

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