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
Decimal10 進型可変少数なしの最大値: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 + 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

割り算や小数の計算をする

割り算の結果が小数になるときは 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 関数:四捨五入する」を使用して、桁数を指定して四捨五入できます。

引数には (数値, 桁数) を指定します。

Excel の関数を使用するには「WorksheetFunction」をご覧ください。
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 関数:切り捨てする」を使用して、桁数を指定して切り捨てできます。

引数には (数値, 桁数) を指定します。

Excel の関数を使用するには「WorksheetFunction」をご覧ください。
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 関数:切り上げする」を使用して、桁数を指定して切り上げできます。

引数には (数値, 桁数) を指定します。

Excel の関数を使用するには「WorksheetFunction」をご覧ください。
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