VBA Enum 列挙型を定義する

はじめに

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

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

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

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

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

定数を宣言するには「定数」をご覧ください。
  • 目次
    • Enum を定義する
    • Enum の使い方
    • Enum な文字列
    • ビット演算

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
詳しくは「ビット演算」をご覧ください。