整数以外の列挙体っぽい定数を実現する

整数型以外の列挙体ぽいものを実現する

題名が分かりにくくてすまない。

最近、VBA Deveroper's Handbookにハマっている。

んで、その中で面白そうなアイディアを発見したので、ちょっと実験してみた。

今出先で、『VBA Deveroper's Handbook』が手元にないため、概略だけ記すと、〈クラスモジュールを使ってオリジナルの組み込み定数的なものを作る〉といったもの。(このあたり、記憶があやふやなので、後で修正するかも知れません。そのときは、本文からの引用も交えて書き改めたいと思います。)

通常、組み込み定数といえば、列挙体として定義されているように思う。

もちろん、自作の列挙体ということになれば、Enumを使えば良いのだけれど、要素名の重複の問題もあって、イマイチ使いづらいなあと思っていた。

また、基本的に整数をテキトーな名前で表現できる、というだけなので(当り前)、文字列なんかをグループにして扱いたいときには、けっこう面倒だった。

Enumのかわりにクラスモジュールを使う

そこで、クラスモジュール。

たとえば、「XlLineStyle列挙体」だったら、「XlLineStyle」の部分をクラスモジュールにする。

で、「XlLineStyle.xlContinuous」の「xlContinuous」の部分、すなわち要素名の部分をPropertyにすれば、整数だけでなく、いろいろなものを定数的に使えるのだ。

サンプルクラス

クラスモジュールを挿入し、次のようなアホみたいなクラスを作ってみる。

リスト1 クラスモジュール
'オブジェクト名は「Waruguchi」です。'
Option Explicit

Private waruguchies_(4) As String    '……(1)'

Public Property Get Waruguchi(ByVal i As Long) As String    '……(2)'
  Waruguchi = waruguchies_(i)
End Property

Private Sub Class_Initialize()    '……(3)'
  waruguchies_(0) = "アホ"
  waruguchies_(1) = "ボケ"
  waruguchies_(2) = "カス"
  waruguchies_(3) = "デコスケ"
  waruguchies_(4) = "スットコドッコイ"
End Sub

(1)の

Private waruguchies_(4) As String

はデータ(笑)を入れておくためのPrivate配列変数の宣言。

今回は、配列にした。別に、個別の変数にしても良い。

(2)の

Public Property Get Waruguchi(ByVal i As Long) As String
  Waruguchi = waruguchies_(i)
End Property

Propertyの設定。

引数を受け取ってPrivate配列変数の要素を返すようにしている。

めんどくさいので、特にエラー対応はしていない。

あと、(3)からの7行

Private Sub Class_Initialize()
  waruguchies_(0) = "アホ"
  waruguchies_(1) = "ボケ"
  waruguchies_(2) = "カス"
  waruguchies_(3) = "デコスケ"
  waruguchies_(4) = "スットコドッコイ"
End Sub

は、初期設定。インスタンス化された時点でPrivate配列変数Waruguchies_()にデータ(笑)が入っていないといけないので、Class_Initializeでデータ(笑)をぶち込むようにした。

使ってみる

いちいちインスタンス化しないと使えないのでは不便極まりないので、一旦クラスモジュールをエクスポートし、テキストエディタで開いて、Attribute VB_PredeclaredIdの右辺をTrueにしておく。

これで、インスタンス化の手順を踏まずに、「Waruguchi」とクラス名を書けばオブジェクトとして利用できる。

下ごしらえが済んだら、次のコードで実験。

スト2 標準モジュール
Public Sub testClassConstant()
  Dim i As Long
  For i = 0 To 4
    Debug.Print Waruguchi.Waruguchi(i)
  Next
End Sub

もはや説明する必要はあるまい。

WaruguchiオブジェクトのWaruguchiプロパティの引数に04を渡して、順に文字列を表示するだけのコード。

こいつを実行すると、

f:id:akashi_keirin:20181205204515j:plain

この通り。

おわりに

今回はめんどくさいので配列にしたけれど、気の利いたProperty名を個々に設定することで、複数の文字列をはじめとする整数以外のデータをひとまとめにして定数のように扱えると思う。