整数以外の列挙体っぽい定数を実現する
整数型以外の列挙体ぽいものを実現する
題名が分かりにくくてすまない。
最近、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
プロパティの引数に0
~4
を渡して、順に文字列を表示するだけのコード。
こいつを実行すると、
この通り。
おわりに
今回はめんどくさいので配列にしたけれど、気の利いたProperty
名を個々に設定することで、複数の文字列をはじめとする整数以外のデータをひとまとめにして定数のように扱えると思う。