はじめに
VBAでプログラムを書いていると、「もし shippingType
が 1
なら通常配送、2
なら速達…」のように、特定の数値を特定の意味として扱う場面がよくあります。
' マジックナンバーを使った悪い例
Sub ProcessOrder(shippingType As Long)
If shippingType = 1 Then
' 通常配送の処理...
ElseIf shippingType = 2 Then
' 速達の処理...
End If
End Sub
このようなコード内の意味が分かりにくい数値 (1
, 2
など) は「マジックナンバー」と呼ばれ、後からコードを見返したときに「この 1
って何だっけ?」となりやすく、バグの原因にもなります。
この問題を解決するのが、VBAの Enum
(列挙型) です。Enum
を使うと、これらの数値に分かりやすい名前を付け、コードを劇的に読みやすく、安全にすることができます。
Enum
(列挙型) を使ったサンプルコード
Enum
を使うと、先ほどのコードは以下のように書き換えられます。
完成コード
' --- Enum(列挙型)を定義 ---
' モジュールの先頭(Option Explicit の下など)に記述します
Public Enum ShippingMethod
shipStandard = 1 ' 通常配送
shipExpress = 2 ' 速達
shipOvernight = 3 ' 翌日便
End Enum
' --- Enumを使った良い例 ---
Sub ProcessOrder_EnumVersion(deliveryType As ShippingMethod)
Select Case deliveryType
Case shipStandard
MsgBox "通常配送で処理します。"
Case shipExpress
MsgBox "速達で処理します。"
Case shipOvernight
MsgBox "翌日便で処理します。"
End Select
End Sub
' --- 実行用のサンプルマクロ ---
Sub Test_ProcessOrder()
' Enumのメンバーを直接指定して呼び出す
Call ProcessOrder_EnumVersion(shipExpress)
End Sub
コードの解説
Public Enum ShippingMethod ... End Enum
:ShippingMethod
という名前で、新しいデータ型グループ(列挙型)を定義しています。その中で、shipStandard
という名前が内部的に1
という数値を持つ、といった対応付けを行っています。deliveryType As ShippingMethod
: マクロの引数のデータ型として、Long
などの数値型ではなく、先ほど定義したShippingMethod
を指定しています。これにより、この引数にはshipStandard
,shipExpress
,shipOvernight
のいずれかしか渡せなくなり、間違いが起こりにくくなります。Case shipStandard
:If
文やSelect Case
文の中で、1
や2
といったマジックナンバーの代わりに、shipStandard
のような意味のある名前が使えるようになります。
Enum
のメリット
1. コードの可読性が飛躍的に向上する
If myStatus = 2
よりも If myStatus = statusCompleted
の方が、コードの意図が一目瞭然です。
2. 入力補完が効く
VBEでコードを入力する際、ProcessOrder_EnumVersion(
と打つと、ShippingMethod
のメンバー (shipStandard
など) が候補として表示されます。これにより、入力ミスを防ぎ、開発効率が向上します。
3. バグの防止
引数の型を Enum
で指定することで、定義されていない不正な値(例: 5
)が誤って渡されるのを防ぐことができます。
まとめ
今回は、VBAの Enum
(列挙型) を使って、コードから「マジックナンバー」を追放し、可読性と保守性を高める方法を解説しました。
Enum
は、関連する一連の定数に名前を付けてグループ化する機能。- コード内の
1
,2
,3
… といった数字が、意味のある単語に置き換わる。 - 入力補完が効き、タイプミスなどのバグも減らせる。
最初は少しとっつきにくいかもしれませんが、Enum
を使いこなすことは、より高品質でメンテナンスしやすいVBAコードを書くための重要なステップです。ぜひ積極的に活用してみてください。