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

Excel マクロ、VBA

スポンサーリンク

はじめに

※今回の記事は、Excel VBAで、変数とかくらいはある程度分かる方を対象にします。

Excel VBAで、Enumとか列挙型変数とかいう言葉を聞いたことがあるだろうか。

たぶんガチ勢の人達でも、このEnumについては、イマイチ使い所が分からないとかいう方も多いと思う。

というのもExcel VBAでは様々な種類の変数とか定数を扱うことができるので、このEnumというのをわざわざ使おうという考えになかなか至れない、他の変数とかとの違いや特有のメリットを見出しにくいというのがあるからだ。

そこで、Enum特有のメリット等についての記述は次回の記事で扱うが、今回はまず、

  • Enumも変数も定数も何も使わないことのデメリット
  • Enumを使ってみようと言われたとき、まず思い浮かぶ疑問
から先に取り上げてみたい。

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

2019年4月25日

大量の数値項目を扱うにあたって

Enumの使い道を一言で言うと、数字(定数)に名前を付けて分かりやすく管理する、ということになる。

なお、Enumとかは数字に名前を付けることができるわけだが、それに対し、名前が付けられていなくて単に1,2,3,・・・とベタで書かれた数字は「マジックナンバー」と呼ばれるので、以降もその表記を使う。

たとえば下図の表では、横に12の項目(列)があって結構多い。
実務では、これの何倍もの列がある表を扱うことも珍しくない。

で、そんな多数項目を持つ表で、この項目はこの処理・あの項目にはあの処理と、個々の処理を大量にマクロに書いていくことも多い。

私がEnumを使う場面は、専らこれだ。
大量の項目(列)を持つExcelシートにおいて、どの列が何の項目かというのを、名前を付けて分かりやすく扱いたいという場面が、Enumの最大の活躍の場だと思う。

ではそういうとき、何列目が何の項目かなんてことをマジックナンバーで書いていってたら、読んでて何のことかさっぱり分からない間の抜けたソースコードになってしまう。

間の抜けたソースコードの例。意味が分からないだろうし分かろうとしなくていい。

このソースコードでは、

Cells(r,

というやつに続けて、列番号をマジックナンバーで入力しまくっているが、どれが何の列番号なのか全く分からないはずだ。

間が抜けていると一言で言ったが、こういうExcelの列番号をマジックナンバーで表記することのデメリットをもう少し具体的に挙げよう。

マジックナンバー表記のデメリット
    1. なんといってもマジックナンバーでは、その数字が何の項目に対応しているのか、全く意味不明。
    2. 自分でフォームとして作るExcelシートは、試行錯誤の中で、列の構成を変えることがしょっちゅうだ。
      そういうとき、どの項目が何番目の列にあるかということを、マジックナンバーで変化に対応し管理しきれるものではない。
    3. そして列の構成が変わったとき。マジックナンバーを複数箇所で使っている場合、それら全てを書き換えていかないといけない。

で、1,2,3,・・・というマジックナンバーではなく、読んで分かる言葉の名前を付けようというのがEnumの目的だが・・・。
そこで必ず疑問になるのが、単なるLong型とかの変数・定数じゃいけないの?ってことだ。

ある程度慣れてる人なんかはConstとか使って定数を書き、コメントなんかもソースコードに書き込みまくって分かりやすくしようとかする。

Const定数を使って改良した例

けっこう分かりやすくなったんじゃないだろうか。

Enumを使ってみたソースコード

で、これに対して、Enumを使う理由としてよく言われるのが、こういう数字に関する定数はグループ化して扱いたいというようなことだ。

上記のちょっと改良したソースコードでは

というように色々なConst定数を盛り込んだ。

でも、ソースコードが大量になって、他の多種多様な定数・変数が入り乱れるようになってくると、どうだろうか。

最初に定義したgyoNoとかpostalCodeとかのConst定数がいずれも、元の表の列番号を表す役割を共通して持つのだということは、これでは分かりにくい。

ということで、こういう数字の定数を共通のグループにまとめようということでEnumを使うと便利だといわれる。
例として次のような感じだ。

このソースコードの細かい意味はまだ分からなくて良いが、eColumn というEnum変数を使って、列番号に関する各種定数をグループ化してる感じだ。

そしてこのグループ化をしたことによって、
eColumn.
まで手入力すると入力候補が自動表示されるので、定数を入力しやすくなる、ということがよく言われることだ。

↓の動画に示したけど、この例では「eco」まで入力した時点でショートカットキー
Ctrl + スペースキー
で入力補完により「eColumn」を完成させ、次にピリオド「.」を入力するとまた自動的に候補が表示されている。


で、私が長らく疑問に思ってたのが「でもこれと同じことだったらさ、Const定数でもできるんじゃね?無理してEnum使うことなくね?」ということだった。

前述のConst定数を用いたソースコードにおける諸々のConst定数について、先頭に共通して「column_」とか付けたものにして次のように変更すれば、定数のグループ化もできるし入力補完もけっこう使えるようになる。

こうなると、Enumなんて見慣れないものをわざわざ新たに覚えなくても良いんじゃないか?という話になる。
ということで、それでも敢えてEnumを使うことの特有のメリット等について、次回の記事で述べることにする。

スポンサーリンク