Enumの研究(2)
Enumの研究(2)
前回
の続き。しつこくEnumを追究することにする。
組み込みプロパティ名との衝突
たとえば、Enum「Hoge
」に「Name
」という要素を持たせてみる。
リスト1 標準モジュール宣言セクション
Public Enum Hoge Name = 0 hgFirstElement = 2 hgSecondElement hgThirdElement hgFourthElement hgFifthElement End Enum
Enum「Hoge
」に新しい仲間「Name
」を加えた。
さっそく使ってみる。
イミディエイト・ウインドウに
?Name
と打ち込んで[Enter]。
何ごともなく、Enumのメンバとして仕事をしている。
どうやら、Enumの要素名に組み込みのプロパティ名を用いても問題ないようだ。
ちょっと待て。
実は、問題が生ずる場面があることを私は知っている。
例えば、次のコードをシートモジュールで実行するとどうなるか。
リスト2 Sheet1モジュール
Public Sub test01() Debug.Print Name End Sub
これと全く同じコードを標準モジュールに書いて実行すると、イミディエイト・ウインドウには、
このように出力されるのである。
しかし、シートモジュールに書いて実行すると、
このように、「Sheet1
」と、シート名が表示される。
つまり、「Name
」はEnum「Hoge
」のメンバではなく、Sheet1
オブジェクトのプロパティとして働いたということになる。
これは、ThisWorkbook
モジュールに書いた場合も同じで、ThisWorkbook
モジュールの場合はブック名が返ることになる。
ここまでのまとめ
上記のように、使う場面によって働きが異なる、というのは非常に危険なので、組み込みのプロパティ名も使わない方が無難だろう。
ちなみに、Name
プロパティの場合だとString
型の返り値なので、エラーが出ずに結果が出力されるが、たとえばAutoFilger
のようなオブジェクト型のプロパティだとどうなるか。
次のようにして実験してみる。
リスト3 標準モジュール宣言セクション
Public Enum Hoge Name = 0 AutoFilter = 1 hgFirstElement = 2 hgSecondElement hgThirdElement hgFourthElement hgFifthElement End Enum
リスト4 Sheet1モジュール
Public Sub test01() Debug.Print Name Debug.Print AutoFilter End Sub
これを実行すると、シートにオートフィルターが設定されていないときは、
シートにオートフィルターを設定しておくと、
それぞれこんなエラーが出た。
もちろん、
Debug.Print Hoge.AutoFilter
なら、エラーは出ずに「1
」が出力される。
おわりに
やはり、組み込みのプロパティ名との衝突も避けた方が良いみたい。