はじめに
Excel VBAで数値を扱っていると、「プラスかマイナスかではなく、差の大きさだけを知りたい」という場面があります。たとえば、計画値100に対して実績値が90でも110でも、差の大きさはどちらも10です。
このようなときに使えるのが、VBAのAbs関数です。Absは数値の符号を外し、0からの距離である絶対値を返します。
この記事では、Abs関数の構文と基本的な使い方に加え、2つの値の差、許容差判定、セル値を扱うときの注意点を解説します。読了後には、「符号を無視して大きさだけを比較したい処理」でAbsを使える状態を目指します。
Abs関数とは
Abs関数は、指定した数値の絶対値を返すVBAの標準関数です。
| 入力 | Absの結果 |
|---|---|
5 | 5 |
-5 | 5 |
0 | 0 |
-12.5 | 12.5 |
負の値を正の値へ変換する関数と覚えやすいですが、本質は「符号を取り除いて値の大きさを得る」ことです。正の値を指定した場合は、そのまま同じ値が返ります。
基本構文は次のとおりです。
Abs(number)
numberには数値として評価できる式を指定します。
Dim result As Double
result = Abs(-12.5)
MsgBox result
実行すると、12.5が表示されます。
2つの値の差を求めるときに便利
Absが特に分かりやすく役立つのが、2つの値の差の大きさを求める処理です。
たとえば、システム上の在庫数が120、実棚数が115の場合を考えます。
Dim systemStock As Long
Dim actualStock As Long
Dim difference As Long
systemStock = 120
actualStock = 115
difference = Abs(systemStock - actualStock)
結果は5です。
実棚数が125の場合でも、
difference = Abs(120 - 125)
の結果は同じく5です。
systemStock - actualStockだけでは、どちらが大きいかによって正負が変わります。Absを使えば、増減の方向ではなく「いくつ違うか」だけを同じ方法で比較できます。
許容差の判定にも使える
実務では、完全一致ではなく「基準値との差が一定範囲なら許容する」と判定したいことがあります。
たとえば、基準値との差が10以内なら正常とする場合は、次のように書けます。
Dim target As Double
Dim actual As Double
Dim tolerance As Double
target = 100
actual = 108
tolerance = 10
If Abs(actual - target) <= tolerance Then
MsgBox "許容範囲内です"
Else
MsgBox "確認が必要です"
End If
actualが92でも108でも、基準値100との差は8なので同じ条件で判定できます。
条件分岐そのものを確認したい場合は、VBA IF Then Elseの基礎:使用例を交えて解説も参考にしてください。
セルの値を渡すときは数値か確認する
Absの引数には数値として扱える値が必要です。セルから取得した値をそのまま渡す場合、文字列などが入っていると意図しないエラーにつながります。
簡単な入力確認にはIsNumericを使えます。
Dim value As Variant
value = Range("A1").Value
If IsNumeric(value) Then
MsgBox Abs(value)
Else
MsgBox "数値を入力してください"
End If
ただし、IsNumeric("53")のような数値として解釈できる文字列もTrueになります。文字列を数値として扱ってよいかどうかは、データの意味に合わせて判断してください。
データ型や変換を整理したい場合は、Excelで四則演算とデータ型変換を解説!計算ミスを防ぐコツへ分けて確認できます。
Nullや未初期化の値ではどうなるか
VBAのAbsには、通常の正負の数値以外にも決まった動作があります。
| 入力の状態 | 結果 |
|---|---|
| 数値 | 同じ型の絶対値 |
Null | Null |
| 未初期化の変数 | 0 |
たとえば、Variant変数にNullが入っている場合、Absを通してもNullのままです。
Dim value As Variant
value = Null
Debug.Print IsNull(Abs(value))
この結果はTrueです。
Nullは0や空文字とは別の値です。欠損値の有無そのものを判定したい場合は、Absの前にIsNullなどで確認します。
符号に意味があるときはAbsを使わない
Absは、符号を無視して大きさだけを比較したい場合に便利です。一方で、符号自体に意味があるデータへ機械的に使うと、必要な情報を失います。
たとえば、売上前年差が-100万円なら「100万円減少した」という意味があります。これにAbsを使うと100になり、「減少」という情報が消えます。
そのため、次のように考えると使い分けやすくなります。
- 誤差や差異の大きさを知りたい →
Absを使う - 増加か減少かという方向も必要 → 符号を残す
- 大きさと方向の両方が必要 → 元の値と
Absの結果を別々に扱う
VBAではAbsをそのまま使えばよい
Excel VBAでは、AbsはVBAに組み込まれた関数なので、通常はAbs(...)と直接書けば十分です。
Excelのワークシート関数をVBAから呼び出す場合にはWorksheetFunctionオブジェクトを使うことがありますが、VBAにも同名または同等の関数がある場合は、まずVBA側の関数を使う方が処理の意図を読み取りやすくなります。
Absで単純な数値の絶対値を求める処理では、ワークシート関数を経由する必要はありません。
まとめ
VBAのAbs関数は、数値の符号を外して絶対値、つまり0からの距離を取得するための関数です。
単純に負数を正数へ変換するだけでなく、Abs(a - b)と書くことで2つの値の差の大きさを求めたり、Abs(actual - target) <= toleranceのように許容差を判定したりできます。
一方で、符号に増減などの意味があるデータでは、Absを使うと方向の情報が失われます。また、セル値を扱う場合は入力値が数値として評価できるか、Nullなどの欠損値をどう扱うかも確認が必要です。
「方向は不要で、大きさだけを比較したいか」を基準にすると、Absを使う場面を判断しやすくなります。