【ExcelVBA】LongとIntegerを使い分ける基本
はじめに
Excel VBAでコードを書く際、変数にどんな「型」を指定していますか?「とりあえずDim i As Integerと書いている」という方も多いかもしれませんね。
しかし、VBAのデータ型を正しく理解し、適切に使い分けることは、コードの信頼性とパフォーマンスを向上させるために非常に重要です。
今回は、特に混同しやすいInteger型とLong型に焦点を当て、その違いと使い分けの基本を分かりやすく解説します。
Integer型とは?
Integer型は、整数を格納するためのデータ型です。
- 格納できる値の範囲: -32,768 から 32,767 まで
- メモリ使用量: 2バイト
主に、以下のような場面で使われます。
- ごく小さな数値を扱う場合
- ループのカウンタなど、値が32,767を超えないことが確実な場合
注意点:オーバーフローに気をつけよう
Integer型で最も注意すべきは「オーバーフロー」です。
格納できる範囲を超える数値を代入しようとすると、エラーが発生したり、意図しない値になったりします。
簡単な例を見てみましょう。
Sub IntegerOverflowExample()
Dim num As Integer
num = 32767 ' Integerの最大値
Debug.Print "現在の値: " & num ' 32767
' ここでオーバーフローが発生!
num = num + 1
Debug.Print "1加算後の値: " & num ' エラーが発生するか、意図しない値になる
End Sub
このコードを実行すると、「オーバーフローしました」という実行時エラーが発生するはずです。
これは、Integer型が32767までしか扱えないためです。
Long型とは?
Long型も整数を格納するためのデータ型ですが、Integer型よりも大きな値を扱えます。
- 格納できる値の範囲: -2,147,483,648 から 2,147,483,647 まで
- メモリ使用量: 4バイト
主に、以下のような場面で使われます。
- 大きな数値を扱う場合
- Excelの行番号や列番号など、32,767を超える可能性のある数値を扱う場合
先ほどのオーバーフローの例をLong型で書き換えてみましょう。
Sub LongExample()
Dim num As Long
num = 32767 ' Integerの最大値と同じ値を代入
Debug.Print "現在の値: " & num ' 32767
num = num + 1 ' 問題なく加算できる
Debug.Print "1加算後の値: " & num ' 32768
num = 60000 ' さらに大きな値も問題なく代入できる
Debug.Print "新しい値: " & num ' 60000
End Sub
Long型を使えば、問題なく大きな値を扱うことができるのが分かりますね。
LongとIntegerの使い分けのポイント
「じゃあ、常にLongを使えばいいの?」と思うかもしれません。結論から言うと、現代のVBA開発では、ほとんどのケースでLong型を使うのが安全でおすすめです。
Excelの行番号・列番号は必ずLong型で!
特に重要なのが、Excelの行番号や列番号を扱う場合です。
現代のExcelシートは最大1,048,576行まであります。Integer型の最大値32,767をはるかに超えるため、行番号をInteger型で宣言すると、あっという間にオーバーフローしてしまいます。
Sub GetLastRowExample()
' 間違った例: Integer型で行番号を取得しようとすると…
' Dim lastRowBad As Integer
' lastRowBad = Cells(Rows.Count, 1).End(xlUp).Row ' 行数が多いシートだとエラー!
' Debug.Print "最終行 (Integer): " & lastRowBad
' 正しい例: Long型で行番号を取得する
Dim lastRowGood As Long
lastRowGood = Cells(Rows.Count, 1).End(xlUp).Row
Debug.Print "最終行 (Long): " & lastRowGood
' 列番号も同様にLong型を推奨
Dim lastCol As Long
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
Debug.Print "最終列 (Long): " & lastCol
End Sub
このサンプルコードのように、Rows.CountやColumns.Count、End(xlUp).Rowなどで取得する値は、必ずLong型で受け取るようにしましょう。
メモリ効率 vs. 堅牢性
昔のVBAでは、メモリ使用量が少ないInteger型が推奨されることもありました。
しかし、現代のPCはメモリが豊富に搭載されており、Integer型とLong型のメモリ使用量の差(2バイト vs. 4バイト)は、ほとんどパフォーマンスに影響を与えません。
それよりも、オーバーフローによる予期せぬエラーを防ぐことのメリットの方がはるかに大きいです。
そのため、迷ったらLong型を選んでおけば間違いありません。
まとめ
今回は、VBAのInteger型とLong型の違いと使い分けについて解説しました。
Integer型は-32,768~32,767の範囲の整数を扱えるが、オーバーフローに注意が必要。Long型は-2,147,483,648~2,147,483,647の範囲の整数を扱え、より安全。- Excelの行番号や列番号を扱う際は、必ず
Long型を使用する。 - 現代のVBA開発では、特別な理由がない限り
Long型を使うのが推奨。
この基本を理解していれば、VBAコードの信頼性がぐっと向上し、予期せぬエラーに悩まされることも少なくなるはずです。ぜひ今日から実践してみてください!
スポンサーリンク