更新日:、 作成日:
VBA 数値を計算する
はじめに
Excel VBA マクロで数値 (Integer, Long, Double など) を計算する方法を紹介します。
Integer 型の範囲は -32,768 ~ 32,767 の整数です。これより大きい値を扱うには Long 型や Currency 型を使用します。
小数を扱うには Double 型を使用します。誤差が発生するときは Currency 型を使用します。
割り算した結果を「ROUND 関数」、「ROUNDDOWN 関数」、「ROUNDUP 関数」から、四捨五入や切り捨てできます。
オーバーフローするときは、計算する値を「CCur 関数」などで大きい型に変換してから計算します。
数値型について
数値型にはそれぞれ値の範囲が決まっており、整数のみや少数を扱えるものなどがあります。
型名 | データ型 | ビット数 | 値の例や範囲 |
Byte | バイト型 | 8 (1B) | 0 ~ 255 の正の整数 |
Integer | 整数型 | 16 (2B) | -32,768 ~ 32,767 の整数 |
Long | 長整数型 | 32 (4B) | -2,147,483,648 ~ 2,147,483,647 の整数 |
Single | 単精度浮動小数点型 | 32 (4B) | 負:-3.402823E38 ~ -1.401298E-45 正:1.401298E-45 ~ 3.402823E38 |
Double | 倍精度浮動小数点型 | 64 (8B) | 負:-1.79769313486231E308 ~ -4.94065645841247E-324 正:4.94065645841247E-324 ~ 1.79769313486232E308 |
Currency | 通貨型 | 64 (8B) | -922,337,203,685,477.5808 ~ 922,337,203,685,477.5807 |
Decimal | 10 進型 | 可変 | 少数なしの最大値:79,228,162,514,264,337,593,543,950,335 少数ありの最大値:7.9228162514264337593543950335 |
LongLong | 超長整数型 | 64 (8B) | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 の整数 |
LongPtr | 整数型 | 32 (4B) 64 (8B) | 32 ビット環境:Long と同じ 64 ビット環境:LongLong と同じ |
Decimal 型
変数の型として宣言できませんが VBA で最大の桁数を持つのが Decimal 型です。Variant 型に「CDec 関数」で変換したときだけ使用できる型です。
Dim d As Variant
d = CDec("79,228,162,514,264,337,593,543,950,335")
Debug.Print(d) ' 79228162514264337593543950335、Decimal
UInteger 型
符号なしの UInteger を使用したいときは、「CUInt 関数」を作成して変換できます。
Sub 実行()
Dim uint As Long
uint = CUInt(-10)
Debug.Print(uint) ' 65526
uint = CUInt(10)
Debug.Print(uint) ' 10
End Sub
' 符号あり Integer を 符号なし UInteger に変換します。
Function CUInt(ByVal value As Integer) As Long
' value が正の値のときはそのまま
If value >= 0 Then
CUInt = value
Exit Function
End If
' 負の値のときは UInteger の最大値 + 1 の値を加える
CUInt = value + 65536
End Function
LongLong、LongPtr 型
エクセルのバージョンが 64 ビットのときは、LongLong 型が使用できます。
LongPtr は32 ビットでは Long 型になります。64 ビットでは LongLong 型になります。両方の環境で動作するコードを作成するときに使用します。
使い分け
型の使い分けとして、通常は Integer を使用します。それより大きい値を扱うなら Long や Currency などの型を選択します。小数を扱うなら Double にします。
スポンサーリンク
数値を計算する
算術演算子を使用して数値の計算ができます。
+ や - を入力して、足し算や引き算ができます。
* や / を入力して、掛け算や割り算ができます。
演算子 | 演算名 | 使用例 | 結果 |
+ | 足し算 | 1 + 2 | 3 |
- | 引き算 | 2 - 1 | 1 |
* | 掛け算 | 2 * 3 | 6 |
/ | 割り算 | 7 / 2 | 3.5 |
\ | 割り算の商 | 7 \ 2 | 3 |
Mod | 割り算の余り | 7 Mod 2 | 1 |
^ | べき乗 | 2 ^ 3 | 8 |
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
割り算や小数の計算をする
割り算の結果が小数になるときは Double 型の変数に代入します。
小数を切り捨てるには \ で割り算します。
Integer などの整数型に代入すると「偶数丸め」されます。
Dim d As Double
d = 10 / 4
Debug.Print(d) ' 2.5
d = 10 \ 4 ' 円マーク
Debug.Print(d) ' 2、切り捨て
Dim i As Integer
i = 10 / 4
Debug.Print(i) ' 2、偶数丸め
偶数丸めや四捨五入、小数の桁数を指定して切り捨てなどは、下記の「四捨五入する」や「切り捨てする」をご覧ください。
少数の誤差
Single や Double の浮動小数点型では、小数点の計算で誤差が発生することがあります。
Dim d As Double
d = 0.5 - 0.4 - 0.1
Debug.Print(d) ' -2.775558E-17、0 にならない
d = 0.5
Debug.Print(d) ' 0.5
d = d - 0.4
Debug.Print(d) ' 0.1
d = d - 0.1
Debug.Print(d) ' -2.775558E-17、0 にならない
これは他のプログラミング言語でも発生する浮動小数点の仕様です。こういうときは Currency や Decimal 型で計算します。
' Currency や Decimal は誤差が発生しない
Dim c As Currency
c = 0.5 - 0.4 - 0.1
Debug.Print(c) ' 0
Dim de As Variant
de = CDec(0.5) - CDec(0.4) - CDec(0.1)
Debug.Print(de) ' 0
上記の方法で Currency に誤差が発生しないのは四捨五入されているからです。0.5 - 0.4 - 0.1 の結果は Double で誤差が発生しています。
Currency は少数点第 4 位まで表せます。少数点第 5 位が四捨五入されます。
Currency の小数の計算では誤差は発生しません。
Dim c As Currency
c = 0.12345
Debug.Print(c) ' 0.1235、四捨五入される
c = 0.12344
Debug.Print(c) ' 0.1234、四捨五入される
c = 0.5 - 0.4 - 0.1
Debug.Print(c) ' 0、-0.0000000000000000277555756156 を四捨五入している
c = CCur(0.5) - CCur(0.4) - CCur(0.1) ' Currency に変換して計算
Debug.Print(c) ' 0
または、一度整数にしてから計算します。
' 整数にしてから計算する
Dim a As Double
Dim b As Double
Dim c As Double
a = 0.5 * 10 ' 5
b = 0.4 * 10 ' 4
c = 0.1 * 10 ' 1
Dim d As Double
d = (a - b - c) / 10
Debug.Print(d) ' 0
四捨五入する
Excel の「エクセル ROUND 関数:四捨五入する」を使用して、桁数を指定して四捨五入できます。
引数には (数値, 桁数) を指定します。
Dim d As Double
d = WorksheetFunction.Round(123.456, 0)
Debug.Print(d) ' 123
d = WorksheetFunction.Round(123.456, 1)
Debug.Print(d) ' 123.5
d = WorksheetFunction.Round(123.456, 2)
Debug.Print(d) ' 123.46
d = WorksheetFunction.Round(123.456, -1) ' 整数 1 桁目
Debug.Print(d) ' 120
d = WorksheetFunction.Round(123.456, -2) ' 整数 2 桁目
Debug.Print(d) ' 100
偶数丸め
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、偶数になる
VBA の「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
切り捨てする
割り算した小数を切り捨てるには \ で割り算します。
Dim d As Double
d = 10 \ 3 ' 円マーク
Debug.Print(d) ' 3
d = 10 \ 4 ' 円マーク
Debug.Print(d) ' 2
Excel の「エクセル ROUNDDOWN 関数:切り捨てする」を使用して、桁数を指定して切り捨てできます。
引数には (数値, 桁数) を指定します。
Dim d As Double
d = WorksheetFunction.RoundDown(123.456, 0)
Debug.Print(d) ' 123
d = WorksheetFunction.RoundDown(123.456, 1)
Debug.Print(d) ' 123.4
d = WorksheetFunction.RoundDown(123.456, 2)
Debug.Print(d) ' 123.45
d = WorksheetFunction.RoundDown(123.456, -1) ' 整数 1 桁目
Debug.Print(d) ' 120
d = WorksheetFunction.RoundDown(123.456, -2) ' 整数 2 桁目
Debug.Print(d) ' 100
切り上げする
Excel の「エクセル ROUNDUP 関数:切り上げする」を使用して、桁数を指定して切り上げできます。
引数には (数値, 桁数) を指定します。
Dim d As Double
d = WorksheetFunction.RoundUp(123.456, 0)
Debug.Print(d) ' 124
d = WorksheetFunction.RoundUp(123.456, 1)
Debug.Print(d) ' 123.5
d = WorksheetFunction.RoundUp(123.456, 2)
Debug.Print(d) ' 123.46
d = WorksheetFunction.RoundUp(123.456, -1) ' 整数 1 桁目
Debug.Print(d) ' 130
d = WorksheetFunction.RoundUp(123.456, -2) ' 整数 2 桁目
Debug.Print(d) ' 200
スポンサーリンク