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の方がメモリを使わなくて地球にやさしそうですが、
どちらも所詮は数値ですので差はでません。
「オーバーフローが出にくい分だけLongが上位互換」
と思っておいて、特に困ることはないと思います。
おまけ
厳密な話をすると、現代のコンピュータはこんなメモリを気にするレベルでなくなっているため、Integer型で宣言しても、VBAの内部ではすべてLong型に変換して処理されるそうです。
よって、消費メモリが変わらないどころか、「変換の負荷がある分Integerの方が遅い」という検証結果が、いろいろなところで語られていますね。
さて、それもあって「結局Longの方が早いのですべてLongでよい」という考察をたまに見るのですが、
その考え方はちょっと違うんじゃないかな~と思ったりします。
結局「Longの方が早いからLongにする」のではなくて、
「マクロ全体に影響のある差でないからLongでいい」
というのが正しい考え方なんじゃないかな~と。
LongにするかIntegerにするかによる速度の違いは、
マクロ全体でみると誤差ですらないです。
検索をFindでやるかVLOOKUPでやるかとか、
Copyでクリップボードを介さないようにするとか、
そういう速度やメモリを気にするべき局面と比べると、
冗談抜きに1兆倍~1京倍くらい影響度が違います。
極端な話、もしIntegerの方が2倍速かったとしても、全部Longでいいと私は思ってます。
それくらい、数値計算が速度やメモリに与える影響なんてたかが知れてます。
Integerがオーバーフローを出したマクロの修正に5分かかるだけで、
その5分を取り返すのが一生不可能な程度の差しか出ません。
もし数値計算がほとんどの実行時間を占める、
数学的、学術的なことをプログラミングするなら考えないこともないです。
が、その時まず考えるのは「使うプログラミング言語」です。
ExcelVBAでそんなことしませんので、
やっぱりVBAは全部Longでいいんじゃないかな・・・笑
メモリとか処理速度とかが気になっちゃう気持ちはすごくわかります。
これだと遅くなるかなぁ、とか気になりだすと止まりません。
本当に速度を気にしなければいけない場面もたくさんありますからね。
そんな時は、
- すべての処理を少し早くするより、最も遅い処理をなるべく早くした方が全体の処理速度は早くなる
- 処理速度は、それが求められる場面でのみ追及する
ように考えるようにすると、スッキリするかもしれません。