エクセルVBAでも数値を四捨五入したい時は、ワークシート関数のRoundを利用することが多いです。
Round関数の使い方はワークシートと同様ですが、ただ大きな注意点があります。
ここではその注意点も含めて使い方の説明を行います。
こんにちは、じゅんぱ店長(@junpa33)です。
今回のテーマは、エクセルワークシート関数 「Round関数」についてです。
「Round関数」は、数値を四捨五入したい時に使う関数です。
エクセルシートでは、皆さんお馴染みの関数だと思います。
コンテンツ
Round関数の罠? 注意点とはどういうこと?
例えば、
金額計算時などに商品値引きや消費税計算をする場合は、必ずと言っていいほど小数点以下の数字が発生します。
そういった時は、皆さんほぼ必ず、金額マルメを行うでしょう。
そしてエクセルの計算式の中で働いてくれるのが、
「四捨五入」「切り上げ」「切り捨て」を行うエクセルワークシート関数の「Round関数」などです。
数値計算の関数の中で、SUM関数に並ぶ重要関数だと思います。
そんな有用な「Round関数」ではありますが、エクセルVBAで利用するにあたっては、
「いつものRound関数」「毒針のRound関数」の2種類が存在することも知っておきましょう。
「切り上げ」「切り捨て」については「RoundUp関数」「RoundDown関数」になります。
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 ( 数値 , [ 桁数 ] )
普通でない挙動とは
4以下を切り捨て、6以上を切り上げ、ちょうど真ん中の5の時はマルメた後の値が偶数になるようにする。
ということです。
「罠とは?」のテスト結果
マルメ計算するときに、整数値マルメならその下の小数点第1位、小数点第1位マルメならその下の小数点第2位という様に、
数値の最下位の桁をマルメの計算対象とする場合について
「4以下を切り捨て、6以上を切り上げ、ちょうど真ん中の5の時はマルメた後の桁の値が偶数になるようにする。」
という挙動をするようです。
いずれにしても、普段使いはしないと思いますので、近づかないでおきましょう。
毒針Round関数への対策
対策としては、
関数名の前に必ず、『「WorksheetFunction . 」は関数の前に必ずつけます。』を実行することです。
これで、Round関数の毒を消すことが出来ます。
ワークシート関数「Round関数」の使い方
ワークシート関数の「Round関数」について使い方のサンプルで説明していきます。
四捨五入計算の方法
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円
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コード記述で、『[ 桁数 ]をマイナスにする』ことに違和感を感じる場合は、
次のようなコード記述も可能です。
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.」を先頭に付けることを覚えておきましょう。
「切り上げ」「切り捨て」については「RoundUp関数」「RoundDown関数」
になりますが、詳しくはこちらの記事をご覧ください。
RoundUpとRoundDown関数の使い方。数値の切り方に注意エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。