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

vbaintfixeyecatch

エクセルVBAの数学関数を使って、数値の整数部分だけを分離します。
整数値取得のFix関数でなくInt関数の使用の場合でも、

他の関数との組み合わせで解決することが出来ます。

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

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

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

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

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

関数リファレンスの記事一覧を開く

数値の整数部分だけを完全に分離したい
ー正しく目的を達成するためのVBA関数はー

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

数値整数部分小数部分
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関数」には、それぞれにちょっとした戻り値の違いがあります。

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

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

MEMO

RoundDownワークシート関数については詳しくはこちらです。

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

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

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

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

Int関数を使う

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

Int関数

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関数の構文

  • Int (「数値」)

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

Fix関数を使う

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

Fix関数

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関数の構文

  • Fix (「数値」)

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

Int関数とFix関数の戻り値の違いを知る

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

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

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

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

Fix関数は、正負共に指定された数値の整数部分そのものを戻り値として返します。

 

Int関数は、負の数の場合だけ、指定された数値の整数部分とは違う値を返します。
数値に一番近い小さいほうの整数を返す。

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

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

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

Abs関数を使う

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

Abs関数

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関数の構文

  • Abs (「数値」)

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

Sgn関数を使う

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

Sign関数

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関数の構文

  • Sgn (「数値」)

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

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

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

 

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

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

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

数値の整数部を完全に分離する出来る使い方

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

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

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

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

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

順当にFix関数を利用

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

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

MEMO

Rnd関数については詳しくはこちらです。

vbarndeyecatchRnd関数で乱数を取得。使えない戻り値を加工して利用度を上げる

サンプルコード

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))
    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関数」を使って「指定された数値」を加工します。

深く考えずにInt関数を利用

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

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

コード

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) = "→"
  'Int関数そのままの戻り値
            Cells(i, 4) = Int(Cells(i, 2))
  'Abs関数とSgn関数を使った数値加工
            Cells(i, 5) = Int(Abs(COR)) * Sgn(COR)
        Next i

End Sub

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

vbaintfix006a

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

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

結果

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

と同時に、

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

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

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

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

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

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

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

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

短期間でエクセルVBAの独学習得を目指したいなら

エクセルVBAを独学する独習方法は、学習者それぞれ十人十色、多種多様と思われます。

けれども、

出来るだけ効率よく学習するためには、いくつかの大切なポイントがあります。

独学でもVBA習得の中級クラスに達するのはそんなに難しいことではありません。

先人が行った勉強方法をあなたがそのまま利用すればよいということです。

独習のための大切な7つのポイントは、上記記事にて解説しています。

重要ワード

独習によるVBA習得のキーワードは、

出来るだけ多くの実例に触れること!

です。

正直、VBAの学習について自分の周りの仕事(業務)からだけ実例を得るのでは効率良い習熟は無理です。

ハッキリ言って、

本当に短い期間でVBA習得を成功させたいなら、今使っている参考書が良書かどうかを判断し、新ツールとしてオンライン学習も取り入れて行うことが、

手っ取り早く短期間習得できるというのは間違いないでしょう。

「エクセルVBA最速理解」の記事一覧を開く

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

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