数学関数を使って、数値の整数部分だけを分離します。
Fix関数でなく、Int関数を使った場合でも、他の関数との組み合わせれば同様の結果を得られます。
こんにちは、じゅんぱ店長(@junpa33)です。
今回のテーマは、数値の整数部分だけを分離する方法についてです。
それなら『じゃあ、「小数点以下を切り捨てで」ということで・・・。』
とは、単純にはいきません。
この記事で利用するVBA関数は「Int・Fix・Abs・Sign」です。
コンテンツ
数値の整数部分だけを完全に分離するには
数値の整数部分だけを使う。
数値 | 整数部分 | 小数部分 |
---|---|---|
123.456 | 123 | 0.456 |
-123.987 | -123 | -0.987 |
このような数値の加工をしたいというケースは、時々あっても、そうは頻繁に有ることは無いでしょう。
何を言いたいかというと、
ほぼ同じ働きをする関数であれば、普段使いの関数を選択して
『どちらかと言えばこのレアケースに対して、特に注意深くはエクセルVBA関数を選択しない』という人は少なくないと思います。
普段使いの関数で、普通の条件下では、想定通りの結果を出すわけですし・・・。
「その関数。数値の整数部分を切り出す関数と言えば「Int関数」。普段使いは「Int関数」ですよね。」って
「数値整数部の分だけを使う。」ことに関して、
VBAコード組み立てで、利用したVBA関数が「Fix関数」のみの方は、安心してください。大丈夫です。
「望まない結果を出すことがある。」と言いますが、Int関数で
指定された数値が「小数込みの数値であっても、正常に整数値が返ってきますが・・・」
確かにそうかもしれません。
関数を選ぶときの問題点を整理する
数値の小数点以下の部分を切り捨て、整数部分を値として返す関数は、
「Int関数」「Fix関数」とワークシート関数の「RoundDown関数」があります。
特に条件がなければ、使い慣れで関数を選んでしまいがちです。
エクセルVBA学習の最初のところで、「データ型として「Integer(整数型-32,768から32,767の整数)」があります。」と勉強します。
そのような調子で(?)、整数値の関数と言えば「Int関数」だと普通に思ってしまうでしょう。
使い慣れたものを使うのは大正解ですが別の意味で、大間違いの元にもなります。
「Int関数」「Fix関数」とワークシート関数の「RoundDown関数」には、それぞれにちょっとした戻り値の違いがあります。
取り扱う数値が、正の数だけの場合は良いですが、負の数が入った時に問題が起こってしまうのです。
それを今から順に詳しく紹介していきます。
- RoundDownワークシート関数については詳しくはこちらです。
また他にも、この記事の中で、「Abs関数」と「Sign関数」という関数も利用していきます。
VBA関数「Int・Fix・Abs・Sign」の特徴と整数の戻り値
「Int関数」・「Fix関数」・「Abs関数」・「Sign関数」についてそれぞれの特徴を説明します。
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
小数点以下切り捨ての関数なので、小数点以下の四捨五入の動きはありません。
正の数と負の数の時では「整数部分の分離」という点で違和感があります。
Int関数の特徴
正の数の場合は、指定された数値の小数部分を取り除いた整数を戻り値として返します。
負の数の場合は、指定された数値を超えない最大の負の整数を返します。
Int関数の構文
- Int (「数値」)
「数値」は、Double または任意 の有効な数値式。Null が含まれている場合は Null が返ります。
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
正の数、負の数のどちらの場合でも、「整数部分の分離」という点ではイメージ通りの整数値を戻しています。
Fix関数の特徴
指定された数値の小数部分を取り除いた整数を戻り値として返します。
Fix関数の構文
- Fix (「数値」)
「数値」は、Double または任意 の有効な数値式。Null が含まれている場合は Null が返ります。
Int関数とFix関数の戻り値の違い
2つの違いをまとめます。
「Int関数」と「Fix関数」の戻り値を対比すると、
この2つは、
指定された数値が正の数の時は、全く同じ値を返します。
指定された数値が負の数の時は、この2つは異なった値を返します。
つまり
- Fix関数は、正負共に指定された数値の整数部分そのものを戻り値として返します。
- Int関数は、負の数の場合だけ、指定された数値の整数部分とは違う値を返します。(数値に一番近い小さいほうの整数を返す。)
負の数値の整数部分の取り出しの戻り値を意識してVBAコード組みをしていればいいですが、
深く考えずに「Int関数」を使ってVBAプログラムを組んでいるとしたら、その時点で計算誤差を許容していることになります。
元々 Int関数の戻り値の性質を織り込み済なら、全く問題ありませんが・・・。
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
絶対値を戻り値として返しますので、すべて正の数となりました。
Abs関数の特徴
数値の絶対値を返します。絶対値とは、数値の数直線上での0からの距離を表しています。
必ず正の値を取得したいときに使います。
Abs関数の構文
- Abs (「数値」)
戻り値のデータ型は、引数に指定されたデータと同じ型になります。
Sgn関数を使う
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」を戻り値として返します。
Sgn関数の特徴
指定された数値について、正負記号を取得します。
0の場合は0を返します。
Sgn関数の構文
- Sgn (「数値」)
戻り値は、[数値]が正の数(符号が+)であれば1、負の数(符号が-)であれば-1、0であれば0となります。
Sgn関数の実際の利用は、この説明した基本の機能を利用したものではなくて、
多くは「配列の動的配列の初期化判定」のために使われています。
ゆえに、Sgn(〇〇)と記述したときに「反射的に配列初期化判定」と誤読されるかもしれません。→ 可読性に問題あり?
安全策で、「 Sgn ( 数値 ) 」に代わる
正負記号取得方法として、「 数値 / Abs ( 数値 ) 」という式で代用することも出来ます。
数値の整数部を完全に分離するデキル使い方
先ほどから紹介してきました様に、
元々「Fix関数」をベースにエクセルVBAコードを組み立てている場合は問題ありません。
すでに「Int関数」ベースでエクセルVBAを組み立てている場合は、エクセルVBAコードの修正補正が必要になると思います。
ごく順当にVBAコードを組み立てていた場合
「Fix関数」を使っている場合
サンプルとして、13個の乱数を発生させます。
正の数、負の数の出現は不確定です。
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
ちなみに、
小数部分を分離するには、以下のVBAコードで行うことが出来ます。
「 Next i 」 の上に記述すればOKです。
Cells(i, 5) = Cells(i, 2) - Cells(i, 4)
注意ポイント
エクセルシートの表示は、数値の桁数制限のルールによって、デフォルトでは
実際にセルに代入されている値とは(誤差レベルの)違いがあります。
- Rnd関数については詳しくはこちらです。
深く考えずにVBAコードを組み立てていた場合
深く考えずに「Int関数」でエクセルVBAコードを組み立ててしまった場合です。
「Int関数」を「Fix関数」に全面変更するか
「Abs関数」と「Sgn関数」を使って「指定された数値」を加工します。
こちらの方もサンプルとして、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) = "→"
Cells(i, 4) = Int(Cells(i, 2))
Cells(i, 5) = Int(Abs(COR)) * Sgn(COR)
Next i
End Sub
「指定された数値」を「Abs関数」で強制的にすべて正の数に変更します。
正の数の範囲では「Int関数」は正常に整数値を出力できますので、
そこで加工を行って、そのあと「Sgn関数」で正負記号を付加して結果表示します。
VBA関数「Int・Fix・Abs・Sign」で整数部分を完全に分離 のまとめ
この記事では、数値の整数部分だけ分離する方法について説明をしてきました。
結果
Fix関数のように、これ一つで整数部分の分離という目的を達成できるものがある。
と同時に、
複数の関数の組み合わせでも目的を達成できるということも分かりました。
今回使った関数はそれぞれ、似た結果を戻す関数になりました。
関数を使っての目的達成・問題解決のためには、まずその関数の特徴を知っておくことが重要になります。
今回は、数値から整数部分だけを分離する方法を紹介しましたが、
のちの記事では、数値から小数部分だけを分離する方法を紹介したいと思います。
関数の種類やそれぞれの働きは、エクセルVBAの中級レベルまででかなり多くが出てきます。
人それぞれ業務分野ででも、よく使う関数とそうでない関数が出てくると思いますが、
基礎ベースの関数は共通事項として、必ず覚えておくようにしましょう。
エクセルVBAを独習するのに参考書は欠かせません。 参考書選びは自分に合った「相棒」にできるものを選んでいきたいです。
エクセルVBAの独習でおすすめ参考書を7冊選ぶ。良書との出会いは大切です今回の記事はここまでです。 最後までご覧いただき有難うございました。
<記事内容についての告知>
VBAコードの記述記事においては、その記述には細心の注意をしたつもりですが、掲載のVBAコードは動作を保証するものではりません。 あくまでVBAの情報の一例として掲載しています。 掲載のVBAコードのご使用は、自己責任でご判断ください。 万一データ破損等の損害が発生しても当方では責任は負いません。
アンケートでポイ活しよう!!
アンケートに答えれば答えるほど ”使える” ポイントがたまります。