RoundUpとRoundDown関数の使い方。数値の切り方に注意が必要です

vbaroundupdowneyecatch

エクセルVBA 数値の切り上げ、切り捨てをするときには注意しなければいけません。
RoundUp関数とRoundDown関数を使う時に負の数が混在していると、そのままだと誤った計算結果になることがあります。

 

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

 

今回のテーマは、数値の「切り上げ」や「切り捨て」を行うことの出来る

エクセルワークシート関数 「RoundUp関数」「RoundDown関数」についてです。

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

先の記事の「Round関数」と合わせて参考にしてください。

 

「RoundUp関数」「RoundDown関数」の
数値の切り上げ、切り捨て

 

数値の「切り上げ」や「切り捨て」は先に説明しました「四捨五入」と同じようなシチュエーションで使われる場合かと思います。

金額計算に関係する場面、勤務時間計算の場面、販売量・生産量・品質評価値の計算などなど。

それだけ頻繁に使用機会のある「数値の計算手段」ではないでしょうか。

 

ここで紹介するのは、「RoundUp関数」「RoundDown関数」ですが、

同じような働きをするVBA関数に「Int関数」と「Fix関数」があります。

この「Int関数」と「Fix関数」は数値の整数部分だけ取り出す関数です。

処理する数値が負の数値であるときは、「RoundUp関数」「RoundDown関数」「Int関数」「Fix関数」それぞれにちょっと困った戻り値を吐き出してきます。

合わせて説明したいと思います。

MEMO

「四捨五入」を行う「Round関数」についてはこちらの記事をご覧ください。

エクセルVBA 数値を四捨五入したい時のRound関数の使い方と注意点

「Int関数」「Fix関数」について詳しくはこちらです。

エクセルVBA 関数 Int・Fix・Abs・Signで数値の整数部分を完全に分離する

乱数を発生させる「Rnd関数」について詳しくはこちらです。

エクセルVBA Rnd関数で乱数を取得。簡単な加工コードで発生値を変化させる

 

「切り上げ」と「切り捨て(切り下げ)」の考え方

 

これから説明していく中で、「切り上げ」と「切り捨て(切り下げ)」の考え方について整理しておきたいと思います。

負の数(マイナス数字)に関しての「切り上げ」「切り捨て(切り下げ)」とは、それぞれの立場の違いや慣例的は側面などでも運用されているようです。

この記事でいう「切り上げ」と「切り捨て(切り下げ)」の考え方は、

数直線上で、「0を中心に」して「0に近づく」「0から離れる」という動きによって、

プラスの場合は、

「0に近づく」ことを切り捨てる(切り下げる)。

「0から離れる」ことを切り上げる。 とし

 

マイナスの場合は、

「0に近づく」ことを切り上げる。

「0から離れる」ことを切り捨てる(切り下げる)。と考えます。

 

まとめていうと、「数値が大きくなる事を切り上げ」「数値が小さくなることを切り捨て」とします。

ここでは、この意味で記事を読み進めてください。

 

数値の切り上げの「RoundUp関数」の構文

 

RoundUp関数の構文

  • WorksheetFunction . RoundUp ( 数値 , 桁数  )

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

Round関数の場合とは違って、RoundUp関数では「桁数」は省略できません。

 

数値の切り捨ての「RoundDown関数」の構文

 

RoundDown関数の構文

  • WorksheetFunction . RoundDown ( 数値 , 桁数  )

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

Round関数の場合とは違って、RoundDown関数では「桁数」は省略できません。

 

「RoundUp関数」「RoundDown関数」の切り方の注意点

 

「RoundUp関数」「RoundDown関数」の使い方を、「Int関数」「Fix関数」の場合も参考に説明したいと思います。

テスト概要

 

Rnd関数でランダムに100未満の8つの数値を取り出し、

4つの関数「RoundUp関数」「RoundDown関数」「Int関数」「Fix関数」で「切り上げ」や「切り捨て」処理を行います。

「Int関数」「Fix関数」については、戻り値が整数値になりますので、小数点以下のテストのケースでは対象外としています。

 

正の数に対して実行した場合

 

