Int・Fix・Abs・Sign関数で数値の整数部分を完全分離

vbaintfixeyecatch

数学関数を使って、数値の整数部分だけを分離します。
Fix関数でなく、Int関数を使った場合でも、他の関数との組み合わせれば同様の結果を得られます。

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

今回のテーマは、数値の整数部分だけを分離する方法についてです。

それなら『じゃあ、「小数点以下を切り捨てで」ということで・・・。』

とは、単純にはいきません。

この記事で利用するVBA関数は「Int・Fix・Abs・Sign」です。

数値の整数部分だけを完全に分離するには

vbaintfixp007

数値の整数部分だけを使う。

数値整数部分小数部分
123.4561230.456
-123.987-123-0.987

このような数値の加工をしたいというケースは、時々あっても、そうは頻繁に有ることは無いでしょう。

何を言いたいかというと、

ほぼ同じ働きをする関数であれば、普段使いの関数を選択して

『どちらかと言えばこのレアケースに対して、特に注意深くはエクセルVBA関数を選択しない』という人は少なくないと思います。

普段使いの関数で、普通の条件下では、想定通りの結果を出すわけですし・・・。

「その関数。数値の整数部分を切り出す関数と言えば「Int関数」。普段使いは「Int関数」ですよね。」って

「数値整数部の分だけを使う。」ことに関して、

VBAコード組み立てで、利用したVBA関数が「Fix関数」のみの方は、安心してください。大丈夫です。

ねこ氏
ねこ氏

「望まない結果を出すことがある。」と言いますが、Int関数で

指定された数値が「小数込みの数値であっても、正常に整数値が返ってきますが・・・」

確かにそうかもしれません。

望まない結果とは

問題は、小数付きのマイナスの数値から整数部分だけを切り取った時に発生します。

しかもVBAコード的にはエラーではありません。

ただ関数の計算値が、自分の要求とは違うだけです。

関数を選ぶときの問題点を整理する

数値の小数点以下の部分を切り捨て、整数部分を値として返す関数は、

「Int関数」「Fix関数」とワークシート関数の「RoundDown関数」があります。

特に条件がなければ、使い慣れで関数を選んでしまいがちです。

エクセルVBA学習の最初のところで、「データ型として「Integer(整数型-32,768から32,767の整数)」があります。」と勉強します。

そのような調子で(?)、整数値の関数と言えば「Int関数」だと普通に思ってしまうでしょう。

使い慣れたものを使うのは大正解ですが別の意味で、大間違いの元にもなります。

「Int関数」「Fix関数」とワークシート関数の「RoundDown関数」には、それぞれにちょっとした戻り値の違いがあります。

取り扱う数値が、正の数だけの場合は良いですが、負の数が入った時に問題が起こってしまうのです。

それを今から順に詳しく紹介していきます。

参考記事

  • RoundDownワークシート関数については詳しくはこちらです。
vbaroundupdowneyecatch RoundUpとRoundDown関数の使い方。数値の切り方に注意が必要です

また他にも、この記事の中で、「Abs関数」と「Sign関数」という関数も利用していきます。

VBA関数「Int・Fix・Abs・Sign」の特徴と整数の戻り値

vbaintfixp008

「Int関数」・「Fix関数」・「Abs関数」・「Sign関数」についてそれぞれの特徴を説明します。

Int関数を使う

Int関数を使う時の要点です。

VBA
Sub Int戻り値()
        Range("D3") = Int(Range("B3"))
        Range("D4") = Int(Range("B4"))
        Range("D5") = Int(Range("B5"))
        Range("D6") = Int(Range("B6"))
        Range("D7") = Int(Range("B7"))
        Range("D8") = Int(Range("B8"))
End Sub

小数点以下切り捨ての関数なので、小数点以下の四捨五入の動きはありません。
正の数と負の数の時では「整数部分の分離」という点で違和感があります。

vbaintfix001a

