エクセルVBA 数値の切り上げ、切り捨てをするときには注意が必要です。
ワークシート関数RoundUp、RoundDownを使う時に負の数が含まれていると、想定しない計算結果になることがあります。
こんにちは、じゅんぱ店長(@junpa33)です。
今回のテーマは、数値の「切り上げ」や「切り捨て」を行うワークシート関数の 「RoundUp関数」「RoundDown関数」についてです。
エクセルシートではお馴染みの関数だと思います。
先の記事の「Round関数」と合わせて参考にしてください。
コンテンツ
関数「RoundUpとRoundDown」の切り上げ、切り捨て
数値の「切り上げ」や「切り捨て」は先に説明しました「四捨五入」と同じようなシチュエーションで使われる場合かと思います。
金額計算に関係する場面、勤務時間計算の場面、販売量・生産量・品質評価値の計算などなど。
それだけ頻繁に使用機会のある「数値の計算手段」ではないでしょうか。
ここで紹介するのは、「RoundUp関数」「RoundDown関数」ですが、
同じような働きをするVBA関数に「Int関数」と「Fix関数」があります。
この「Int関数」と「Fix関数」は数値の整数部分だけ取り出す関数です。
処理する数値が負の数値であるときは、「RoundUp関数」「RoundDown関数」「Int関数」「Fix関数」それぞれにちょっと困った戻り値を吐き出してきます。
合わせて説明したいと思います。
- 「四捨五入」を行う「Round関数」についてはこちらの記事をご覧ください。
- 「Int関数」「Fix関数」について詳しくはこちらです。
- 乱数を発生させる「Rnd関数」について詳しくはこちらです。
「切り上げ」と「切り捨て(切り下げ)」の考え方
これから説明していく中で、「切り上げ」と「切り捨て(切り下げ)」の考え方について整理しておきたいと思います。
負の数(マイナス数字)に関しての「切り上げ」「切り捨て(切り下げ)」とは、それぞれの立場の違いや慣例的は側面などでも運用されているようです。
この記事でいう「切り上げ」と「切り捨て(切り下げ)」の考え方は、
数直線上で、「0を中心に」して「0に近づく」「0から離れる」という動きによって、
プラスの場合は、
「0に近づく」ことを切り捨てる(切り下げる)。
「0から離れる」ことを切り上げる。 とし
マイナスの場合は、
「0に近づく」ことを切り上げる。
「0から離れる」ことを切り捨てる(切り下げる)。と考えます。
まとめていうと、「数値が大きくなる事を切り上げ」「数値が小さくなることを切り捨て」とします。
ここでは、この意味で記事を読み進めてください。
数値の切り上げの「RoundUp関数」の構文
- WorksheetFunction . RoundUp ( 数値 , 桁数 )
「WorksheetFunction . 」は関数の前に必ずつけます。(接頭語のようなものです。)
Round関数の場合とは違って、RoundUp関数では「桁数」は省略できません。
数値の切り捨ての「RoundDown関数」の構文
- WorksheetFunction . RoundDown ( 数値 , 桁数 )
「WorksheetFunction . 」は関数の前に必ずつけます。(接頭語のようなものです。)
Round関数の場合とは違って、RoundDown関数では「桁数」は省略できません。
「RoundUp関数」「RoundDown関数」の切り方の注意点
「RoundUp関数」「RoundDown関数」の使い方を、「Int関数」「Fix関数」の場合も参考に説明したいと思います。
Rnd関数でランダムに100未満の8つの数値を取り出し、
4つの関数「RoundUp関数」「RoundDown関数」「Int関数」「Fix関数」で「切り上げ」や「切り捨て」処理を行います。
「Int関数」「Fix関数」については、戻り値が整数値になりますので、小数点以下のテストのケースでは対象外としています。
正の数に対して実行した場合
正の数に対する切り上げ
正の数に対する「切り上げ」はRoundUp関数のみとなります。
ここでは数値の中の小数点以下の部分を切り上げた値を戻します。
特に何の問題もなく戻り値を返しました。
Option Explicit
Sub RoundUp関数サンプル1()
Dim i As Long
Range("B2") = "ランダム値"
Range("C2") = "RoundUp関数"
Range("D2") = "Int関数"
Range("E2") = "Fix関数"
Columns.ColumnWidth = 14
Randomize
For i = 3 To 10
Cells(i, 2) = Rnd * 100
Cells(i, 3) = WorksheetFunction.RoundUp(Cells(i, 2), 0)
Next i
End Sub
正の数に対する切り捨て
正の数に対する「切り捨て」です。
ここでは数値の中の小数点以下の部分を切り捨てた値を戻します。
RoundDown関数以外に、Int関数、Fix関数でも行うことが出来ます。
ここでも特に何の問題もなく戻り値を返しました。
Sub RoundDown関数サンプル1()
Dim i As Long
Range("B2") = "ランダム値"
Range("C2") = "RoundDown関数"
Range("D2") = "Int関数"
Range("E2") = "Fix関数"
Columns.ColumnWidth = 14
Randomize
For i = 3 To 10
Cells(i, 2) = Rnd * 100
Cells(i, 3) = WorksheetFunction.RoundDown(Cells(i, 2), 0)
Cells(i, 4) = Int(Cells(i, 2))
Cells(i, 5) = Fix(Cells(i, 2))
Next i
End Sub
負の数に対して実行した場合
負の数に対する切り上げ
負の数に対する「切り上げ」ですが、切り上げを行う「RoundUp関数」だけでなく、
「切り捨て」の「Int関数」「Fix関数」についても見ていきます。
Sub RoundUp関数サンプル2()
Dim i As Long
Range("B12") = "ランダム値"
Range("C12") = "RoundUp関数"
Range("D12") = "Int関数"
Range("E12") = "Fix関数"
Columns.ColumnWidth = 14
Randomize
For i = 13 To 20
Cells(i, 2) = Rnd * -100
Cells(i, 3) = WorksheetFunction.RoundUp(Cells(i, 2), 0)
Cells(i, 4) = Int(Cells(i, 2))
Cells(i, 5) = Fix(Cells(i, 2))
Next i
End Sub
ランダム値の例えば、「-34.48602676」について、
「RoundUp関数」と「Int関数」は「-35」の値を戻しています。
これは、『「切り上げ」とは「数値が大きくなる事を切り上げ」』としたルールに反することになります。
つまりここでは、
- 「RoundUp関数」は数値を切り捨てを行った。
- 「Int関数」はその機能通り数値を切り捨てた。
- 「Fix関数」はその機能に反して数値の切り上げを行った。
ということになります。
負の数に対する切り捨て
Sub RoundDown関数サンプル2()
Dim i As Long
Range("B12") = "ランダム値"
Range("C12") = "RoundDown関数"
Range("D12") = "Int関数"
Range("E12") = "Fix関数"
Columns.ColumnWidth = 14
Randomize
For i = 13 To 20
Cells(i, 2) = Rnd * -100
Cells(i, 3) = WorksheetFunction.RoundDown(Cells(i, 2), 0)
Cells(i, 4) = Int(Cells(i, 2))
Cells(i, 5) = Fix(Cells(i, 2))
Next i
End Sub
ランダム値の例えば、「-68.00296021」について、
「RoundDown関数」と「Fix関数」は「-68」の値を戻しています。
これは、『「切り捨て」とは「数値が小さくなることを切り捨て」』としたルールに反することになります。
つまりここでは、
- 「RoundDown関数」は数値を切り上げを行った。
- 「Int関数」はその機能通り数値を切り捨てた。
- 「Fix関数」はその機能に反して数値の切り上げを行った。
ということになります。
負の数に対するRoundUpとDown関数比較
数値を負の数として、小数点以下第2位で丸めるように「切り上げ」「切り捨て」を見ていきます。
対象は「RoundUp関数」「RoundDown関数」についてです。
Sub RoundUpとDown関数比較()
Dim i As Long
Range("B22") = "ランダム値"
Range("C22") = "RoundUp関数"
Range("D22") = "RoundDown関数"
Columns.ColumnWidth = 14
Randomize
For i = 23 To 30
Cells(i, 2) = Rnd * -100
Cells(i, 3) = WorksheetFunction.RoundUp(Cells(i, 2), 2)
Cells(i, 4) = WorksheetFunction.RoundDown(Cells(i, 2), 2)
Next i
End Sub
ランダム値の例えば、「-48.64665985」について、
「RoundUp関数」は「-48.65」
「RoundDown関数」は「-48.64」の値を戻しています。
- 『「切り捨て」とは「数値が小さくなることを切り捨て」』ですので、「-48.65」の「RoundUp関数」が「切り捨て」
- 『「切り上げ」とは「数値が大きくなる事を切り上げ」』ですので、「-48.64」の「RoundDown関数」が「切り上げ」
を行ったということになります。
(実務的には)正の数と負の数が混在しての処理が必要
今までのテスト、特にマイナスの数値での戻り値の違いを考慮しなければいけない場合は、数値が正の数の場合と負の数の場合で条件分岐させる必要があります。
正負の数混載の切り上げ
テスト結果の通り、
負の数において、「切り上げ」は「RoundDown関数」が、
『「切り上げ」とは「数値が大きくなる事を切り上げ」』というルールに合っています。
したがって混在処理のVBAコード組み立てはこのようになります。
Sub 正の数負の数混在処理切り上げ()
Dim i As Long
Range("B12") = "ランダム値"
Range("C12") = "RoundUp関数"
Range("D12") = "RoundDown関数"
Range("E12") = "正負混在切り上げ値"
Columns.ColumnWidth = 14
Randomize
For i = 13 To 20
Cells(i, 2) = (0.5 - Rnd) * 100
Cells(i, 3) = WorksheetFunction.RoundUp(Cells(i, 2), 2)
Cells(i, 4) = WorksheetFunction.RoundDown(Cells(i, 2), 2)
Select Case Cells(i, 2)
Case Is < 0
Cells(i, 5) = WorksheetFunction.RoundDown _
(Cells(i, 2), 2)
Case Is >= 0
Cells(i, 5) = WorksheetFunction.RoundUp _
(Cells(i, 2), 2)
End Select
Next i
End Sub
正負の数混載の切り捨て
テスト結果の通り、
負の数において、「切り捨て」は「RoundUp関数」が、
『「切り捨て」とは「数値が小さくなることを切り捨て」』というルールに合っています。
したがって混在処理のVBAコード組み立てはこのようになります。
Sub 正の数負の数混在処理切り捨て()
Dim i As Long
Range("B22") = "ランダム値"
Range("C22") = "RoundUp関数"
Range("D22") = "RoundDown関数"
Range("E22") = "正負混在切り捨て値"
Columns.ColumnWidth = 14
Randomize
For i = 23 To 30
Cells(i, 2) = (0.5 - Rnd) * 100
Cells(i, 3) = WorksheetFunction.RoundUp(Cells(i, 2), 2)
Cells(i, 4) = WorksheetFunction.RoundDown(Cells(i, 2), 2)
Select Case Cells(i, 2)
Case Is >= 0
Cells(i, 5) = WorksheetFunction.RoundDown _
(Cells(i, 2), 2)
Case Is < 0
Cells(i, 5) = WorksheetFunction.RoundUp _
(Cells(i, 2), 2)
End Select
Next i
End Sub
RoundUp関数・RoundDown関数の数値切りの注意点まとめ
一口に「切り上げ」「切り捨て」と言っても、今回説明してきましたように、
その概念、みなさんが使っているルールによって、
特に負の数(マイナスの数)を扱う場合にはおかしなことになってしまいます。
【これは今27%引きの価格だけど、頑張って30%に切り下げた価格にしておきますよ。】
といったとき
- 「WorksheetFunction.RoundDown(-27 / 10, 0) * 10」
- 「WorksheetFunction.RoundUp(-27 / 10, 0) * 10」
どちらなの?
正解はRoundUpですが、お客様の損得にかかわってくる場合があります。
ちなみに、参考例とした「Int関数」「Fix関数」について、
マイナス数の場合は、「Fix関数」は切り上げに、「Int関数」は切り捨てに使うことが出来ます。
ちょっと、話が面倒くさかったですが、結構重要な部分ですので、よく理解をしておいていただければと思います。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。