サイトについて      連絡先   検索

VBA 数値を操作する

はじめに

Excel VBA マクロの数値 (Integer など) を操作する方法を紹介します。

計算によりオーバーフローが発生したり、小数に誤差がでるのを修正できます。

偶数丸めを四捨五入にしたり、比較する方法も紹介します。

  • 目次
    • 数値型
    • 計算する
    • 少数の誤差
    • 四捨五入する
    • 切り捨てする
    • 切り上げする
    • 比較する

数値型

数値型にはそれぞれ値の範囲が決まっており、整数のみや少数を扱えるものなどがあります。

型名 データ型 値の例や範囲
Byteバイト型0 ~ 255 の正の整数
Integer整数型-32,768 ~ 32,767 の整数
Long長整数型-2,147,483,648 ~ 2,147,483,647 の整数
Single単精度浮動小数点型負:-3.402823E38 ~ -1.401298E-45
正:1.401298E-45 ~ 3.402823E38
Double倍精度浮動小数点型負:-1.79769313486231E308 ~ -4.94065645841247E-324
正:4.94065645841247E-324 ~ 1.79769313486232E308
Currency通貨型-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807

この他に変数として宣言できませんが VBA で最大の桁数を持つ Decimal 型が存在します。Variant 型に「CDec 関数」を使用したときだけ使用できる型です。

型名 データ型 値の例や範囲
Decimal10 進型少数なしの最大値:79,228,162,514,264,337,593,543,950,335
少数ありの最大値:7.9228162514264337593543950335

Dim d As Variant
d = CDec(7.92281625142642E+28) ' Decimal 型になる

型の使い分けとして通常は Integer にします。その範囲で収まらないなら Long や Currency などより大きい型を選択します。小数を扱うなら Double にします。

計算する

演算子」の+-を使用します。算術演算子には次のものがあります。

演算子 演算名 使用例 結果
+足し算1 + 23
-引き算2 - 11
*掛け算2 * 36
/割り算7 / 23.5
\割り算の商7 \ 23
Mod割り算の余り7 Mod 21
^べき乗2 ^ 38

Dim i As Integer
i = 1 + 2 ' 足し算
Debug.Print(i) ' 3

Dim d As Double
d = 7 / 2 ' 割り算
Debug.Print(d) ' 3.5

オーバーフロー

計算した結果がその型の範囲を超えるときは「エラー 6 オーバーフローしました。」が発生します。


Dim b As Byte
b = 255 + 1 ' エラー、Byte の最大値は 255

次のような計算でもオーバーフローします。


Dim b1 As Byte
Dim b2 As Byte
b1 = 255
b2 = 1

Dim i As Integer
i = b1 + b2 ' エラー、結果が Byte の 256 のため
i = 255 + 1 ' OK

これはByte + Byteの結果も Byte になるためです。結果が Byte の 256 になるので、その時点でオーバーフローします。

エラーが発生しないようにするには、代入する前に「CInt 関数」などで変換してから計算します。


Dim b1 As Byte
Dim b2 As Byte
b1 = 255
b2 = 1

Dim i As Integer
i = CInt(b1) + CInt(b2) ' OK
i = CInt(b1) + b2       ' OK、片方だけ変換しても大丈夫

コードに直接入力された数値は通常は Integer として入力されています。その範囲を超えるときは自動でその型になります。


Dim l As Long
l = 1      ' Integer の 1
l = 100000 ' Long の 100000
l = 1.5    ' Double の 1.5

少数の誤差

Single や Double の浮動小数点型では、小数点の計算で誤差が発生することがあります。


Dim f As Single
f = 0.5 - 0.4 - 0.1
Debug.Print(f) ' -2.775558E-17、0 にならない

これはすべてのプログラミング言語で発生する仕様です。こういうときは Currency や Decimal を使用するか、一度整数にしてから計算します。


' Currency や Decimal は誤差が発生しない
Dim c As Currency
c = 0.5 - 0.4 - 0.1
Debug.Print(c) ' 0

Dim d As Variant
c = CDec(0.5) - CDec(0.4) - CDec(0.1)
Debug.Print(c) ' 0

' 整数にしてから計算する
Dim a As Single
Dim b As Single
Dim c As Single
a = 0.5 * 10
b = 0.4 * 10
c = 0.1 * 10