Int関数の特徴

正の数の場合は、指定された数値の小数部分を取り除いた整数を戻り値として返します。

負の数の場合は、指定された数値を超えない最大の負の整数を返します。

Int関数の構文

  • Int (「数値」)

「数値」は、Double または任意 の有効な数値式。Null が含まれている場合は Null が返ります。

Fix関数を使う

Fix関数を使う時の要点です。

VBA
Sub Fix戻り値()
        Range("D3") = Fix(Range("B3"))
        Range("D4") = Fix(Range("B4"))
        Range("D5") = Fix(Range("B5"))
        Range("D6") = Fix(Range("B6"))
        Range("D7") = Fix(Range("B7"))
        Range("D8") = Fix(Range("B8"))
End Sub

正の数、負の数のどちらの場合でも、「整数部分の分離」という点ではイメージ通りの整数値を戻しています。

vbaintfix002a

Fix関数の特徴

指定された数値の小数部分を取り除いた整数を戻り値として返します。

Fix関数の構文

  • Fix (「数値」)

「数値」は、Double または任意 の有効な数値式。Null が含まれている場合は Null が返ります。

Int関数とFix関数の戻り値の違い

2つの違いをまとめます。

「Int関数」と「Fix関数」の戻り値を対比すると、

この2つは、

指定された数値が正の数の時は、全く同じ値を返します。

指定された数値が負の数の時は、この2つは異なった値を返します。

つまり

  • Fix関数は、正負共に指定された数値の整数部分そのものを戻り値として返します。
  • Int関数は、負の数の場合だけ、指定された数値の整数部分とは違う値を返します。(数値に一番近い小さいほうの整数を返す。)

負の数値の整数部分の取り出しの戻り値を意識してVBAコード組みをしていればいいですが、

深く考えずに「Int関数」を使ってVBAプログラムを組んでいるとしたら、その時点で計算誤差を許容していることになります。

元々 Int関数の戻り値の性質を織り込み済なら、全く問題ありませんが・・・。

Abs関数を使う

Abs関数を使う時の要点です。

VBA
Sub Abs戻り値()
        Range("D3") = Abs(Range("B3"))
        Range("D4") = Abs(Range("B4"))
        Range("D5") = Abs(Range("B5"))
        Range("D6") = Abs(Range("B6"))
        Range("D7") = Abs(Range("B7"))
        Range("D8") = Abs(Range("B8"))
End Sub

絶対値を戻り値として返しますので、すべて正の数となりました。

vbaintfix003a

Abs関数の特徴

数値の絶対値を返します。絶対値とは、数値の数直線上での0からの距離を表しています。

必ず正の値を取得したいときに使います。

Abs関数の構文

  • Abs (「数値」)

戻り値のデータ型は、引数に指定されたデータと同じ型になります。

Sgn関数を使う

Sign関数を使う時の要点です。

VBA
Sub Sgn戻り値()
        Range("D3") = Sgn(Range("B3"))
        Range("D4") = Sgn(Range("B4"))
        Range("D5") = Sgn(Range("B5"))
        Range("D6") = Sgn(Range("B6"))
        Range("D7") = Sgn(Range("B7"))
        Range("D8") = Sgn(Range("B8"))
End Sub

指定された数値が、正の数の場合は「1」を負の数の場合は「-1」を戻り値として返します。

vbaintfix004a

Sgn関数の特徴

指定された数値について、正負記号を取得します。

0の場合は0を返します。

Sgn関数の構文

  • Sgn (「数値」)

戻り値は、[数値]が正の数(符号が+)であれば1、負の数(符号が-)であれば-1、0であれば0となります。

Sgn関数の実際の利用は、この説明した基本の機能を利用したものではなくて、

多くは「配列の動的配列の初期化判定」のために使われています。

ゆえに、Sgn(〇〇)と記述したときに「反射的に配列初期化判定」と誤読されるかもしれません。→ 可読性に問題あり?

