【Excel VBA】Enum(列挙型)のメンバ取得関数の作成例

C#やVB.net(最近の言語というくくり?)では、Enum(列挙型)のメンバー一覧が、簡単に取得できるがVBA だとそうはいかない。

ただし、ちょっとしたマクロでもソースの可読性が高くなる定数やEnumは使うべきだし、そのメンバーを文字列で取得したい。

そう思って作成したサンプル

VBAに汎用的な関数がない以上、ユーザーサイドで変換関数(この場合ToString)を作成する必要がある。

作成する以上は、できるだけ煩雑にならないようにしたいので、引数は全てoptionalで定義した。

そして、複数のEnumでも変換できるように工夫している。

クラスをつかって、うまいこと多態性を持たせられないかと考えてみたけど、ちょっとしたExcelのマクロレベルなら

この程度で十分だと思う。

Option Explicit

Enum System
    TypeA = 0
    TypeB
    TypeC
    [_END] = -1
End Enum

Enum Area
    West = 0
    East
    [_END] = -1
End Enum

Enum Time
    [09:00] = 0
    [10:00]
    [11:00]
    [12:00]
    [13:00]
    [_END] = -1
End Enum

Function 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 Function

Sub 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 E1

End Sub

コメント

タイトルとURLをコピーしました