VBA入門
列挙型(列挙体)Enum

ExcelマクロVBAの基本と応用、エクセルVBAの初級・初心者向け解説
公開日:2013年5月以前 最終更新日:2023-05-17

第109回.列挙型(列挙体)Enum


列挙体は、数値限定のConst定数をひとまとめにして参照しやすくしたものになります。
マクロVBAの中で、意味を持つ固定数値を直接記述することは、マジックナンバーとも呼ばれメンテナンス性がとても悪いものになってしまいます


例えば、列位置3(C列)を参照する場合、VBA内で何度も3と記述していては後で変更することが大変になります。
そもそも列位置3(C列)は何かという事がVBAコードから読み取れません。
そして、これが列位置4(D列)、列位置5(E列)、・・・と何列にも及んでいたら・・・

このような固定数値が連なって列挙される場合はEnumステートメントで列挙型を定義します。
Enum(列挙型)を使用することで可読性の良いVBAコードになります。


Enumステートメント

列挙型は、ある特定の正数値でしか初期化できないデータ型です。
Enumステートメントを宣言セクションに記述して使用します。

[Public | Private] Enum name
  membername [= constantexpression]
  membername [= constantexpression]
  ・・・
End Enum

Public 省略可能です。
列挙型 (Enum) が、プロジェクト全体から参照可能であることを指定します。
列挙型の既定値は、Public です。
Private 省略可能です。
列挙型 (Enum) が、宣言されているモジュール内でのみ参照可能であることを指定します。
name 必ず指定します。
列挙型 (Enum) の名前を指定します。
引数 name は Visual Basic において有効な識別子でなければなりません。
この名前は、列挙型の変数またはパラメータの宣言において、データ型として指定されます。
membername 必ず指定します。
定数の名前を指定する Visual Basic において有効な識別子です。
この名前により、列挙型 (Enum) の構成要素であることが認識されます。
constantexpression 省略可能です。
長整数型 (Long) として評価される、要素の値を指定します。
ほかの列挙型 (Enum) と同じ値も指定できます。
先頭を指定しないと、0が割り当てられます。
2番目以降を指定しないと、直前の値の+1が割り当てられます。

Enum ステートメントは、モジュール レベルでのみ記述できます。
正の値と負の値のどちらでも含むことができます。
変更する必要がない複数値をグループ化するときは、とても効率的です。

さらに列挙型の良い所は、インテリセンス(自動入力補完機能)が使用できるところです。
列挙型 (Enum) の名前まで入力するとメンバーが自動表示されます。
これによりコーディングが楽になり、また、可読性も向上します。
VBA マクロ Enum 列挙

constantexpression(要素の値)を省略した場合

先頭の要素の値を省略した場合は0になります。
2番目以降は直前の値の+1になります。

Enum enumSample1
  a1 '0
  a2 'a1+1=1
  a3 = 11
  a4 'a3+1=12
  a5 'a4+1=13
End Enum


constantexpression(要素の値)に定数地や数式を指定した場合

Enum enumSample2
  a1 = 3
  a2 'a1+1=4
  a3 'a2+1=5
  a4 = a3 + 10 '=15
  a5 'a4+1=16
End Enum

Const a99 = 10
Enum enumSample3
  a1 = 3
  a2 'a1+1=4
  a3 'a2+1=5
  a4 = a3 + a99 '5+10=15
  a5 'a4+1=16
End Enum

要素の値に、他の定数(列挙を含む)を使った計算式を指定することもできます。


値に定数ではなく変数を指定するとコンパイルエラー

Public b99 As Long
Enum enumSample2
  a1 = 3
  a2 'a1+1=4
  a3 'a2+1=5
  a4 = a3 + b99
  a5 'a4+1=22
End Enum

VBA マクロ Enum 列挙


列挙型(Enumステートメント)の使用例

Enum 列位置
  A列 = 1
  B列 = 2
  C列 = 3
End Enum

Enum 支店番号
  A支店 = 101
  b支店 = 102
  c支店 = 103
End Enum

