エラー内容
VBAコンパイル時に、「Next で指定された変数の参照が不正です。」と表示される。
原因と解決方法
おもに次の2つの原因と解決方法が考えられます。
原因1. ForとNextの変数が違う
解説
Forでカウンターに指定している変数と、Nextで指定している変数が違う時に起こります。
次のプログラムはForではi、Nextではjとなっているのでエラーが発生しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub ErrSample05_01() Dim i As Long Dim j As Long For i = 1 To 5 Cells(i, 1).Value = i Next j '← jになっている End Sub |
解決方法
ForとNextで指定する変数を同じにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub ErrSample05_01() Dim i As Long Dim j As Long For i = 1 To 5 Cells(i, 1).Value = i Next i '← iに修正 End Sub |
ただし、プログラムに慣れてきたら、Nextの部分でのカウンタ変数の指定は不要です。
次のようにNextだけでOKです。こちらの方が、一般的な書き方になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub ErrSample05_01() Dim i As Long Dim j As Long For i = 1 To 5 Cells(i, 1).Value = i Next '← Nextでは変数を指定しない End Sub |
原因2. Nextの閉じる順番が違う
解説
For文が入れ子になっている時、閉じるNextの順番が違う時に発生します。
次のプログラムの場合、入れ子になっている内側の処理から閉じる必要があるのに、逆の順番(i→j)で閉じているのでエラーが発生しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub ErrSample05_02() Dim i As Long Dim j As Long For i = 1 To 5 For j = 1 To 3 Cells(i, j).Value = i Next i '← iとjの順番が逆 Next j '← End Sub |
解決方法
内側の処理からNextで閉じるようにします。
今回の場合は、J→iの順番で指定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub ErrSample05_02() Dim i As Long Dim j As Long For i = 1 To 5 For j = 1 To 3 Cells(i, j).Value = i Next j '← 内側のjからに変更 Next i '← End Sub |
「ちょっと難しいなぁ・・・」と思った人は、次の入れ子構造を意識してください。
・外のFor文では、変数iを使った繰り返し
・中のFor文では、変数jを使った繰り返し
POINT
入れ子構造の時は、処理が終わったら内側から閉じていくのがポイントです。
そのため、For部分で書く変数名と、Next部分で書く変数の順番は逆になります。
入れ子構造の時は、処理が終わったら内側から閉じていくのがポイントです。
そのため、For部分で書く変数名と、Next部分で書く変数の順番は逆になります。
Forの入れ子の場合も、プログラムに慣れてきたら、次のようにNextの部分でのカウンタ変数の指定は不要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub ErrSample05_02() Dim i As Long Dim j As Long For i = 1 To 5 For j = 1 To 3 Cells(i, j).Value = i Next '← Nextでは変数を指定しない Next '← End Sub |
POINT
VBAに慣れてきたら、For文のNext部分でのカウンタ変数は不要です。
それよりも、字下げをしてプログラムの構造がわかるようにすることが大事です。
VBAに慣れてきたら、For文のNext部分でのカウンタ変数は不要です。
それよりも、字下げをしてプログラムの構造がわかるようにすることが大事です。