【入門編】VBAにおける「定数」の管理術:マジックナンバーを排除してメンテナンス性を高める – Excel VBA解析バイブル

スポンサーリンク

こんにちは!先輩エンジニアのボクです。
マクロの記録から一歩踏み出し、「自分でコードを書けるようになりたい!」と日々の業務を自動化しているあなた、本当に素晴らしいですね。その向上心、心から応援します。

さて、VBAを書いていると、こんなコードを書いてしまっていませんか?

‘ 売上計算のつもりだけど…
Cells(i, 5).Value = Cells(i, 3).Value 1.1

……おっと、ちょっと待って!このコードの中にある `1.1` って、一体なにの数字だか分かりますか?
「あ、消費税率の10%のことね」と今のあなたなら分かるかもしれません。でも、半年後のあなたや、このコードを引き継いだ同僚は、この `1.1` を見てパッと意味を理解できるでしょうか?

プログラミングの世界では、こうしたコード内に直接書き込まれた意味不明な数値を 「マジックナンバー(魔法の数字)」 と呼びます。文字通り、どこからともなく現れて意味を隠してしまう、メンテナンス性の天敵です。

今回は、このマジックナンバーを華麗に駆逐し、「変更に強く、誰が見ても読みやすいプロ仕様のコード」 に生まれ変わらせるための定数(Const)と列挙体(Enum)の管理術を伝授します。ここをクリアすれば、あなたのVBAスキルは一段とプロに近づきますよ。さあ、一緒に扉を開けましょう!

1. なぜマジックナンバーは「悪」なのか?

マジックナンバーの何がそんなにいけないのでしょうか。理由は主に3つあります。

1. 意味が分からない:`3` 列目って何? `5` 列目ってどこ?
2. 変更に弱い:もし消費税率が `1.1` から `1.12` に変わったとき、何百行もあるコードの中から `1.1` をすべて探し出して書き換える必要がありますか?(しかも関係ない計算の `1.1` まで巻き込んでしまうリスクも!)
3. ミスに気づきにくい:タイポ(打ち間違い)をしても、VBAはエラーを出してくれません。

これを解決するのが、今回学ぶ 「定数(Const)」「列挙体(Enum)」 です。名前に意味を持たせることで、コードを人間にとって読みやすい「言葉」に変えてあげましょう。

2. `Const`(定数)で「変わらない値」に名前を付ける

まずは基本の `Const`(コンスト)です。これは「一度決めたら途中で変更できない変数」のようなものです。

基本の書き方

プロシージャ(SubやFunction)の中、またはモジュールの最上部(Option Explicitの下)で宣言します。

Const 消费税率 As Double = 0.1 ‘ 漢字やひらがなも使えますが、通常は英語や分かりやすい名前が好まれます

※実務では英語の大文字+アンダーバーで書くのが業界の標準です。例:`TAX_RATE`

比較してみよう:ビフォー・アフター

【マジックナンバーだらけの残念なコード】

Sub CalcTax_Bad()
‘ 3列目の金額に、1.1をかけて、5列目に出力する(うーん、分かりにくい…)
Cells(2, 5).Value = Cells(2, 3).Value 1.1
End Sub

【Constで美しく整理されたプロのコード】

‘ モジュールの先頭などで定義する定数
Const COL_PRICE As Long = 3 ‘ 金額が格納されている列番号
Const COL_TOTAL As Long = 5 ‘ 税込金額を出力する列番号
Const TAX_RATE As Double = 0.1 ‘ 消費税率(10%)

Sub CalcTax_Good()
Dim targetRow As Long
targetRow = 2

‘ 「何をしているのか」が日本語の文章のようにスッと頭に入ってくる!
Cells(targetRow, COL_TOTAL).Value = Cells(targetRow, COL_PRICE).Value (1 + TAX_RATE)
End Sub

どうですか? 後者のほうが圧倒的に読みやすいですよね。「もし消費税率が変わっても `TAX_RATE` の数値を `0.12` に変えるだけ」で済むというメンテナンス性の高さも実感できるはずです。

3. さらに進んだ管理術:列挙体 `Enum` でExcelの「列位置」を支配する

Excelマクロで最も多いエラーの原因は何だと思いますか? それは 「列の挿入や削除によって、データの位置(何列目か)がズレてしまうこと」 です。

「A列は1、B列は2、C列は3……」と数字で管理していると、シートのレイアウトを変えた瞬間にマクロが崩壊します。ここで登場するのが `Enum`(列挙体:エニュム) です。

`Enum` とは?

関連する複数の定数をグループ化して管理できる、VBAのとっておきの機能です。

実践コード:シートの列位置を `Enum` で完全に固定する

‘ モジュールの最上部(一番最初のSubよりも上)に書きます
Public Enum ColIndex
ColID = 1 ‘ ID (A列)
ColName = 2 ‘ 氏名 (B列)
ColDept = 3 ‘ 部署 (C列)
ColSales = 4 ‘ 売上 (D列)
End Enum

Sub ProcessSalesData()
Dim ws As Worksheet
Set ws = ActiveSheet

Dim r As Long
r = 2 ‘ 2行目から処理

‘ 列番号を「数字」ではなく「意味のある名前」で指定する
MsgBox ws.Cells(r, ColIndex.ColName).Value & “さんの売上は ” & _
ws.Cells(r, ColIndex.ColSales).Value & ” 円です。”, _
vbInformation, “確認”

End Sub

この書き方の何が凄いの?

もし将来、氏名と部署の間に「メールアドレス」の列が挿入されて、売上データがD列からE列にズレたとしても、`Enum ColIndex` の中の `ColSales = 5` に書き換えるだけで、マクロ全体のコードを一切書き直す必要がなくなります。

これが、プロのエンジニアが実践する「変更に強い設計」の正体です。

4. 陥りやすい罠とアドバイス

ここで、初心者がやってしまいがちなポイントをいくつかアドバイスしておきますね。

  • マジック「文字列」にも気をつけろ!

数値だけでなく、コード内に直接書いた `”完了”` や `”エラー”` といった文字列も一種のマジックナンバー(マジックストリング)です。判定に使う文字列も `Const STATUS_DONE As String = “完了”` のように定数化しておくと、後から「やっぱり『処理済み』に変えたい」となったときに一箇所直すだけで済みます。

  • スコープ(有効範囲)を意識する
  • `Sub` の中で宣言した `Const` は、その中だけで使えます(ローカル定数)。
  • モジュールの最上部(`Option Explicit` の下)で `Const` や `Enum` を宣言すると、そのモジュール内のすべてのプロシージャで使えます。さらに `Public Enum` にすれば、プロジェクト内の他のシートや標準モジュールからも呼び出せるようになります。

まとめ

今回は、VBAにおける定数管理(`Const` と `Enum`)について解説しました。

  • コード内の生の値(マジックナンバー)は、メンテナンス性を下げる最大の敵。
  • 変わらない数値や意味を持つ値には `Const` で名前を付ける。
  • Excelの列位置など、関連する定数は `Enum` でグループ化して管理する。

最初は「わざわざ定数宣言するの、ちょっと面倒だな…」と感じるかもしれませんが、コードの行数が100行、1000行と増えていったとき、この設計をしているかどうかであなたの作業スピードは天と地ほどの差になります。

ここをクリアすれば、もう「マクロの記録を貼り付けただけの人」ではありません。自信を持って「VBAエンジニア」と名乗ってくださいね!
あなたのVBAライフが、より快適でスマートなものになりますように。ボクはいつでも応援しています!

タイトルとURLをコピーしました