扱う数字の大きさによって、使い分けよう
いつも隣に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はワークシートのセルへの書き込み処理の時間がかかるので、セルへの書き込み処理をしないコードで計測すること。
「セルの書き込み」という処理の速度計測をするときはもちろん必要ですが、データ型の比較をするうえでは「セルへの書き込み」は何の意味もないですよね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 |
Declare Function timeGetTime Lib "winmm.dll" () As Long Sub ひたすら演算する() Dim cnt As Long Do Until cnt = 50 Dim StartTime As Long StartTime = timeGetTime '開始時刻 Call ひたすら演算処理 Dim EndTime As Long EndTime = timeGetTime '終了時刻 Debug.Print (EndTime - StartTime) / 1000 cnt = cnt + 1 DoEvents Loop End Sub '******************************************* Sub ひたすら演算処理() '======ここのデータ型をテスト毎に書き換え====== Dim a As Long: a = 1 Dim b As Long: b = 2 Dim c As Long: c = 3 Dim d As Long: d = 4 Dim e As Long: e = 5 Dim f As Long: f = 6 Dim g As Long: g = 7 Dim h As Long: h = 8 Dim i As Long: i = 9 Dim j As Long: j = 10 Dim tmp As Long: tmp = 100 '演算繰り返し回数 Dim n As Long: n = 10000 'カウンタ変数 Dim x As Long, y As Long '===================================== '以下、ひたすら計算 For x = 1 To n For y = 1 To n tmp = tmp + (a + b + c + d) / e + (f + g + h + i) / j - e / a Next y Next x End Sub |
n = 10000 ^ 2 =で1憶回の無駄な計算をしてもらいました。
実行結果
100回実行結果のサマリです。
指標 | Integer型 | Long型 |
---|---|---|
中央値 | 4.17 秒 | 3.80秒 |
最小値 | 4.125 秒 | 3.704秒 |
最大値 | 4.218 秒 | 3.891 秒 |
暗黙の型に注意!
変数をまとめて宣言するときも、必ず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 vs Longまとめ
Integer型はLong型に比べて処理速度が遅く、扱える数値も小さいので、使う必要はない!
整数値はすべてLong型を使おう!