C#やVB.net(最近の言語というくくり?)では、Enum(列挙型)のメンバー一覧が、簡単に取得できるがVBA だとそうはいかない。
ただし、ちょっとしたマクロでもソースの可読性が高くなる定数やEnumは使うべきだし、そのメンバーを文字列で取得したい。
そう思って作成したサンプル
VBAに汎用的な関数がない以上、ユーザーサイドで変換関数(この場合ToString)を作成する必要がある。
作成する以上は、できるだけ煩雑にならないようにしたいので、引数は全てoptionalで定義した。
そして、複数のEnumでも変換できるように工夫している。
クラスをつかって、うまいこと多態性を持たせられないかと考えてみたけど、ちょっとしたExcelのマクロレベルなら
この程度で十分だと思う。
Option Explicit
Enum System
TypeA = 0
TypeB
TypeC
[_END] = -1
End EnumEnum Area
West = 0
East
[_END] = -1
End EnumEnum Time
[09:00] = 0
[10:00]
[11:00]
[12:00]
[13:00]
[_END] = -1
End EnumFunction ToString(Optional ByVal s As System = System.[_END], Optional ByVal A As Area = Area.[_END], Optional ByVal T As Time = Time.[_END]) As String
Dim w As String
w = ""
If Not s = System.[_END] Then
Select Case s
Case System.TypeA
w = "TypeA"
Case System.TypeB
w = "TypeB"
Case System.TypeC
w = "TypeC"
End Select
End If
If Not A = Area.[_END] Then
If Not w = "" Then w = w & " "
Select Case A
Case Area.East
w = w & "East"
Case Area.West
w = w & "West"
End Select
End If
If Not T = Time.[_END] Then
If Not w = "" Then w = w & " "
Select Case T
Case Time.[09:00]
w = w & "09:00"
Case Time.[10:00]
w = w & "10:00"
Case Time.[11:00]
w = w & "11:00"
Case Time.[12:00]
w = w & "12:00"
Case Time.[13:00]
w = w & "13:00"
End Select
End If
ToString = w
End FunctionSub test()
Dim E1 As System
Dim E2 As Area
Dim E3 As Time
For E1 = System.TypeA To System.TypeC
For E2 = Area.West To Area.East
For E3 = Time.[09:00] To Time.[13:00]
‘ Debug.Print ToString
‘ Debug.Print ToString(E1)
‘ Debug.Print ToString(, E2)
‘ Debug.Print ToString(, , E3)
‘ Debug.Print ToString(E1, E2)
‘ Debug.Print ToString(E1, , E3)
‘ Debug.Print ToString(, E2, E3)
Debug.Print ToString(E1, E2, E3)
Next E3
Next E2
Next E1End Sub
コメント