目次
概要
列挙型に関する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/基本/列挙型/' には、下位層のページがありません。
リンク集
重複を恐れないリンク集。
- 列挙型 - Wikipedia
- Enum ステートメント (VBA) | Microsoft Docs
- VBA 列挙型 Enum - Tipsfound
- 列挙型変数を使う:Excel VBA|即効テクニック|Excel VBAを学ぶならmoug
- 列挙型(列挙体)Enum|VBA入門
- VBA 列挙型変数を使ってみる「列挙型変数Enum」 | E-VBA
- Excel VBA 列挙型変数Enumについて(1)数字の定数を扱う方法あれこれ | Excel Excellent Technics
- Excel VBA 列挙型変数Enumについて(2)Enum特有のメリット、運用方法など | Excel Excellent Technics
- エクセルExcel大事典 VBAマクロ 組み込み ユーザー 定数 列挙型 列挙体 Enum リテラル
- 【Excel VBA】Enum(列挙型)のメンバ取得関数の作成例: Serene diary almost day-to-day
- Enum(列挙体)の裏技【VBA】 - reimeのメモ帳
- Enumの謎挙動 - 素人がExcelVBAによる「一人働き方改革」に挑むブログ
- Remember The Time: [VB6, VBA] 定義されているはずの enum でコンパイルエラーが発生する。
- vba — Excel VBA-列挙型要素の値を設定する
- Excel VBAの列挙型を使ってセルを指定する。 - t-hom’s diary
- VBA Enumの名前は省略できる: A2のブログ
- 配列/動的配列/構造体/列挙型/エスケープシーケンス[ExcelのVBA]
- エクセルVBAでテーブルと列挙体を組み合わせると最強のコードが書ける理由
動画
- (伊川直助) 【Excel VBA】列挙型変数を説明。逆引辞典の使い方も説明します。 - YouTube
- (なんちゃってプログラマ) 【VBA学習】No.64 列挙体(Enum)ってなに? - YouTube
- (WiseOwlTutorials,En) Excel VBA Introduction Part 26 - Constants and Enumerations (Const, Enum) - YouTube
- (codekabinett.com/en) Better VBA 4 - Using Enums (Enumerations) in VBA - YouTube