[VBA] 整数型 (Integer) と長整数型 (Long)

 この記事では VBA における 2 つの整数型 Inetger と Long について解説します。
 

整数型変数 (Integer)

 整数型変数 (Integer) には 16 bit の整数を格納します。扱える範囲は -32,768 ~ 32767 です。暦とか年齢とか、あまり大きくない整数を入れるときに使用しましょう。間違っても価格などのデータには使わないでね。このデータ型だと3万円ぐらいまでしか扱えません。

 Integer の上限値は 32767 なので、それを超える値を格納しようとすると、オーバーフロー (桁溢れ) します。

'[VBA] Integer Sample_1

Sub Integer_Test_1()

'変数 x を整数型で宣言
Dim x As Integer

'この変数代入でオーバーフローする
x = 40000

Debug.Print x

End Sub

 Integer 同士の演算結果が上限値 32767 を超える場合も、オーバーフローします。

'[VBA] Integer Sample_2

Sub Integer_Test_2()

Dim x As Integer, y As Integer

'この変数代入は正常に実行される
x = 20000
y = 30000

'x + y は Integer の上限値を超えるので、ここでオーバーフローする
Debug.Print "x + y の値 : " & x + y

End Sub

 

長整数型変数 (Long)

 長整数型変数 (Long) には 32 bit の整数を格納します。扱える範囲は整数型よりずっと大きくて -2,147,483,648 ~ 2,147,483,647 となっています。万を超えるような整数を扱うときは長整数型変数にしておいたほうが無難です。

 Long の上限値について、2 を底とする対数を計算してみます。

'[VBA] Long Sample_1

Sub Long_Test_1()

Dim x As Long

x = 2147483647

'2を底とするxの対数を計算
y = Log(x) / Log(2)

Debug.Print y

End Sub

30.9999999993282

 つまり、2^30 は計算できますが、2^31 を計算させるとオーバーフローとなります。実際に試してみましょう。

'[VBA] Long Sample_2

Sub Long_Test_2()

Dim x As Long, y As Long

'この代入は正常に実行される
x = 2 ^ 30

Debug.Print "2^30 : " & x

'ここでオーバーフロー
y = 2 ^ 31

Debug.Print y

End Sub

2^30 : 1073741824

 
 「Integer のほうが Long より小さな値を扱うから処理速度が速くなる」と言われることもありますが、一概にそうとは言えなません。はっきりしたことはわからないのですが、処理速度はお使いの PC 環境や Excel のバージョンに大きく左右されます。現在はほとんどの PC が 32 bit あるいは 64 bit だと思いますけど、32 bit の PC であれば、32 bit の Long のほうがデータ変換の手間が省けるぶんだけ処理が速くなる可能性があります。ですから迷うようであれば整数を扱うときはすべて Long に統一してしまう、という手もあります。
 
 整数型・長整数型変数について少しだけ注意しなくてはならない点をマクロを使って説明しておきます。

'[VBA] 五捨六入方式で数値を丸めます

Sub Round_Number()

  Dim m As Integer
  Dim n As Integer

  m = 2.5
  n = 2.6

  Debug.Print "m = " & m, "n = " & n

End Sub

 変数 m と n を整数型で宣言しておいて、それぞれ 2.5 , 2.6 という値を入れています。この Round_Number を実行してみると

 m = 2  n = 3

という結果が表示されます。つまり小数は丸められて 2.5 は 2 になり、2.6 は 3 になっています。このように整数型変数に小数を入れると「五捨六入方式」で数値が丸められるのです。これは長整数型変数でも同じです。整数型変数は数値丸めの手法でよく用いられますが、「五捨六入方式」であることを忘れていると思わぬミスが生じる可能性があります。


 

コメントをどうぞ

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)