IT系/VBA/基本/列挙型

Last-modified: 2020-07-18 (土) 09:13:22

目次


概要

列挙型に関するVBAのTIPS。

列挙型とは

列挙型とはLong 型の定数をグループ化したようなもの。
文字列などは指定できない。

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

Enumの宣言

  • Enumステートメントを使用して宣言する。
    Enum 列挙型
  • モジュールの一番上(プロシージャの記述より上)*1に宣言する必要がある。
  • 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 の名前に使用できない文字がある。

Enum の使い方

  • 値を取得するには列挙型名.要素名のように入力する。
    Dim i As Long
    i = VbMsgBoxResult.vbOK ' vbOK の値を取得する
  • Enum は定数なので値を後から変更できない。
    VbMsgBoxResult.vbOK = 2 ' エラー、値は変更できない
  • Enum は選択肢や状態が 3 通り以上必要なときに便利(Boolean では 2 通りまで)。
    関数の戻り値や引数の型を 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 のスコープ

  • 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

TIPS

別ページの一覧を入れる。

'IT系/VBA/基本/列挙型/' には、下位層のページがありません。

リンク集

重複を恐れないリンク集。

動画

その他メモ



*1 宣言セクションというらしい