スポンサードリンク

定数と変数で同じ名前をつけた(重複した)場合の挙動

要はタイトルのようなミスをやらかしてドツボにはまってしまった時のお話です。

なぜなんだ?と首をひねり過ぎて疲れてしまったので、同じことをやらかさないようにするための備忘録

プロシージャレベル優先?

やらかしてしまった状態を極限まで簡素化したのが以下の状態。

Option Explicit
Const BookPath As String = "C:\Users\XXXXX\Desktop\AAA.xlsx"

Sub TEST1()
     Dim BookPath  As String
     
     BookPath = ThisWorkbook.Path & "\ZZZ.xlsx"
     MsgBox BookPath
End Sub

msgboxにAAAとZZZのどちらが表示されると思いますか?

答えはプロシージャレベル変数のZZZです。

状況から推測するに、定数とプロシージャレベル変数の宣言が重複した場合はプロシージャレベル変数の宣言が優先され定数の宣言は無かったことになるのかな。

変数で定数を上書きしてるのかなとも思ったのですが、上述のように思うのは以下の場合は定数として機能しているからです。

Option Explicit
Const BookPath As String = "C:\Users\XXXXX\Desktop\AAA.xlsx"

Sub TEST1()
'     Dim BookPath  As String
     
     BookPath = ThisWorkbook.Path & "\ZZZ.xlsx"
     MsgBox BookPath
End Sub

定数が定数として機能しているとそもそも値の書き換えができません。 f:id:ExcelLover:20181028112544j:plain

効率化の方法が下手くそだった。

なぜこのような変数と定数が重複して思惑と違う表示が起きたのか?

プロシージャが増えていって、BookPath = ThisWorkbook.Path & "\ZZZ.xlsx"という同じ内容の記載が増えてきた為、

今後のためと思ってConst BookPath As String = "C:\Users\XXX\Desktop\ZZZ.xlsx"を追加。

各プロシージャ内のDim BookPath As String、BookPath = ThisWorkbook.Path & "\ZZZ.xlsx"を削除。

Const BookPath As String = "C:\Users\XXX\Desktop\AAA.xlsx"に変更。

したにも係わらず、msgboxに”ZZZ"が表示される。

削除したつもりだったDim BookPath As String、BookPath = ThisWorkbook.Path & "\ZZZ.xlsx"が残ってたんですね。

まとめ

このような何回も記載する可能性が高いものは最初から定数で宣言しておけば、書き換えの手間も、今回のような失敗をすることもありませんでした。

以後気をつけることにします。