Enumの研究(3)

Enumの研究(3)

こいつら

akashi-keirin.hatenablog.com

akashi-keirin.hatenablog.com

の続き。

今回はちょっと手の込んだことをする。

組み込みプロパティ名と衝突した場合のち~んw珍現象

まず、Sheet1に次のような表を作成しておく。

f:id:akashi_keirin:20190324162940j:plain

次に、Sheet1モジュールに次のコードを書く。

リスト1 Sheet1モジュール
Public Property Get HogeValue(ByVal index As Hoge) As String
  If index = Name Then HogeValue = "Hoge": Exit Property
  HogeValue = Me.Range("A1").CurrentRegion.Item(index)
End Property

そして、EnumHoge」は次のようにしておく。

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

実は、リスト2の入力中、

If index =

まで入力すると、

f:id:akashi_keirin:20190324163000j:plain

このように、クイックヒントが出る。プロパティ「HogeValue」の引数がHoge型なのだから、当り前なのだが、とにかく、VBEの指示通りに入力すると、この行は

If index = Name Then HogeValue = "Hoge": Exit Property

となるのである。

使ってみる

さっそく、Sheet1オブジェクトのHogeValueプロパティを利用するコードを書いて実行してみる。

リスト3 標準モジュール
Public Sub test03()
  Debug.Print Sheet1.HogeValue(Name)
End Sub

こいつをステップ実行してみる。

f:id:akashi_keirin:20190324162945j:plain

引数Nameのところにマウスを当てると、「0」がポップアップする。

この時点では、「Name」は「0」と解釈されている。

この行を実行すると、処理がSheet1Property Get HogeValueプロシージャに移る。

f:id:akashi_keirin:20190324162948j:plain

index」のところにマウスを当てると、「「0」がポップアップするので、引数「index」はちゃんと「0」を受け取っている。当たり前だが。

さらに1行処理を進める。すると、

f:id:akashi_keirin:20190324162953j:plain

あっ。ここで「Name」にマウスを当てると、「Sheet1」がポップアップする。

すなわち、Sheet1モジュール内では「Name」はEnumHoge」のメンバではなく、Sheet1オブジェクトのメンバと評価されてしまうようだ。

当然、そのまま実行すると、

f:id:akashi_keirin:20190324162957j:plain

こうなる。

おわりに

リスト1

If index = Name Then HogeValue = "Hoge": Exit Property

を、

If index = Hoge.Name Then HogeValue = "Hoge": Exit Property

とすれば意図どおりに動作する。

いづれにせよ、やはり組み込みプロパティをEnumの要素名に使うのはやめた方がいい。