-
∨目次
- Enum を定義する
- Enum の使い方
- Enum な文字列
- ビット演算
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に使用できるスコープは 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
スポンサーリンク