Excel VBAの定数Constの使い方!定数化で保守しやすいコードを書く方法
生徒
「先生、VBAのプログラムの中で、消費税率の『0.1』という数字を何度も書いているのですが、もし税率が変わったら全部書き直さないといけないんですか?」
先生
「それは大変ですよね。そんな時こそ『定数(Const)』の出番です。一箇所変えるだけで、プログラム全体の数字を自動的に更新できる仕組みがあるんですよ。」
生徒
「定数……?変数とは違うんですか?」
先生
「良いところに気づきましたね。変数は中身が変わる箱ですが、定数は『一度決めたら変えない決まり事』を入れる箱なんです。具体的な書き方を学んでいきましょう!」
1. 定数(Const)とは?変えない値を管理する仕組み
Excel VBA(エクセル・ブイビーエー)における定数(Const)とは、プログラムの実行中にその値が絶対に変わらないデータのことを指します。プログラミングでは、後から変更される可能性がある数値や文字を、直接コードの中に書き込む(ハードコーディングと呼びます)のは避けるべきとされています。
例えば、消費税率、特定のファイルの保存先パス、会社の規定で決まっている基準値などです。これらに「定数」として名前を付けてあげることで、プログラムが読みやすくなり、修正が必要になった際も一箇所の書き換えだけで済むようになります。これを専門用語で保守性(ほしゅせい)が高いコードと呼びます。
2. 定数の基本の書き方とルール
定数を宣言するときは、Dim の代わりに Const(コンスト) というキーワードを使います。パソコン初心者の方でも覚えやすい、シンプルなルールがあります。
基本的な書き方は以下の通りです。
Sub ConstBasicSample()
' 消費税率を定数として宣言します
Const TAX_RATE As Double = 0.1
Dim price As Long
price = 1000
' 計算に定数を使用します
MsgBox "税込価格は " & price * (1 + TAX_RATE) & " 円です。"
End Sub
定数名は、変数と区別しやすくするために大文字で書くのが一般的なプログラミングの習慣です。これにより、後からコードを読み返したときに「これは書き換えちゃいけない定数なんだな」と一目で判断できるようになります。
3. なぜ変数(Dim)ではなく定数(Const)を使うのか?
「変数でも代用できるのでは?」と思うかもしれません。しかし、定数を使うことには大きなメリットが3つあります。
- 間違いを防げる: 定数は一度決めたらプログラムの途中で値を上書きできません。間違えて計算中に税率を書き換えてしまうようなバグ(不具合)を未然に防げます。
- 意味がわかりやすい: 単なる「0.1」という数字よりも「TAX_RATE」という名前がついている方が、何のための数字か誰が見てもわかります。
- 修正が一瞬で終わる: 税率が「0.1」から「0.15」に変わったとき、コード内に散らばった数字を探して修正する必要はありません。宣言部分を一行直すだけです。
4. 定数のスコープ(有効範囲)を理解しよう
定数にも、変数と同じようにスコープ(有効範囲)があります。どこでその定数を使いたいかによって、宣言する場所を変える必要があります。
プログラミング未経験の方にとって「範囲」という考え方は少し難しいかもしれませんが、家のルール(その部屋だけか、家全体か)をイメージするとわかりやすいでしょう。
' モジュール全体のどこからでも使える定数
Const CLUB_NAME As String = "VBA学習部"
Sub WelcomeMessage()
' このマクロ内だけで有効な定数
Const GREETING As String = "こんにちは!"
MsgBox GREETING & CLUB_NAME & "へようこそ。"
End Sub
一つのマクロだけで使うなら Sub の中に、複数のマクロで共通して使いたいならモジュールの最上部(宣言セクション)に書くようにしましょう。
5. 実務で役立つ!マジックナンバーを排除する
プログラムの中に直接書かれた、意味のわからない数字のことをマジックナンバーと呼びます。例えば、エクセルの「3列目」を指定したいときに、ただ「3」と書くのではなく、定数を使って意味を持たせます。
Sub InputData()
' 列番号に名前を付けることでミスを防ぐ
Const COL_PRICE As Integer = 3
Const COL_NAME As Integer = 2
' 2行目の名前列と価格列に値を入力
Cells(2, COL_NAME).Value = "エクセル教本"
Cells(2, COL_PRICE).Value = 2500
End Sub
こうしておけば、後で「価格の列が4列目に変わった」という時も、定数の「3」を「4」に変えるだけで、プログラム全体の修正が完了します。パソコンの画面上で修正箇所を探し回るストレスから解放されます。
6. 列挙型(Enum)との使い分け
関連する複数の定数をまとめたいとき、VBAにはEnum(エニュム/列挙型)というさらに便利な機能があります。例えば、曜日やステータスなど、セットで管理したい数値に名前を付けるのに最適です。
' モジュールの最上部で宣言します
Enum WorkStatus
Waiting = 1
Doing = 2
Finished = 3
End Enum
Sub CheckStatus()
Dim currentStatus As Integer
currentStatus = Doing ' 数字の2の代わりに名前を使える
If currentStatus = Doing Then
MsgBox "現在、作業進行中です。"
End If
End Sub
Enumを使うと、コードを打っている最中に候補が自動で表示されるため、入力ミスを減らせるという強力なメリットがあります。定数の応用編として覚えておくと便利です。
7. 条件分岐(If文)やループと定数を組み合わせる
定数は、これまでに学んだ「条件分岐」や「ループ処理」と組み合わせることで真価を発揮します。合格点や繰り返し回数の上限を定数にしておくことで、マクロの挙動をコントロールしやすくなります。
Sub LoopWithConst()
' 合格点と最大行数を定数化
Const PASS_SCORE As Integer = 70
Const MAX_ROW As Integer = 10
Dim i As Integer
For i = 1 To MAX_ROW
' もしセルの値が合格点以上なら色を塗る
If Cells(i, 1).Value >= PASS_SCORE Then
Cells(i, 1).Interior.Color = vbCyan
End If
Next i
End Sub
このように、マクロのルール(仕様)を定数に集約させておくことで、「ルールが変わったら定数を直す」という単純な作業だけでマクロをメンテナンスできるようになります。
8. 定数を使う際の注意点
非常に便利な定数ですが、初心者の方がハマりやすい注意点がいくつかあります。
- 関数や計算式は使えない:
Const MY_DATE = Dateのように、実行しないと値が決まらないものは定数にはできません。定数には「100」や「"東京"」のような決まった値を書く必要があります。 - 上書き禁止: プログラムの途中で
TAX_RATE = 0.08のように値を入れ直そうとすると、VBAがエラーを出して止まります。それが定数の役割ですが、もし途中で値を変える必要があるなら、それは定数ではなく「変数(Dim)」を使いましょう。
定数を上手に使いこなせるようになると、あなたの書くVBAコードはプロ級の「読みやすさ」と「直しやすさ」を手に入れることができます。まずは、よく使う固定の数値から定数化してみる練習をしてみてくださいね!