Enumの研究(2)

Enumの研究(2)

前回

akashi-keirin.hatenablog.com

の続き。しつこくEnumを追究することにする。

組み込みプロパティ名との衝突

たとえば、EnumHoge」に「Name」という要素を持たせてみる。

リスト1 標準モジュール宣言セクション
Public Enum Hoge
  Name = 0
  hgFirstElement = 2
  hgSecondElement
  hgThirdElement
  hgFourthElement
  hgFifthElement
End Enum

EnumHoge」に新しい仲間「Name」を加えた。

さっそく使ってみる。

イミディエイト・ウインドウに

?Name

と打ち込んで[Enter]。

f:id:akashi_keirin:20190324153953j:plain

何ごともなく、Enumのメンバとして仕事をしている。

どうやら、Enumの要素名に組み込みのプロパティ名を用いても問題ないようだ。

ちょっと待て。

実は、問題が生ずる場面があることを私は知っている。

例えば、次のコードをシートモジュールで実行するとどうなるか。

スト2 Sheet1モジュール
Public Sub test01()
  Debug.Print Name
End Sub

これと全く同じコードを標準モジュールに書いて実行すると、イミディエイト・ウインドウには、

f:id:akashi_keirin:20190324153956j:plain

このように出力されるのである。

しかし、シートモジュールに書いて実行すると、

f:id:akashi_keirin:20190324153959j:plain

このように、「Sheet1」と、シート名が表示される。

つまり、「Name」はEnumHoge」のメンバではなく、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

これを実行すると、シートにオートフィルターが設定されていないときは、

f:id:akashi_keirin:20190324154003j:plain

シートにオートフィルターを設定しておくと、

f:id:akashi_keirin:20190324154006j:plain

それぞれこんなエラーが出た。

もちろん、

Debug.Print Hoge.AutoFilter

なら、エラーは出ずに「1」が出力される。

おわりに

やはり、組み込みのプロパティ名との衝突も避けた方が良いみたい。