エラー内容
VBAコンパイル時に、「同じ適用範囲内で宣言が重複しています。」と表示される。
原因と解決方法
1つの原因と、その解決方法が考えられます。
原因1. 同じ名前の変数や定数が定義されている
解説
同じプロシージャ(subやfunction)内で、同じ名前の変数や定数が定義されていることがエラー原因です。
プログラムをコピーして作った時に、よく使う変数名がかぶって起こりやすいですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub ErrSample29_01() '処理1 -------- Dim i As Long For i = 1 To 10 'なにか処理を行う Next '処理2 -------- Dim i As Long For i = 1 To 10 'なにか処理を行う Next End Sub |
サンプルソースだと、処理1と2の処理で、for分でよく使われる変数名iがかぶってます。
解決方法
名前がかぶっている変数の名前を変更します。
この時、対応する処理の変数名もあわせて変更しないといけないので注意が必要です。
サンプルソースの場合、2回目の変数定義iを別名jに変えます。
あわせて以降の処理も、変数をjに変更します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub ErrSample29_01() '処理1 -------- Dim i As Long For i = 1 To 10 'なにか処理を行う Next '処理2 -------- Dim j As Long For j = 1 To 10 'なにか処理を行う ←ここに変更前のiを使う処理があれば、この処理もjに変更 Next End Sub |
2回目の定義Dim i As Longを削除して、変数iを「処理1、2」で使いまわしてもエラーは解決できます。
でも変数の使いまわしは、バグの原因になったり、コードが見にくくなるので、できれば変数名を修正しましょう!
For文の変数iやjは正直使いまわすことはよくあり、ギリセーフとも言えます・・・
「同じ適用範囲内で」について
エラーメッセージは「同じ適用範囲内で」となっているので、違うプロシージャ(subやfunction)で同じ名前の変数を定義するのはOKです。
「適用範囲」と言うのは、その定義された変数が使える範囲のことです。
プロシージャ内でDim定義された変数は、それぞれのプロシージャ内でしか使えません。
なので、同じ変数名がそれぞれのプロシージャ内にあってもエラーになりません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'このプログラムはエラーになりません。 Sub ErrSample29_02() Dim i As Long '何か処理でiを使う End Sub Sub ErrSample29_03() Dim i As Long '何か処理でiを使う End Sub |