ゆんの業務改善ブログ

①生産性向上 ②業務改善 ③自動化 について情報発信しています。VBAプログラムは本当の初心者から他のアプリケーションを呼び出して使う上級者的な使い方まで幅広いレベルで解説していきます。

VBA Enumで数値の定数をまとめて定義する

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で囲む
列挙型定数の定義のしかた

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列の売上高の列に掛け算の結果が入力できました。

D列が入力された
実行結果

このプログラムのどこが良いかと言うと、Subプロシジャの中でセルの行番号や列番号をすべて定数、もしくは変数が使われているという点です。2や3と言った数値そのものが使われていません。このような2や3と言った具体的な値(文字列含む)の事をリテラルがプログラムの中に多用されることはあまり歓迎されていません。

理由はプログラムを見ただけではその2や3という数字がどこから来たのかがわかりづらいためです。今回のサンプルプログラムは短いので問題ありませんが、少し長くなるとあっという間にプログラムの可読性が落ちてしまうので、できればリテラルではなく定数を使うほうが好ましいと言えます。このため、列番号をヘッダ名で定数としてまとめて定義できるEnumはとても便利なのです。今回のサンプルのように売上高集計表.売上高列と言った表記になるため、この行を見ただけで売上高集計表と言う表の売上高の列を更新するプログラムなんだな、と分かります

Enumで定義すると入力補助が出る点も魅力的だと言えるでしょう。

また、メリットの項で説明したようにEnumは複数宣言することができます。Enum-End Enumを宣言セクションに複数記述することができるということです。これは処理するシートが複数あるような場合に使えます。今回は売上高集計表というシートを更新するサンプルでしたが、ほかにも商品マスタや顧客マスタといったようなシートがある時にシートごとにEnumを用意して列番号を定義することができます。

Enumで数値の定数をまとめて定義するまとめ

この記事の内容をまとめます。

  • Enum-End Enumを使うメリットはカテゴリごとに定数を定義できること
  • Enumは宣言セクションに記述する
  • Publicをつける、または何もつけないとどのモジュールのどのプロシジャからでも使える定数となる
  • 同じ定数名で別モジュールで別の定数として使うにはPrivateをつけて定義する必要がある
  • Enumは整数しか定義できない

以上、Enumで数値の定数を定義する方法と使いどころについて解説しました。

<関連記事>