この記事では VBA における 2 つの整数型 Inetger と Long について解説します。VBA では整数を扱う機会がたくさんあります。特にループのカウンターや配列のインデックス、ワークシートのセルの行番号や列番号などに使用されます。どちらも整数型ですが、扱える値の上限値 (最大値) が異なります。
【VBA】Integer(整数型)
VBA の Integer(整数型変数)には 16 bit の整数を格納します。扱える範囲は「-32,768~32767」です。暦とか年齢とか、あまり大きくない整数を入れるときに使用できます。間違っても Integer を財務データには使わないでください。このデータ型だと3万円ぐらいまでしか扱えません。
Integer の上限値は「32767」なので、それを超える値を格納しようとすると、オーバーフロー (桁溢れ)します。
'[VBA] Integer(1) Sub Integer_Test_1() '変数 x を整数型で宣言 Dim x As Integer 'この変数代入でオーバーフローする x = 40000 Debug.Print x End Sub
Integer 同士の演算結果が上限値を超える場合もオーバーフローします。
'[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
【VBA】Long (長整数型変数)
VBA の 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 'Long_Test_1()の実行結果: '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 'Long_Test_2()の実行結果: '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 'Round_Number()の実行結果: 'm: 2 n: 3
変数 m と n を整数型で宣言しておいて、それぞれ 2.5 , 2.6 という値を入れています。小数は丸められて 2.5 は 2 になり、2.6 は 3 になっています。このように整数型変数に小数を入れると「五捨六入方式」で数値が丸められます。これは長整数型変数でも同じです。整数型変数は数値丸めの手法でよく用いられますが、「五捨六入方式」であることを忘れていると思わぬミスが生じる可能性があります。
コメント
ChatGPTにIntegerとLongについて質問しました
[Q] VBAのIntegerについて、子供にもわかるように説明してください。
[ChatGPT] VBAのIntegerは、コンピュータで数字を扱うときに使う「数の箱」の1つです。イメージしてみてください。あなたが手元にあるカードボードの箱に、数字を書いた紙を入れることができるとします。この箱の大きさは、-32,768から32,767までの整数値を入れることができます。例えば、10や-100、そして0などの数字を、この箱に入れることができます。VBAのIntegerは、小さな数字を扱うときに便利です。たとえば、ループのカウンター変数や、Excelのセルの行番号や列番号などに使用されます。ただし、注意点もあります。箱の大きさを超える数字を入れることはできないので、計算結果が箱の大きさを超える場合は、計算結果が正しくない可能性があります。また、VBAのLongやDoubleなど、より大きな数字を扱うための別の「箱」があることも覚えておくと良いでしょう。
[Q] VBAのLongについて、愉快な感じで説明してください。
[ChatGPT] VBAのLongは、整数値を格納するための「長い(Long)」データ型です!その名前からもわかるように、LongはIntegerよりも「長い」データ型で、2倍以上の範囲の整数値を格納することができます。たとえば、あなたが1日に1ドルをもらい続けたとして、約580年間働き続けた場合、受け取ることができる最大額は約21億ドルです。これは、VBAのLongで正確に表現することができます!Longは、とても長い範囲の整数値を扱えるため、データベースやファイルの操作など、大量のデータを扱う場合に特に便利です。また、Excelの行数や列数を扱う場合にも使用されます。しかし、Longにも注意点があります。整数値がLongの範囲を超える場合、オーバーフローが発生して予期しない結果が得られる可能性があります。したがって、使用するデータ型については、注意深く検討する必要があります!