変数はかならず宣言した方が良いの?

こんにちは。
ゆきです。

今回は変数の宣言について紹介します。

変数の宣言って?

変数を使う前に、「Dim」を使って変数を宣言する命令をすることです。

変数って文字とか数字を入れておく入れ物だったよね?                             

ゆき
ゆき

そうそう。

その入れ物を使う前に、今回使う入れ物の名前は〇〇ですって宣言しておくの。

あらかじめ使う入れ物にテプラで名前と入れる物を貼っておいて、事前に名前を知らされている入れ物だけを使うイメージかな。                          

Option Explicitについて

モジュールの宣言セクションに記述する、「このモジュール内の変数は、絶対に宣言をしますよ」というものです。

というのも、VBAはこの宣言をしなくても変数が使えてしまいます。

もともと自由に使えるなら、宣言を強制する方が縛りが増えて大変じゃない?            

ゆき
ゆき

宣言を強制している場合と、強制していない場合でどう変わるのか

せっかくなので見比べてみましょうか!                                           

ソースコードを見比べてみよう

A列に名前、B列に点数が入力されている、「一覧」という名前のシートを作ってみました。
80点以上で合格です。

B列に入力された点数が
  80点以上・・・合格
  80点未満・・・不合格
をC列に入力するコードを書いてみました。

宣言の強制なし

Sub ScoreCheck()
    With ThisWorkbook.Worksheets("一覧")
        lastrow = .Cells(Rows.Count, 1).End(xlUp).Row
        
        For i = 2 To lastrow Step 1
            scoer = .Cells(i, 2).Value
            If score >= 80 Then
                .Cells(i, 3).Value = "合格"
            Else
                .Cells(i, 3).Value = "不合格"
            End If
        Next i
    End With
End Sub
ゆき
ゆき

途中エラーで止まることなく処理が終了しました。

結果を見てみましょう。                                            

ゆき
ゆき

全員不合格です!満点でも不合格!!かなしい!!!

宣言の強制あり

Option Explicit
Sub ScoreCheck()
    Dim LastRow As Long, Score As Long, i As Long
    
    With ThisWorkbook.Worksheets("一覧")
        LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
        
        For i = 2 To LastRow Step 1
            scoer = .Cells(i, 2).Value
            If Score >= 80 Then
                .Cells(i, 3).Value = "合格"
            Else
                .Cells(i, 3).Value = "不合格"
            End If
        Next i
    End With
End Sub
ゆき
ゆき

・1行目にOption Explicit(変数の宣言を強制する)を入れたこと

・3行目に変数の宣言を入れたこと以外は同じコードです。では起動してみます。

ゆき
ゆき

エラーで止まってしまいました。

よく見るとScoreの綴りがscoerになっています。                               

宣言の強制あり(修正後)

Option Explicit
Sub ScoreCheck()
    Dim LastRow As Long, Score As Long, i As Long
    
    With ThisWorkbook.Worksheets("一覧")
        LastRow = .Cells(Rows.Count, 1).End(xlUp).Row
        
        For i = 2 To LastRow Step 1
            Score = .Cells(i, 2).Value
            If Score >= 80 Then
                .Cells(i, 3).Value = "合格"
            Else
                .Cells(i, 3).Value = "不合格"
            End If
        Next i
    End With
End Sub
ゆき
ゆき

9行目を修正しました。

マクロを起動してみます。                                         

ゆき
ゆき

今度はきちんと合否が入力されました!

どうして全員不合格になったのか

変数の宣言を強制せずに変数名を入力間違いしてしまうと、間違っている変数名を変数として扱ってしまいます。

今回変数の強制を宣言していないケースで全員不合格になってしまった理由は、
   1.変数scoreに一覧の点数を格納
   2.変数scoreに入っている点数が80点未満か判断する
   3.score変数に80点以上の点数が入っている場合は合格、
     入っていない場合は不合格を入力する
という処理の際、1で誤ってscoerに点数を入れてしまっています。

当然、scoreには何も入っていません。

結果、全員80点以上取れていない、と処理されてしまいました。

まとめ

変数の宣言を強制した方が良いのかと言われたら、絶対にした方が良いとお答えします。
VBAのエラーには大きく2種類あります。

1つ目は今回の変数の宣言が強制されていないケースのように、エラーで処理が止まることはないけれど、結果が求めているものと違うケース。

2つ目は変数の宣言を強制していたケースのように、エラーで処理が止まってしまうケースです。

どちらも求めている結果が出ていないので、コードの中から原因を特定し、修正をする必要があります。
原因を探す際、「どこが間違っているかわからない状態で、すべてコードを確認していく」のと「ここが間違ってますよ」と教えてくれるのでは、労力がぜんぜん違います。

入力間違いは比較的多いエラーです。
一連の動作をすべて自動化できるようになってくると、必然的にコードも長くなります。

長いコードの中で、複数入力間違いをしていた場合、探すのが大変になっちゃうんだね。              

コメント