こんにちは。
ゆきです。
今回は変数の宣言について紹介します。
変数の宣言って?
変数を使う前に、「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つ目は変数の宣言を強制していたケースのように、エラーで処理が止まってしまうケースです。
どちらも求めている結果が出ていないので、コードの中から原因を特定し、修正をする必要があります。
原因を探す際、「どこが間違っているかわからない状態で、すべてコードを確認していく」のと「ここが間違ってますよ」と教えてくれるのでは、労力がぜんぜん違います。
入力間違いは比較的多いエラーです。
一連の動作をすべて自動化できるようになってくると、必然的にコードも長くなります。
長いコードの中で、複数入力間違いをしていた場合、探すのが大変になっちゃうんだね。
コメント