安全策で、「 Sgn ( 数値 ) 」に代わる

正負記号取得方法として、「 数値 / Abs ( 数値 ) 」という式で代用することも出来ます。

数値の整数部を完全に分離するデキル使い方

vbaintfixp009

先ほどから紹介してきました様に、

元々「Fix関数」をベースにエクセルVBAコードを組み立てている場合は問題ありません。

すでに「Int関数」ベースでエクセルVBAを組み立てている場合は、エクセルVBAコードの修正補正が必要になると思います。

ごく順当にVBAコードを組み立てていた場合

「Fix関数」を使っている場合

サンプルとして、13個の乱数を発生させます。

正の数、負の数の出現は不確定です。

VBA
Sub 整数部分分離Fix関数()
    Dim i As Long
        Randomize
        Cells(2, 2) = "整数分離:Fix関数"
        For i = 3 To 15
            Cells(i, 2) = Rnd * 100 - Rnd * 100
            Cells(i, 3) = "→"
            Cells(i, 4) = Fix(Cells(i, 2))
            Cells(i, 5) = Cells(i, 2) - Cells(i, 4)
        Next i
End Sub
vbaintfix005a

ちなみに、

小数部分を分離するには、以下のVBAコードで行うことが出来ます。

「 Next  i 」 の上に記述すればOKです。

        Cells(i, 5) = Cells(i, 2) - Cells(i, 4)

注意ポイント

エクセルシートの表示は、数値の桁数制限のルールによって、デフォルトでは
実際にセルに代入されている値とは(誤差レベルの)違いがあります。

参考記事

深く考えずにVBAコードを組み立てていた場合

深く考えずに「Int関数」でエクセルVBAコードを組み立ててしまった場合です。

「Int関数」を「Fix関数」に全面変更するか

「Abs関数」と「Sgn関数」を使って「指定された数値」を加工します。

こちらの方もサンプルとして、13個の乱数を発生させます。

正の数、負の数の出現は不確定です。

VBA
Sub 整数部分分離Int関数()
    Dim i As Long
    Dim COR As Double
        Randomize
        Cells(2, 2) = "整数分離:Int関数を修正"
        Cells(2, 4) = "Int関数"
        Cells(2, 5) = "int関数を修正"
        For i = 3 To 15
            Cells(i, 2) = Rnd * 100 - Rnd * 100
            COR = Cells(i, 2)
            Cells(i, 3) = "→"
            Cells(i, 4) = Int(Cells(i, 2))
            Cells(i, 5) = Int(Abs(COR)) * Sgn(COR)
        Next i
End Sub

「指定された数値」を「Abs関数」で強制的にすべて正の数に変更します。
正の数の範囲では「Int関数」は正常に整数値を出力できますので、
そこで加工を行って、そのあと「Sgn関数」で正負記号を付加して結果表示します。

vbaintfix006a

VBA関数「Int・Fix・Abs・Sign」で整数部分を完全に分離 のまとめ

vbaintfixp010

この記事では、数値の整数部分だけ分離する方法について説明をしてきました。

結果

Fix関数のように、これ一つで整数部分の分離という目的を達成できるものがある。

と同時に、

複数の関数の組み合わせでも目的を達成できるということも分かりました。

今回使った関数はそれぞれ、似た結果を戻す関数になりました。

関数を使っての目的達成・問題解決のためには、まずその関数の特徴を知っておくことが重要になります。

今回は、数値から整数部分だけを分離する方法を紹介しましたが、

のちの記事では、数値から小数部分だけを分離する方法を紹介したいと思います。

関数の種類やそれぞれの働きは、エクセルVBAの中級レベルまででかなり多くが出てきます。

人それぞれ業務分野ででも、よく使う関数とそうでない関数が出てくると思いますが、

基礎ベースの関数は共通事項として、必ず覚えておくようにしましょう。

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

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

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

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

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

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