更新日:、 作成日:
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に使用できるスコープは 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 の名前として使用します。
標準モジュールに 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
スポンサーリンク