和風スパゲティのレシピ

日本語でコーディングするExcelVBA

変数の型「Long」と「Integer」の違い

VBAの変数の型である「Long型」と「Integer型」の違いを解説します。

同じところ

両者とも整数を扱います。

  • 123を代入すると123
  • 1.5を代入すると2(暗黙の型変換で四捨五入される)
  • みかんを代入すると「型が一致しません」エラー

は同じです。

違うところ

箱の大きさが違います。


システムっぽく言うと、格納できる値の範囲が違います。

変数の型 最小 最大
Integer -32,768 32,767
Long -2,147,483,648 2,147,483,647

↑これが値の範囲になります。


実際に使う場面の話をすると、

Dim N as Integer
N = 100000

これが「オーバーフローしました。」になるかならないかの違いです。

使い分け

常にLong型でOKです。

Integerの方がメモリを使わなくて地球にやさしそうですが、
気にするレベルではありません。

おまけ

厳密な話をすると、現代のコンピュータはこんなメモリを気にするレベルでなくなっているため、Integer型で宣言しても、VBAの内部ではすべてLong型に変換して処理されるそうです。


よって、消費メモリが変わらないどころか、変換の負荷がある分Integerの方が遅いという検証結果が、いろいろなところで語られていますね。


さて、それもあって「結局Longの方が早いのですべてLongでよい」という考察をたまに見るのですが、
それについてはちょっと思うところがあります。


結局Longの方が早いからLongにするのではなくて、

マクロ全体に影響のある差でないからLongでいい

あるいは

速度を追求すべき個所ではないからLongでいい

というのが正しい考え方なんじゃないかな~と。


極端な話、もしIntegerの方が2倍速かったとしても、全部Longでいいと思ってます。


なぜなら、「ワークシート」や「セル」などのオブジェクトが主役のVBAでは、
変数同士の計算が処理時間に与える影響は、たかが知れているからです。

間違ってIntegerにしてしまい、オーバーフローでバグを出してしまう方が普通に危ないですからね。


メモリとか処理速度とかが気になっちゃう気持ちはすごくわかります。
これだと遅くなるかなぁ、とか気になりだすと止まりません。

本当に速度を気にしなければいけない場面もたくさんありますからね。


そんな時は、

  • すべての処理を早くするより、最も遅い処理を超早くした方が、全体の処理速度は早くなる
  • 処理速度は、それが求められる場面でのみ追及する

ように考えるようにすると、スッキリするかもしれません。