VBAのプログラムで定数をまとめて定義するEnum~End Enumステートメントを解説します。
目次
定数とは
定数とは変更の予定がない値を入れておくもので、上書きできないことと定義時に値を代入する点が変数と異なります。また、変数は宣言と呼ぶのに対して定数は宣言とも定義とも言います。区別がわかりやすいようにこの記事では定数に関しては定義と呼ぶことにします。
定数を使う簡単なサンプルコードを示します。
Sub 定数サンプル() Const 午前中のあいさつ As String = "おはよう" MsgBox 午前中のあいさつ 'メッセージボックスに おはよう と表示される End Sub
Constステートメントに続けて定数名を宣言し、その場で値を代入しています。これが定数の宣言の方法です。定数の使い所や意義などについてはVBA 定数Constの使い所と定数を使う理由で詳しく解説しました。
まとめて定数を定義するメリット
次にまとめて定数を定義するメリットについて説明します。同じカテゴリーの定数をカテゴリーごとにまとめて定義すると、Constで列挙するよりもまとまりがよく、コードがわかりやすくなるというメリットがあります。Enumの文法の説明を後にサンプルコードを掲載してConstを列挙した場合と比較します。
Enum-End Enumの使い方
それでは数値の定数をまとめて定義するEnumステートメントの書き方を説明します。
Enum-End Enumの文法
Enum-End Enumの書き方は、EnumとEnd Enumの間に定数名と値を定義します。
Enum-End Enumはモジュールの一番初めのプロシジャのさらに上の部分に記述します。この部分を宣言セクションと言います。Public/Privateは省略することが可能です。省略するとPublicを記述したのと同じ意味となり、他のモジュールを含めたすべてのプロシジャで使うことができる定数を定義することになります。
一方、PrivateをつけるとそのEnum-End Enumが記述されているモジュールでのみ使うことができる定数となります。同じ定数名の別の定数を別のモジュールで使う場合はPrivateをつける必要があります。
宣言した定数を使うときは、列挙する定数のカテゴリ名.定数名とします。具体的なサンプルは後述します。
Enum-End Enumの注意点
Enum-End Enumの注意点を上げておきます。
- プロシジャの中で定義できない為、ローカルレベルで使うことはできない
- 整数型しか定義できない
- Privateを忘れるとどのモジュールのプロシジャでも使えてしまうので、同名の別の定数には使えない
実際に使う場面になると忘れてしまう為、気を付けましょう。
Enum-End Enumの使いどころとサンプルコード
列挙型の定数の使いどころを紹介します。色番号など数字では意味が分かりにくい値を定数として定義するのがよくある使い方ですが、ここではビジネスでありがちな場面を想定して、エクセルの列番号に定数を使うことを使いどころとして紹介します。
下のような売上実績の集計表を想定します。やりたいことは売上高を求めるために価格と売上数量の列を掛け算した値を売上高の列に記入することです。
'これは宣言セクション、一番上に書きます Private Enum 売上高集計表 商品名列 = 1 価格列 = 2 売上数量列 = 3 売上高列 = 4 データ開始行 = 2 End Enum 'これはEnd Enumの下に書きます Sub 実践的定数サンプル() Dim i As Long Dim 最終行 As Long '最終行取得用 最終行 = Cells(Rows.Count, 売上高集計表.商品名列).End(xlUp).Row For i = データ開始行 To 最終行 Cells(i, 売上高集計表.売上高列) = Cells(i, 売上高集計表.価格列) * Cells(i, 売上高集計表.売上数量列) Next i End Sub
これを実行すると、D列の売上高の列に掛け算の結果が入力できました。
このプログラムのどこが良いかと言うと、Subプロシジャの中でセルの行番号や列番号をすべて定数、もしくは変数が使われているという点です。2や3と言った数値そのものが使われていません。このような2や3と言った具体的な値(文字列含む)の事をリテラルがプログラムの中に多用されることはあまり歓迎されていません。
理由はプログラムを見ただけではその2や3という数字がどこから来たのかがわかりづらいためです。今回のサンプルプログラムは短いので問題ありませんが、少し長くなるとあっという間にプログラムの可読性が落ちてしまうので、できればリテラルではなく定数を使うほうが好ましいと言えます。このため、列番号をヘッダ名で定数としてまとめて定義できるEnumはとても便利なのです。今回のサンプルのように売上高集計表.売上高列と言った表記になるため、この行を見ただけで売上高集計表と言う表の売上高の列を更新するプログラムなんだな、と分かります。
Enumで定義すると入力補助が出る点も魅力的だと言えるでしょう。
また、メリットの項で説明したようにEnumは複数宣言することができます。Enum-End Enumを宣言セクションに複数記述することができるということです。これは処理するシートが複数あるような場合に使えます。今回は売上高集計表というシートを更新するサンプルでしたが、ほかにも商品マスタや顧客マスタといったようなシートがある時にシートごとにEnumを用意して列番号を定義することができます。
Enumで数値の定数をまとめて定義するまとめ
この記事の内容をまとめます。
- Enum-End Enumを使うメリットはカテゴリごとに定数を定義できること
- Enumは宣言セクションに記述する
- Publicをつける、または何もつけないとどのモジュールのどのプロシジャからでも使える定数となる
- 同じ定数名で別モジュールで別の定数として使うにはPrivateをつけて定義する必要がある
- Enumは整数しか定義できない
以上、Enumで数値の定数を定義する方法と使いどころについて解説しました。
<関連記事>
<ゆんの電子書籍>