文字列型の列挙体?

文字列型の列挙体?

かつて、

akashi-keirin.hatenablog.com

こんなことを試みたことがあった。

しかし、PredeclaredIdTrueにしたクラスモジュールを用いていたために、必ずクラス名を記述しなくてはいけなかった。

これはイマイチである。

XlLineStyle列挙体を用いるときに、必ずXlLineStyle.xlContinuousと書かねばならんようなものだからである。

チャクラ開く

ちょっと待てよ……。

クラスモジュールを使うから、クラス名記述の強制という問題が起こるのだ。……ということは、

標準モジュール使えばよくね?

ええ、おチャクラ開きましたとも。

標準モジュールのPropertyを使う

標準モジュールを挿入して、オブジェクト名をWaruguchiにする。

で、次のコードを記述。

標準モジュール Waruguchi
Option Explicit

Public Property Get wgAho() As String
  wgAho = "アホ"
End Property

Public Property Get wgBoke() As String
  wgBoke = "ボケ"
End Property

Public Property Get wgKasu() As String
  wgKasu = "カス"
End Property

Public Property Get wgSuttokoDokkoi() As String
  wgSuttokoDokkoi = "スットコドッコイ"
End Property

列挙体の要素っぽい名前にして、全部Property Getにしたったw

使ってみる

別の標準モジュールで利用しようとしてみる。

f:id:akashi_keirin:20191109083832g:plain

おお! いい感じではないか!

出来上がったのが次のコード。

リスト1 標準モジュール
Private Sub test()
  Call MsgBox(wgAho)
End Sub

これだけ。

こいつを実行すると、

f:id:akashi_keirin:20191109083830j:plain

うむ。すばらしい。

ちょっと待て!

なるほど、標準モジュールの場合、名前かぶりさえなければ、親モジュールの記載がなくてもメソッドやプロパティを呼ぶことができる。だから、このようなことができた。

しかし!

列挙体のメリットは、一族をまとめるだけに非ず。引数や返り値の型に指定できるところにあるのだ。

f:id:akashi_keirin:20191109083843g:plain

標準モジュールは「型」ではなかった……orz

おわりに

……というわけで、派手に頓挫。

まあ、たとえば、Waruguchiモジュールのコードを

Option Explicit

Public Enum WgWaruguchi
  wgAho = 1
  wgBoke
  wgKasu
  wgSuttokoDokkoi
End Enum

Public Property Get Waruguchies( _
                ByVal kindOfWaruguchi As WgWaruguchi) As String
  Dim ret As String
  ret = "ち~んw"
  Select Case kindOfWaruguchi
    Case wgAho: ret = "アホ"
    Case wgBoke: ret = "ボケ"
    Case wgKasu: ret = "カス"
    Case wgSuttokoDokkoi: ret = "スットコドッコイ"
  End Select
  Waruguchies = ret
End Property

にしておいたら、

Call MsgBox(Waruguchies(wgSuttokoDokkoi))

みたいにして呼べるけど、これもあんまりキレイじゃないしね。

……というわけで、派手に頓挫したのでした。ニンニン……。