サイトについて      連絡先   検索

VBA 列挙型 Enum

はじめに

Excel VBA マクロの列挙型 Enum の使い方を紹介します。

Long 型の定数をグループ化したようなものです。それ以外の文字列などは指定できません。

選択肢や状態を指定するのに便利です。関数の戻り値や引数に使って、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 して -2
    Retry  ' -1
    Ignone = 2 
    Yes =  ' 3 ' 前が 2 なので + 1 して 3
    No     ' 4
End Enum

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

要素数を取得することはできません。

Enum の使い方

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


Dim i As Long
i = VbMsgBoxResult.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 のスコープも基本は他と同じです。Dim は使用できません。他の関数より上に宣言します。


Public Enum パブリック
    要素   
End Enum

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

Enum 省略 ' 省略したときは Public になる
    要素   
End Enum  

クラスのメンバーにならない

Sheet1 などのクラスに Public で宣言された Enum は、クラスの Enum になりません。そのためMe.列挙型名で Public な Enum は使用できません。


Public Enum OfficeStyle
    Excel   
    Word   
    Access 
End Enum

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

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

ビット演算

次のように 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
  • 目次
    • Enum を宣言する
    • Enum の使い方
    • Enum のスコープ
    • ビット演算