Nameプロパティの不思議

Nameプロパティについて、

  • 不思議だな
  • 面白い
  • なるほど
  • 気持ち悪い

と思ったことがあったので、備忘録がてら紹介する。
f:id:Infoment:20181005225415p:plain

例えば、マクロでA1セルに「山田太郎」という名前を付けたとする。

Sub NameTest()
    Range("A1").Name = "山田太郎"
End Sub

果たして、A1を選択すると「山田太郎」と表示されていることから、名づけは成功したのかと思われる。
f:id:Infoment:20181005223112p:plain

今度は逆に、セルの名前を表示してみたい。これだけでは何の意味もないが、とにかくテストしてみる。

Sub NameTest()
    Range("A1").Name = "山田太郎"
    MsgBox Range("山田太郎").Name
End Sub

メッセージボックスに「山田太郎」と表示されることを期待して実行すると、何故かアドレスが表示されてしまった。
f:id:Infoment:20181005223515p:plain
この不可逆(に思える)現象は一体、なんだろう?

その後の調べで、名前の名前を調べると上手くいくということが分かった。

Sub NameTest()
    Range("A1").Name = "山田太郎"
    MsgBox Range("山田太郎").Name.Name
End Sub

ようやく、期待通りの結果が得られた。
当時は理由を深く考えず、表面的に知識をサラリと撫でて終わっていた。
f:id:Infoment:20181005223739p:plain

そしてつい先日のこと、ようやく意味が分かった(教えてもらった)。
Range("山田太郎").Name は、↓の一行すべての情報を内包していたのだ。*1
f:id:Infoment:20181005224226p:plain

Nameプロパティの中のNameということで、.Name.Nameという不思議に思える表記になっていたわけだ。なるほど、面白い。

ところで先日thomさんに、「識別子は上書きできる」と教わった。例えば、こんな感じ。

Dim Name as Name

ここで「Name」を「name」のように小文字始まりにすると、以下になる。

Dim name as name

これは何となく、「識別子の上書き」という言葉から、理解できる気がする。
さらにこれを先ほどのマクロに追加すると、このようになる。

Sub NameTest()
    Dim name As name
    Range("A1").name = "山田太郎"
    MsgBox Range("山田太郎").name.name
End Sub

一つ目のNameと二つ目のNameは意味が違うのに、どうして両方とも引っ張られて小文字になるのだろう。
f:id:Infoment:20181005225011p:plain
恐らくこれを説明する理屈があるのだろうけど、何だかちょっと気持ち悪い。
と、思いました。

参考まで。

*1:実際は、もっと多くの情報を取り出すことが出来る。