VBA

【ExcelVBA】Integer型とLong型の使い分けは?処理速度が速いのは?

ねぇもりさん、VBAで整数を扱うデータ型って、いくつかあるよね
もり
もり
代表的なのはInteger型Long型だね。

扱う数字の大きさによって、使い分けよう

モリ
モリ
おい、その情報、古いぞ

いつも隣にITのお仕事のコーディングガイドライン【随時更新】によると、

整数はLong型で統一で問題ありません。
(中略)
最近のバージョンでは、Integer型として宣言されていても、VBAはすべての整数値をLong型に変換します。したがって、Integer変数を使用することによるパフォーマンス上の利点はなくなりました。実際、Long変数はVBAで変換する必要がないため、少し速くなる可能性があります。

 

もり
もり
なんてこったい!

これまでデータ型の指定にはこだわっていたんですが・・・衝撃・・・

モリ
モリ
百聞は一見に如かずだな、実験するぞ

VBAで整数値を扱うデータ型

この3種類があります。バイト型を使ってるコードはほとんど見たことないですね

データ型 表記 消費メモリ 格納できる値の範囲
バイト型 Byte 1バイト 0~255の整数
整数型 Integer 2バイト -32,768~32,767の整数
長整数型 Long 4バイト -2,147,483,648~2,147,483,647の整数

Integer vs Longの速度テスト

検証環境

ハード・ソフト面

  • Office 2016
  • OS:Windows10 Home 64bit
  • CPU:Core i5
  • メモリ:4GB

計測回数はInteger型、Long型それぞれ100回ずつ
(Integer50回→Long50回→Integer50回→Long50回で測定)

その他

  • Excel以外のアプリケーションはすべて落とす
  • PCの電源コードは繋いでおく
  • Wi-Fiは切断

検証用のコード

速度計測をするときは下記の点に注意しましょう

VBAはワークシートのセルへの書き込み処理の時間がかかるので、セルへの書き込み処理をしないコードで計測すること。

「セルの書き込み」という処理の速度計測をするときはもちろん必要ですが、データ型の比較をするうえでは「セルへの書き込み」は何の意味もないですよね。

n = 10000 ^ 2 =で1憶回の無駄な計算をしてもらいました。

実行結果

100回実行結果のサマリです。

指標 Integer型 Long型
中央値 4.17 秒 3.80秒
最小値 4.125 秒 3.704秒
最大値 4.218 秒 3.891 秒
やっぱりLong型の方が速いんだね~

暗黙の型に注意!

変数をまとめて宣言するときも、必ず1つずつ型を指定する必要があります。

Dim a as Long, b as Long, c As Long

Dim a, b, c As Long

このように書くと、それぞれのデータ型はこうなります。

  • a → Variant型
  • b → Variant型
  • c → Long型
モリ
モリ
Variant型は、Integer型よりもメモリを確保するから、その分処理が遅いんだ

知らないうちにVariant型の変数をたくさん使用していると、処理が遅くなる原因になります。

それぞれきちんと型指定をしましょうね。

Integer vs Longまとめ

整数値のデータ型

Integer型はLong型に比べて処理速度が遅く、扱える数値も小さいので、使う必要はない!

整数値はすべてLong型を使おう!

 

もり
もり
これでモヤモヤがスッキリした~
モリ
モリ
みんなも勉強してて気になることがあったら、手を動かして実験してみるといいぞ