Sub sample()
  Cells(1, 列位置.A列) = 支店番号.A支店 'Cells(1, 1) = 101
  Cells(1, 列位置.B列) = 支店番号.b支店 'Cells(1, 2) = 102
  Cells(1, 列位置.C列) = 支店番号.c支店 'Cells(1, 3) = 103
End Sub

使い方はいろいろです。
正数値でグループ化出来る場合は、ConstではなくEnumを使った方がインテリセンスも効いてより効率的なコーディングが可能になります。

VBA マクロ Enum 列挙


列挙型(Enumステートメント)の活用について

マクロVBAを書いているときは列位置などは頭に入っているので、固定数値で書くことに不便はないでしょう。
しかし、後々に修正する必要が出たとき、列位置の数値がどこで指定されているかを探すことは、とても大変な作業になります。

B列がC列に変更されたことでマクロVBAを変更するとして、
数値の23に変更するためには、2を検索したとしても、検索された2が列数なのか行数なのか、、、
ひとつずつ前後のVBAコードの確認が必要になります。

そして、列がずれるという事は、B列だけではなくその後ろの列が全て変わるという事になり、
これらを全て正しく変更することは、多大な時間を要することになります。

このような事を考慮して、これに事前に対応する手段として列挙体はとても有効です。
そして、インテリセンスによって非常に効率的にVBAを書くこともできます。
このようにとても便利な機能ですので、ぜひ列挙体を活用してみてください。


サイト内の活用事例

VBA100本ノック 83本目:請求書を作成してPDF出力
・出題 ・頂いた回答 ・解説 ・補足 ・サイト内関連ページ
VBA100本ノック 88本目:クロスABC分析作成
・出題 ・頂いた回答 ・解説 ・補足 ・サイト内関連ページ




同じテーマ「マクロVBA入門」の記事

第102回.Intersectメソッド

・Intersectメソッド ・Intersectの使用例 ・Intersectメソッドの最後に
第103回.UnionメソッドとAreasプロパティ
・Unionメソッド ・Areasプロパティ ・Unionメソッドで連結した結果のRangeオブジェクトの状態について ・Unionメソッドの使用例 ・Unionメソッドの実践例
第104回.GetPhoneticメソッドとSetPhoneticメソッド(フリガナ)
・GetPhoneticメソッド ・GetPhoneticメソッドの使用例 ・SetPhoneticメソッド ・SetPhoneticメソッドの使用例
第109回.列挙型(列挙体)Enum
第110回.ユーザー定義型・構造体(Type)
・Typeステートメントの構文 ・ユーザー定義型の使い方 ・ユーザー定義型の使用例 ・ユーザー定義型の制限 ・最後に
第111回.静的配列
・配列とは ・静的配列と動的配列 ・配列の宣言 ・多次元配列 ・要素の下限の変更 ・配列について
第112回.動的配列(Redim)
・ReDimステートメント ・要素数の変更について ・配列について
第113回.配列に関連する関数
・LBound関数とUBound 関数 ・Array関数 ・IsArray 関数 ・Join関数 ・Filter関数 ・Eraseステートメント
第114回.セル範囲⇔配列(マクロVBA高速化必須テクニック)
・セル範囲⇔配列の基本VBA ・使用例 ・配列およびマクロVBAの高速化に関するページ
第115回.Split関数
・Split関数 ・区切り文字が文字列式内に存在しない場合 ・空文字("")をSplitした場合 ・Split関数の使用例
第116回.ファイル操作Ⅱ(OpenとClose)
・Openステートメント ・Closeステートメント ・OpenステートメントとCloseステートメントの使用例


新着記事NEW ・・・新着記事一覧を見る

ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)
累計を求める数式あれこれ|エクセル関数応用(2024-01-22)
複数の文字列を検索して置換するSUBSTITUTE|エクセル入門(2024-01-03)
いくつかの数式の計算中にリソース不足になりました。|エクセル雑感(2023-12-28)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|VBA入門
4.ひらがな⇔カタカナの変換|エクセル基本操作
5.繰り返し処理(For Next)|VBA入門
6.変数宣言のDimとデータ型|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.セルのクリア(Clear,ClearContents)|VBA入門
10.Findメソッド(Find,FindNext,FindPrevious)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。


このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