正の数に対する切り上げ

正の数に対する「切り上げ」はRoundUp関数のみとなります。

ここでは数値の中の小数点以下の部分を切り上げた値を戻します。

特に何の問題もなく戻り値を返しました。

コード

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

vbaroundupdown001a

 

正の数に対する切り捨て

正の数に対する「切り捨て」です。

ここでは数値の中の小数点以下の部分を切り捨てた値を戻します。

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

vbaroundupdown002a

 

負の数に対して実行した場合

 

負の数に対する切り上げ

負の数に対する「切り上げ」ですが、切り上げを行う「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

vbaroundupdown003a

ランダム値の例えば、「-34.48602676」について、

「RoundUp関数」と「Int関数」は「-35」の値を戻しています。

これは、『「切り上げ」とは「数値が大きくなる事を切り上げ」』としたルールに反することになります。

つまりここでは、

  • 「RoundUp関数」は数値を切り捨てを行った。
  • 「Int関数」はその機能通り数値を切り捨てた。
  • 「Fix関数」はその機能に反して数値の切り上げを行った。

ということになります。

vbaroundupdown004a

 

 

負の数に対する切り捨て
コード

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

vbaroundupdown005a

 

ランダム値の例えば、「-68.00296021」について、

「RoundDown関数」と「Fix関数」は「-68」の値を戻しています。

これは、『「切り捨て」とは「数値が小さくなることを切り捨て」』としたルールに反することになります。

つまりここでは、

  • 「RoundDown関数」は数値を切り上げを行った。
  • 「Int関数」はその機能通り数値を切り捨てた。
  • 「Fix関数」はその機能に反して数値の切り上げを行った。

ということになります。

vbaroundupdown006

 

負の数に対する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

vbaroundupdown007a

 

ランダム値の例えば、「-48.64665985」について、

「RoundUp関数」は「-48.65」

「RoundDown関数」は「-48.64」の値を戻しています。

  • 『「切り捨て」とは「数値が小さくなることを切り捨て」』ですので、「-48.65」の「RoundUp関数」が「切り捨て」
  • 『「切り上げ」とは「数値が大きくなる事を切り上げ」』ですので、「-48.64」の「RoundDown関数」が「切り上げ」

を行ったということになります。

vbaroundupdown008

 

 

(実務的には)正の数と負の数が混在しての処理が必要

 

今までのテスト、特にマイナスの数値での戻り値の違いを考慮しなければいけない場合は、数値が正の数の場合と負の数の場合で条件分岐させる必要があります。

 

正負の数混載の切り上げ

テスト結果の通り、

負の数において、「切り上げ」は「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

vbaroundupdown009a

 

正負の数混載の切り捨て

テスト結果の通り、

負の数において、「切り捨て」は「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

vbaroundupdown010a

 

RoundUp関数・RoundDown関数の数値切りの注意点まとめ

 

一口に「切り上げ」「切り捨て」と言っても、今回説明してきましたように、

その概念、みなさんが使っているルールによって、

特に負の数(マイナスの数)を扱う場合にはおかしなことになってしまいます。

【これは今27%引きの価格だけど、頑張って30%に切り下げた価格にしておきますよ。】

といったとき

  • 「WorksheetFunction.RoundDown(-27 / 10, 0) * 10」
  • 「WorksheetFunction.RoundUp(-27 / 10, 0) * 10」

どちらなの?

正解はRoundUpですが、お客様の損得にかかわってくる場合があります。

 

ちなみに、参考例とした「Int関数」「Fix関数」について、

マイナス数の場合は、「Fix関数」は切り上げに、「Int関数」は切り捨てに使うことが出来ます。

 

ちょっと、話が面倒くさかったですが、結構重要な部分ですので、よく理解をしておいていただければと思います。

 

エクセルVBA学習のおすすめ独習法

 

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

エクセルVBAを独習する中では、疑問点なんかで出来た時は、ああだこうだと調べておられると思います。

そんな中で、知っておいた方がいい、ということを書いた記事があります。

また、参考にしていただければと思います。

 

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

 

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

 

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

 

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

 

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