マジックナンバーを葬り去れ:Enumで実現する「読み解く必要のない」VBAコード
こんにちは。現場でコードを読み解く際、「この『1』や『3』という数字は一体何を意味しているんだ……?」と頭を抱えたことはありませんか?
いわゆる「マジックナンバー」の撲滅は、プロフェッショナルなエンジニアへの第一歩です。今日は、VBAにおける強力な武器、`Enum(列挙型)`を使った「状態管理」の極意を伝授します。
—
1. なぜ「マジックナンバー」が諸悪の根源なのか
まずは、よくある「残念なコード」を見てみましょう。
‘ 注文ステータスを管理する関数
If status = 1 Then
‘ 処理A
ElseIf status = 2 Then
‘ 処理B
End If
この「1」や「2」が何を指すのか、コードを読んでいる本人は覚えていても、3ヶ月後の自分や他のメンバーは確実に忘れています。これがバグの温床です。「1」が「受付済み」なのか「発送済み」なのか、いちいち仕様書を確認しなければならないコードは、メンテナンス性がゼロと言っても過言ではありません。
—
2. Enum(列挙型)による「意味の付与」
Enumを使うと、この数字たちに「名前」を与えることができます。これにより、コードは「解読するもの」から「読むもの」へと進化します。
Enumの定義と使い方
‘ 標準モジュールの最上部に記述します
Public Enum OrderStatus
OS_Pending = 1 ‘ 受付済み
OS_Processing = 2 ‘ 処理中
OS_Shipped = 3 ‘ 発送済み
OS_Cancelled = 4 ‘ キャンセル
End Enum
これを使うと、先ほどの条件分岐はこう書き換わります。
Sub CheckStatus(status As OrderStatus)
Select Case status
Case OS_Pending
Debug.Print “注文を受け付けました。”
Case OS_Shipped
Debug.Print “発送完了しました。”
Case Else
Debug.Print “その他のステータスです。”
End Select
End Sub
どうでしょう? `status = 1` よりも `status = OS_Pending` の方が、圧倒的に「意図」が明確ですよね。
—
3. 現場で役立つEnum活用の極意
① IntelliSense(自動補完)の恩恵を受ける
Enumを使う最大のメリットは、コード入力時に候補が出ることです。`OS_` と打てば、設定した定数が一覧で表示されます。これにより、タイプミスによるバグを未然に防ぐことができます。
② データ型として定義する
Enumを引数に指定することで、その変数には「定義した値以外は入れさせない」という強い制約をかけることができます。これはコードの堅牢性を高める上で非常に重要です。
—
4. 陥りやすい罠:ここだけは注意!
初学者がEnumで躓きやすいポイントを整理しておきます。
- Enumは「値」である: Enumは見た目は名前ですが、実態はただの `Long` 型(整数)です。そのため、計算したり比較したりすることは可能です。
- 値の重複に注意: 同じEnum内で同じ数値を割り当てると、意図しない挙動になることがあります。基本的には自動採番(何も書かなければ0から連番)に任せるか、明示的に値を振る場合は一意になるようにしましょう。
- スコープの意識: Enumはプロジェクト全体で使い回すことが多いので、`Public` で定義して標準モジュールにまとめるのが定石です。
—
まとめ:プロのエンジニアは「意図」を残す
「動くコード」を書くのは簡単です。しかし、「意図が伝わるコード」を書くのがエンジニアの仕事です。
Enumを活用することで、あなたの書くVBAは「暗号」から「誰にでも理解できる指示書」に変わります。今日からマジックナンバーを見かけたら、すぐに `Enum` に置き換える癖をつけてください。
ここをクリアすれば、あなたのVBAスキルは一段上のステージへ到達したと言っても過言ではありません。ぜひ、現場のコードで試してみてくださいね。
—
「なぜそう書くのか?」という問いに答えられるようになれば、あなたのコードはもっと洗練されます。また次回の記事でお会いしましょう!
