Nameプロパティの不思議
Nameプロパティについて、
- 不思議だな
- 面白い
- なるほど
- 気持ち悪い
と思ったことがあったので、備忘録がてら紹介する。
例えば、マクロでA1セルに「山田太郎」という名前を付けたとする。
Sub NameTest() Range("A1").Name = "山田太郎" End Sub
果たして、A1を選択すると「山田太郎」と表示されていることから、名づけは成功したのかと思われる。
今度は逆に、セルの名前を表示してみたい。これだけでは何の意味もないが、とにかくテストしてみる。
Sub NameTest() Range("A1").Name = "山田太郎" MsgBox Range("山田太郎").Name End Sub
メッセージボックスに「山田太郎」と表示されることを期待して実行すると、何故かアドレスが表示されてしまった。
この不可逆(に思える)現象は一体、なんだろう?
その後の調べで、名前の名前を調べると上手くいくということが分かった。
Sub NameTest() Range("A1").Name = "山田太郎" MsgBox Range("山田太郎").Name.Name End Sub
ようやく、期待通りの結果が得られた。
当時は理由を深く考えず、表面的に知識をサラリと撫でて終わっていた。
そしてつい先日のこと、ようやく意味が分かった(教えてもらった)。
Range("山田太郎").Name は、↓の一行すべての情報を内包していたのだ。*1
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は意味が違うのに、どうして両方とも引っ張られて小文字になるのだろう。
恐らくこれを説明する理屈があるのだろうけど、何だかちょっと気持ち悪い。
と、思いました。
参考まで。
*1:実際は、もっと多くの情報を取り出すことが出来る。