Dim f As Single
f = (a - b - c) / 10
Debug.Print(f) ' 0

Currency が簡単でオススメです。

四捨五入する

Excel の「ROUND 関数」を使用して四捨五入できます。

Excel の関数は「エクセルの関数を使う」方法で使用できます。


Dim f As Single

f = WorksheetFunction.Round(123.456, 0)
Debug.Print(f) ' 123

f = WorksheetFunction.Round(123.456, 1)
Debug.Print(f) ' 123.5

f = WorksheetFunction.Round(123.456, 2)
Debug.Print(f) ' 123.46

f = WorksheetFunction.Round(123.456, -1)
Debug.Print(f) ' 120

f = WorksheetFunction.Round(123.456, -2)
Debug.Print(f) ' 100

VBA の関数で四捨五入

Integer などの整数型に小数を代入すると、自動で整数になるように偶数丸めされます。

偶数丸めとは、丸める桁数の値が 5 のときに偶数になるように丸められることです。それ以外は四捨五入と同じです。海外では四捨五入より偶数丸めが一般的です。


Dim i As Integer

i = 0.5
Debug.Print(i) ' 0
i = 1.5
Debug.Print(i) ' 2
i = 2.5
Debug.Print(i) ' 2
i = 3.5
Debug.Print(i) ' 4
i = 4.5
Debug.Print(i) ' 4

Round 関数」を使用すると、同様に偶数丸めされます。


Dim i As Integer

i = Round(0.5)
Debug.Print(i) ' 0
i = Round(1.5)
Debug.Print(i) ' 2
i = Round(2.5)
Debug.Print(i) ' 2
i = Round(3.5)
Debug.Print(i) ' 4
i = Round(4.5)
Debug.Print(i) ' 4

Format 関数」の引数に(数値, "0")を渡して、四捨五入できます。


Dim i As Integer

i = Format(0.5, "0")
Debug.Print(i)      ' 1
i = Format(1.5, "0")
Debug.Print(i)      ' 2
i = Format(2.5, "0")
Debug.Print(i)      ' 3
i = Format(3.5, "0")
Debug.Print(i)      ' 4
i = Format(4.5, "0")
Debug.Print(i)      ' 5

切り捨てする

Excel の「ROUNDDOWN 関数」を使用して切り捨てできます。

Excel の関数は「エクセルの関数を使う」方法で使用できます。


Dim f As Single

f = WorksheetFunction.RoundDown(123.456, 0)
Debug.Print(f) ' 123

f = WorksheetFunction.RoundDown(123.456, 1)
Debug.Print(f) ' 123.4

f = WorksheetFunction.RoundDown(123.456, 2)
Debug.Print(f) ' 123.45

f = WorksheetFunction.RoundDown(123.456, -1)
Debug.Print(f) ' 120

f = WorksheetFunction.RoundDown(123.456, -2)
Debug.Print(f) ' 100

切り上げする

Excel の「ROUNDUP 関数」を使用して切り上げできます。

Excel の関数は「エクセルの関数を使う」方法で使用できます。


Dim f As Single

f = WorksheetFunction.RoundUp(123.456, 0)
Debug.Print(f) ' 124

f = WorksheetFunction.RoundUp(123.456, 1)
Debug.Print(f) ' 123.5

f = WorksheetFunction.RoundUp(123.456, 2)
Debug.Print(f) ' 123.46

f = WorksheetFunction.RoundUp(123.456, -1)
Debug.Print(f) ' 130

f = WorksheetFunction.RoundUp(123.456, -2)
Debug.Print(f) ' 200

比較する

数値を比較するには「演算子」の=<>を使用します。

演算子 演算名 使用例 結果
=等しい1 = 2False
<>等しくない1 <> 2True
>大きい1 > 2False
<小さい1 < 2True
>=以上1 >= 2False
<=以下1 <= 2True

If 10 = 10 Then
    Debug.Print("等しい")
End If

If 9 < 10 Then
    Debug.Print("より小さい")
End If
  • 目次
    • 数値型
    • 計算する
    • 少数の誤差
    • 四捨五入する
    • 切り捨てする
    • 切り上げする
    • 比較する