本ページには広告が含まれています。

【Excel VBA】Enum(列挙型)を定義して使う方法

Excel VBA Enum(列挙型)を定義して使う方法
画像はCanva「Text to Image」で生成しました

列挙型とは、複数の定数をひとまとめにして名前を付けたデータ型です。Enumステートメントで定義することができます。

今回は Enum(列挙型)を Excel VBA で定義する方法やその使い方について紹介します。

スポンサーリンク

はじめに

列挙型を使うと、固定の数値が列挙されるので参照しやすくなります。

例えば、列の位置を列番号で直接記述いる場合、列追加や削除などで位置が変更された場合、コード内のすべての記述個所を変しなければならず大変な作業になります。

そんな場合、列挙型で列名を定義していれば、定義部分の修正だけで済みます。列挙型を使用することでVBAコードの可読性やメンテナンス性を向上させることが出来るというわけです。

【この記事でわかることは】
・Enum(列挙型)の定義方法と使い方

スポンサーリンク

Enum(列挙型)を定義する

列挙型を定義するには、Enumステートメントをモジュールレベルで記述します。

VBAリファレンスに書いてあるEnumステートメントの構文は次のとおりです。

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

  • [Public | Private] で列挙型のスコープを指定できます。省略時の規定は Public です。
  • name(必須)で列挙型名を指定します。
  • membername(必須)は列挙型の要素(メンバー)名を指定します。
  • [= constantexpression](省略可能)で要素名の値をLong型の定数で指定します。
    省略した場合は 0 (最初の要素名の場合) または 直前の要素名の値に 1 を加えた値です。

Enum ステートメントの定義例

Enum(列挙型)の定義例をいくつか紹介します。

[= constantexpression] 要素の値を省略した場合

enumTest という列挙型名で3つの要素を定義しています。

[= constantexpression] の値を指定せず省略した場合は次のようになります。

[= constantexpression] 要素の値を省略した場合

省略した場合は、最初の値は「0」になります。それ以降は、直前の要素の値「+1」となります。

列挙型はインテリセンスが効きます

コード入力時に列挙型で宣言された要素がインテリセンス(自動入力補完機能)されるのでコーディングが楽になり可読性が向上します。

列挙型名まで入力し「.」を打つと、型で宣言した要素が候補として一覧で表示されます。

最初の要素だけに値を指定した場合

最初の要素に値を指定した場合、それ以降の要素は直前の要素の値「+1」となります。

最初の要素に値「1」を指定した例
最初の要素に値「1」を指定した例
最初の要素にマイナスの値「-1」を指定た例

次のように、マイナスの値も指定できます。

最初の要素にマイナスの値「-1」を指定た例

各要素に値を指定する

要素の値を省略せずに指定している例です。値は Long型 の定数で指定します。

各要素に値を指定した例

途中の要素で指定が省略されていた場合は、直前の要素の値「+1」となります。

きちんと指定すれば値の大小は問いません。自由に設定できます。

各要素に値を指定する例2

列挙型で表の列番号を表示する

Enum 列挙型名 で列見出しを各要素名に指定し、その値に列番号を次のように代入します。

要素の値を省略した場合「0」開始になってしまうので、初期値には開始列(ここでは「1」)を指定しています。

列挙型で表の列番号を表示する例

Excel VBA シートの表データからクラスを作成 (Lv.9)の表データを使っています。

列に変更があった場合の対応例

当初設定した表の構成が後日変更になることは結構ありがちです。

そんな場合、列挙型なら定義部分を変更するだけで対応でるのですごく便利です。

列に変更があった場合の対応例

実行結果は、Debug.Print で表示していますが、セルに入力する場合は次のような感じです。

Option Explicit
Enum colNo
  '1列目は空欄
  項目名 = 2    '2列目から
  飼い主名前 = 3
  飼い主年齢 = 4
  '5列目は空欄
  ペット名前 = 7
  ペット年齢 = 8
  ペット種類 = 6  'ペットの先頭列に移動
  ペット性別 = 9
End Enum

Sub test2()
  Cells(1, colNo.項目名) = "項目名"
  Cells(1, colNo.飼い主名前) = "飼い主名前"
  Cells(1, colNo.飼い主年齢) = "飼い主年齢"
  Cells(1, colNo.ペット種類) = "ペット種類"
  Cells(1, colNo.ペット名前) = "ペット名前"
  Cells(1, colNo.ペット年齢) = "ペット年齢"
  Cells(1, colNo.ペット性別) = "ペット性別"
End Sub

値を取得するには「列挙型名.要素名」と入力します。違う列挙名に同じ要素名が無い場合は「要素名」だけでも取得可能です。

実行結果が次の画像です。ちゃんと列位置が変更されているのが確認できます。

列に変更があった場合の対応例の実行結果

まとめ(おわりに)

Enum(列挙型)の定義方法と使い方についてお伝えしました。
少しでもお役に立てたなら幸いです(^^;

さいごに、VBA Enum(列挙型)のメリットとデメリットを列挙しておきます。

【メリットの一部】

  • インテリセンス機能が使えるので、コーディングが楽になる。
  • 定数の値を覚えておく必要がなくなるので、コードが読みやすくなる。
  • 定数の値を変更しなければならない場合、列挙型の定義を修正するだけでよいのでメンテナンス性が向上する。
  • 定数の名前に誤りがある場合はコンパイルエラーになるので、バグの発生を防止することができる。

【デメリットの一部】

  • 列挙型は整数型(Long)しか扱えないので、文字列や小数などは定数としてまとめることができない。
  • 列挙型はモジュールレベルでしか定義できないので、プロシージャ内で使いたい場合でもモジュールレベルで宣言するしかない。

★★★ ブログランキング参加中! クリックしてね(^^)/ ★★★

スポンサーリンク
スポンサーリンク

過去記事のサンプルファイルをダウンロードできます

この記事で使用したサンプルの登録はありません。
過去の記事で使用したサンプルファイルをダウンロードできるようにページを設置していますので、こちら(このリンク先)からご利用ください