定時で帰ろう!Excel VBA効率化

仕事で身に着けたVBAのお役立ち情報を発信します

【ExcelVBA】変数宣言は必須?

 皆さんはマクロを書くとき、ちゃんと変数宣言(Dim ~ってやつ)をしていますか?書かなくても動くし、変数宣言したらエラーがでたし、よくわからないから書かなくなったという人も多いのではないでしょうか?結論から申し上げますと、変数宣言は「①処理の高速化」「②バグの見つけやすさ」の2つの観点で記載すべきです。それぞれ解説していきます。

1. 変数宣言とは

 変数宣言とはプログラム内で使用する変数を宣言することです。ここでは以降の話につなげるために少しだけ詳しく書きます。

Sub 変数宣言()
    'Dim 変数名 As 型名 で変数を定義します。
    Dim i As Integer '変数iをInteger型で定義
    Dim j As Variant '変数jをVariant型で定義
    Dim k            '型宣言をしないとVariant型になる
    
    i = 100         '変数iに100を代入
    j = "文字列1"  '変数jに文字列1を代入
    k = "文字列2"  '変数kに文字列2を代入
    l = "文字列3"  '変数lに文字列3を代入
                    '変数lはVariant型
End Sub

説明はコメントで書いてしまいましたが、改めてポイントだけ。Variant型は数値、文字列、ワークブックなどのオブジェクトでもなんでも格納できる型です。また変数宣言時に型名を省略、または変数宣言自体を省略した場合は、自動でVariant型になります。良いことばかりのVariant型ですが、次にVariant型の欠点をお話ししていきます。

2. 変数宣言すべき理由~その① 処理の高速化~

 便利なVariant型ですが、実は処理速度が遅いという問題があります。実験をしてみましょう。以下のプログラムは変数counterと変数sumをLong型で宣言し、1から1億までの合計を算出しています。以下例は「(A)Long型で宣言」で宣言していますが、その他「(B)Variant型で宣言」「(C)型名省略」「(D)宣言なし」の場合に分け、それぞれ実行時間を算出してみます。

(A)Long型で宣言

Sub SpeedTest()
    Dim startTimer As Double
    Dim endTimer As Double
    startTimer = Timer
    
    '### 1~1億までの合計値を計算ここから ###
    Dim counter As Long
    Dim sum As Long
    For counter = 1 To 100000000
        sum = counter + 1
    Next
    '### 1~1億までの合計値を計算ここまで ###

    endTimer = Timer
    result = endTimer - startTimer '実行時間を計算
    Debug.Print result
End Sub

 さっそく実行してみました。私のPCの環境ではありますが、5回実行した結果はこちらです。

(A)Long型で宣言 (B)Variant型で宣言 (C)型名省略 (D)宣言なし
1回目 1.070 2.906 2.734 2.875
2回目 1.063 2.734 2.750 2.867
3回目 1.109 2.789 2.742 2.891
4回目 1.047 2.758 2.844 2.891
5回目 1.063 2.742 2.750 2.906
平均 1.070 2.786 2.764 2.886

 「(A)Long型で宣言」が約3倍速いですね。実はVariant型は多くのメモリを消費します。プログラム内ではそこまで大きな容量がいらないのに、不必要にメモリを食っている状態ですね。対して(B)~(D)は記載方法が異なるだけで、全てVariant型で宣言していることと同意のため、実行時間は変化ないです。

 このように、適した型宣言を使うことで、マクロの処理速度を向上させることができます。

3. 変数宣言すべき理由~その② バグの見つけやすさ~

 続いて別の例を見てみます。このプログラムは1~10までの数値を足し、メッセージボックスに合計値を表示するプログラムです。実行してみましょう。

Sub Test()
    Dim counter As Integer
    For counter = 1 To 100
        sum = conter + 1
    Next
    MsgBox sum
End Sub

実行結果

f:id:TenTon:20210313223844p:plain
実行結果(変数宣言なし)

 あれ?0と表示されてしまいました。そうです、実はこのコードにはバグが埋め込まれていました。counterのスペルミスがありますね。今回は簡単なプログラムのため、簡単にバグをみつけ修正できます。しかし規模の大きなプログラムの場合、バグ要因を見つけるのに一苦労ですよね。また結果が表示されているので、バグだと気が付けない可能性もあります。

 ここで、変数宣言を強制するように設定を変更します。設定の方法は簡単です。1行目に「Option Explicit」と記載するだけです。1行追加し、実行してみましょう。

実行した結果がこちらです。

f:id:TenTon:20210313225019p:plain
実行結果(変数宣言強制)
変数conterが定義されていないとエラーが表示されています。バグが埋め込まれている箇所が明確にわかるので、修正が簡単ですね。

4. 結論

 今回は、なぜ変数宣言をしたほうがよいのかを「処理速度」「バグの見つけやすさ」の2つの観点からお話ししました。私も初心者の頃は、型がよくわからない、宣言したらエラーがでたという理由で、変数宣言を避けていました。ですが慣れれば変数宣言をしたほうが楽になりました。なぜならどこにバグがあるのかを教えてくれるからです。また一番怖いのはバグがあることに気が付かずに利用してしまうことです。変数宣言を強制化がこれらを解決してくれます。  今回の情報が皆さんの役に立てば幸いです。今後もこのようなVBA、マクロに関する情報をお届けします。よろしくお願いします!!!