更新日:、 作成日:

VBA Enum 列挙型を定義する

はじめに

Excel VBA マクロで Enum 列挙型を定義する方法を紹介します。

Enum 列挙型名 のようにして、Enum 列挙型を定義できます。要素の型は Long 固定です。

文字列を Enum にするには、標準モジュールに Public Const で定数を宣言して代用できます。

Enum の要素名や要素数などは取得できません。

Enum は選択肢や状態を指定するのに便利です。関数の戻り値や引数に使って、3 択以上に処理を分けられます。

定数を宣言するには「定数」をご覧ください。

Enum を定義する

Enum 列挙型名 のように入力します。Enum が列挙型を定義するキーワードです。すべての関数より上に定義します。

Enum の中に 要素名 = 値 のように入力します。すべて Long 型の定数値を設定します。

Enum VbMsgBoxResult
    vbOK = 1
    vbCancel = 2
    vbAbort = 3
    vbRetry = 4
    vbIgnone = 5
    vbYes = 6
    vbNo = 7
End Enum

定数値を指定しないと自動で 0 から連番が設定されます。

Enum OfficeStyle
    Excel  ' 0 最初の要素を省略したときは 0 になる
    Word   ' 1
    Access ' 2
End Enum

必要な要素だけ値を指定したときは 前の定数値 + 1 の値になります。

Enum TipsMsgResult
    OK      ' 0
    Cancel = -3
    Abort  ' -2 前が -3 なので + 1
    Retry  ' -1
    Ignone = 2 
    Yes =  ' 3 ' 前が 2 なので + 1
    No     ' 4
End Enum

他の要素と区別するために同じ定数値を設定することはしません。連番にしたくないときはすべての値を指定します。

Enum の名前に使用できない文字があります。詳しくは「命名規則」をご覧ください。

Enum のスコープ

Enumに使用できるスコープは Public と Private です。Enum に Dim は使用できません。

省略したときは Public になります

Public Enum パブリック
    要素   
End Enum

Private Enum プライベート
    要素   
End Enum

Enum 省略 ' 省略したときは Public になる
    要素   
End Enum
詳しくは「スコープ」をご覧ください。

オブジェクトのメンバーにならない

Sheet1 やクラスに定義された Enum は、オブジェクトの要素になりません。そのため ファイル名.列挙型名 の形式で Enum は使用できません。どこに定義しても 列挙型名.要素名 の形式で使用します。

Public Enum OfficeStyle
    Excel
    Word
    Access
End Enum

Sub 実行()
    Debug.Print(Sheet1.OfficeStyle.Excel) ' エラー、Sheet1 を使用できない
    Debug.Print(Me.OfficeStyle.Excel)     ' エラー、Me を使用できない
    Debug.Print(OfficeStyle.Excel)        ' 使用できる
End Sub

このため標準モジュールに Public で定義するのが一般的です。

Enum の使い方

値を取得するには 列挙型名.要素名 のように入力します。要素名だけでも取得できます。

Dim i As Long
i = VbMsgBoxResult.vbOK ' vbOK の値を取得する
i = vbOK                ' vbOK の値を取得する

Enum は定数なので値を後から変更できません。

VbMsgBoxResult.vbOK = 2 ' エラー、値は変更できない

Enum は選択肢や状態が 3 通り以上必要なときに便利です。Boolean では 2 通りまでです。

VBA の「MsgBox 関数」の戻り値に Enum が使われているので、それを例にして紹介します。

Dim result As VbMsgBoxResult  
result = MsgBox("メッセージ", vbYesNoCancel) ' MsgBox の結果を Enum で取得する

' 結果によって処理を分ける
Select Case result
    Case VbMsgBoxResult.vbYes
    Case VbMsgBoxResult.vbNo
    Case VbMsgBoxResult.vbCancel
End Select
' 関数の引数に Enum を受け取る
Sub Tips(result As VbMsgBoxResult)

    ' 引数の値によって処理を分ける
    Select Case result
        Case VbMsgBoxResult.vbYes
        Case VbMsgBoxResult.vbNo
        Case VbMsgBoxResult.vbCancel
    End Select
End Sub

このように関数の戻り値や引数の型を Enum にして処理を分けられるようになります。複数の分岐があるときは「Select 文」を使用すると便利です。

これを Integer や String で同じことをすると、関連性がわかりづらくなり、また手入力しているので入力ミスする可能性もあります。

Dim result As Integer
result = TipsMsgBox("メッセージ") ' 結果を Integer で取得する例

' 数値が何の結果なのかわかりづらい
Select Case result
    Case 1 
    Case 2
    Case 3
End Select
Dim result As String
result = TipsMsgBox("メッセージ") ' 結果を String で取得する例

' 入力ミスする可能性がある
Select Case result
    Case "Yes" 
    Case "No"
    Case "Cancel"
End Select

Enum な文字列

Enum は Long 型専用で文字列は使用できません。そこで標準モジュールを Enum の代わりにする方法を紹介します。

プロジェクトエクスプローラに標準モジュールを追加したら、[標準モジュール] を選択した状態でプロパティウィンドウから [オブジェクト名] を入力します。これを Enum の名前として使用します。

1

標準モジュールに Public Const で文字列の定数を宣言します。これを Enum の要素として使用します。

標準モジュール1 のコード

Public Const A As String = "A"
Public Const B As String = "B"
Public Const C As String = "C"

Sheet1 のコード

Dim result As String
result = TipsMsgBox("メッセージ") ' 結果を String で取得する例

' 結果によって処理を分ける
Select Case result
    Case EnumString.A
    Case EnumString.B
    Case EnumString.C
End Select

このように 標準モジュール名.定数名 のように入力して Enum な文字列を参照できます。

標準モジュールは型ではないので、変数や引数の型には String を使用します。

同じようにして String 以外の型も使用できます。

ビット演算

次のように 1, 2, 4, 8 … と 2 進数で Enum を定義するとフラグとして使えます。フラグをビット演算すると、要素の組み合わせを判別できます。

Enum Allign
    None = 0   ' 0000
    Top = 1    ' 0001
    Bottom = 2 ' 0010
    Left = 4   ' 0100
    Right = 8  ' 1000
End Enum

Dim 四角 As Allign
四角 = Allign.Top Or Allign.Bottom

If (四角 And Allign.Top) = Allign.Top Then
    Debug.Print("Top")  ' Top を持つ、出力される
End If  
If (四角 And Allign.Left) = Allign.Left Then
    Debug.Print("Left") ' Left を持つ、出力されない
End If
詳しくは「ビット演算」をご覧ください。