Excel VBA 列挙型変数Enumについて(2)Enum特有のメリット、運用方法など

Excel マクロ、VBA

スポンサーリンク

はじめに

前回の記事では、Excel VBAでEnum(列挙型変数とかいう)というものを扱うに当たって、前段的なことを書いていった。

そして今回、Enumに特有のメリット、活用方法などについて書いていく。

Excel VBA 列挙型変数Enumについて(1)数字の定数を扱う方法あれこれ

2019年4月25日

Enumを使うメリット

前回は、EnumでなくてもConst定数とかで良くないかという疑問を提示した。
では、Const定数とかではなくEnumを使う特有のメリットは何か。

Enumの最大の特有のメリットは、自動で連番を設定できることだと思う。

Enumを使ったソースコードをもう一度書いてみる。

最初の定数「gyoNo」についてだけは
gyoNo = 1
と数値を明記しているが、それ以降のEnum定数には数値を書いていない。

これは、Enumで列挙して書いた数値は連番になる性質があるのを有効利用しているのだ。

これがConst定数だと、どの定数が何の数値に当たるのかは「=5」といったように全て明記しないといけないので手間が掛かる。

Enumは、整数しか扱えないのだけど、整数ならば自動的に連番になってくれるのが最大のメリットだと思う。

なお、最初のgyoNoについて数値を「=1」とか明記しなかった場合、デフォルト値として0が設定されてしまうので、これだけは省略できない。

仮に0始まりだったとしても、最初の1つだけは極力、何の数値なのかは表記を省略しない方が良いだろう。

また次の例では、4列目(姓カナ)と5列目(名カナ)は省略して、6列目のsex(性別)から列の表記を再開するようにしているが、この場合も
sex = 6
と数値を明記してあげれば、それ以降の定数に連番が付加されてくれる。

Enumは何も書かなければ連番になり、逆に数値を毎回明記してあげれば、連番でない数値の列挙を扱うこともできる。

でもそんなことしても、それこそEnumを使う意味はないだろう。
そんなのこそ、Const定数とかでも使えば良い。

ではEnumを使うことのメリットについて、Enum特有のもの・特有ではないもの含めて、改めて整理しよう。

Enumのメリット
  • Enum定数は列挙して書けば、自動的に連番を設定してくれる。
  • 列番号は
    eColumn.gyoNo
    のように名前で扱うようにすることで、どれが何列目かを数字で覚えておく必要が一切なくなる
  • 列の構成・配置を変更したときも、Enum変数の並び順記述の箇所を変えるだけで、変更作業は全て完了する。
  • 前回の記事で示したように、入力補完が使いやすい。

Enumのソースコードの書き方

では、順番的にどうかとも思うが、Excel VBAにおけるEnumのソースコードの書き方について基本から述べていく。

Enumの宣言

最初に書いたソースコードからも分かるように、Enumの宣言をするソースコードは

    Enum ○○
    (Enumを構成する定数を列挙で書いていく)
    End Enum

というようになる。

VBAのソースコードでは、Subで始まるやつ(プロシージャ)とかFunction(ファンクション)とか色々と書いていくけど、Enumの宣言はそれら全ての処理記述よりも前、ソースコードの先頭に独立して書くようにすること。

まず下図では、「Enum eColumn」の記述より先に「Sub enumTest」の中でeColumnを登場させたことによりエラーになっている。

そして下図の例では、eColumnを登場させてはいないのだが、Subの後にEnumを書くなってエラーが表示されている。

処理中での記述方法

Enumの宣言は

    Enum eColumn ‘表の列番号を示すEnum
    gyoNo = 1 ‘行№
    End Enum

というようにするわけだけど、これを実際の処理記述中で使う時は
eColumn.gyoNo
といったようにピリオド . で接続して使うわけだ。

まあこれは、ここまでに示したサンプルソースコードで、だいたい分かるだろう。

オススメ運用ルール等

Enumの名前の付け方

今回例に挙げたEnumでは
Enum eColumn
という名前を付けた。

これは完全に私独自のやり方だが、私はEnumには、Enumであることを明記するため先頭にe文字を付けることにしている。
まあこの辺りは、各自ルールを決めると良いだろう。

擬似的最終項目を設定しよう

今回のEnum eColumnのソースコードでは、mailAddress(メールアドレス)という項目が一番最後にくるようにしてある。
でも、自分でフォームを作成していく場合とか、運用変更があった場合、まだまだこの後に項目を追加していくことは十分に考えられる。

そういうとき、フォームに列が幾つあるのかという項目数を取得する必要が出てくると、最後の項目をmailAddressという固定項目に設定したままで良いとは思えない。

最後の項目はmailAddressという項目だ、ということをイチイチ覚えとかないといけないようでは、マジックナンバーによる運用と同様のデメリットが発生しているといえるしね。

そのため私は、finという擬似的な最終項目を設定して、次のように記述することにしている。

これで項目数は、途中で構成変更があったとしてもいつも
(eColumn.fin – 1)
で取得できるというわけだ。

こういう風に、擬似的な最終or先頭項目を設定する方法は色々な場面で使えるので、覚えておくと良いだろう。

スポンサーリンク