非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

【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コードの信頼性がぐっと向上し、予期せぬエラーに悩まされることも少なくなるはずです。ぜひ今日から実践してみてください!

スポンサーリンク

 - Excel, VBA