実際の動作例・落とし穴・使いどころまで含めて、わかりやすく解説します。
1. 定数とは?
定数(Constant)は、一度決めたら変更できない値を保存しておく「名前付きの値」です。
変数のように動かすものではなく、「ずっと同じ意味の数字や文字」をコードにわかりやすく書くために使います。
❌ 悪い例(定数を使わない)
Sub 悪い例()
MsgBox "税込価格は " & 1000 * 1.1 & " 円です。"
MsgBox "税込価格は " & 2000 * 1.1 & " 円です。"
End Sub
VB→ 消費税率を変える時、すべての 1.1 を手で修正しなければならない。
✅ 良い例(定数を使う)
Sub 良い例()
Const TAX As Double = 0.1
MsgBox "税込価格は " & 1000 * (1 + TAX) & " 円です。"
MsgBox "税込価格は " & 2000 * (1 + TAX) & " 円です。"
End Sub
VB一箇所変えるだけで全体が修正されるし、「TAX」で意味も伝わる!
2. 定義のルール
| 項目 | 内容 |
|---|---|
| 宣言方法 | Const 定数名 As データ型 = 値 |
| 再代入 | 不可(変更しようとするとエラー) |
| データ型 | 指定可能。省略時は Variant 型 |
| 命名 | 先頭は文字、英数字と _ 使用可。慣習的に大文字(例:PI, TAX_RATE) |
| スコープ | 宣言場所によって異なる(後述) |
3. プロシージャ内定数とモジュールレベル定数
(1) プロシージャ内定数(ローカル定数)
定義した Sub / Function の中でだけ有効。
Sub 計算A()
Const TAX As Double = 0.1
MsgBox 100 * (1 + TAX)
End Sub
Sub 計算B()
' TAX は定義されていない → エラー!
MsgBox 200 * (1 + TAX)
End Sub
VB注意点
- 同じ名前の定数を別の Sub 内に定義しても問題なし(スコープが独立しているため)
- 間違って別の定数を上書きしても他の Sub に影響しない
(2) モジュールレベル定数(共通で使う)
モジュールの先頭(Sub の外)で定義すると、そのモジュール内のすべてのプロシージャから使える。
Option Explicit
Const TAX As Double = 0.1
Sub 計算A()
MsgBox 100 * (1 + TAX)
End Sub
Sub 計算B()
MsgBox 200 * (1 + TAX)
End Sub
VB注意点
- 同じ名前の定数を別モジュールで定義すると、曖昧参照エラーの原因になることがある。
→ 定数名が重複しないように、接頭語を付けるのが安全(例:TAX_RATE_SALES) - モジュール内定義でも、Public を付けると全ブック共通にできる(後述)。
4. Public 定数(全体で共通)
全プロジェクト(ブック内のどのモジュールでも)で使える。
Public Const TAX As Double = 0.1
VB例えば「共通設定」モジュールを作り、全体で利用可能な定数をまとめるのがよくある方法です。
'--- modCommon.bas ---
Public Const TAX_RATE As Double = 0.1
Public Const COMPANY_NAME As String = "Sample Corp"
'--- Module1.bas ---
Sub 表示()
MsgBox COMPANY_NAME & " の税込価格は " & 100 * (1 + TAX_RATE) & " 円です。"
End Sub
VB5. よくある落とし穴・注意点
| 落とし穴 | 説明 |
|---|---|
| 再代入しようとしてエラー | Const は固定値。TAX = 0.08 はエラーになる |
| 条件分岐で値を変えたいとき | 定数ではなく変数にする必要あり |
| Variant 型にすると意図せず型変換 | 型を明示するとエラーを早期発見できる |
| 同名定数の多重定義 | モジュール間で Public Const 名が重複すると競合する |
6. 応用例:列番号やファイルパスをわかりやすく
Const COL_PRICE As Integer = 3
Const PATH_REPORT As String = "C:\Data\Report.xlsx"
Sub 売上集計()
Dim price As Double
price = Cells(2, COL_PRICE).Value
MsgBox "価格 = " & price
End Sub
VB→ 「3列目」よりも「COL_PRICE」の方が意味が伝わる。
→ ファイルパスなども定数化しておけば、変更に強いコードになる。
まとめ
| 種類 | 宣言例 | 有効範囲 |
|---|---|---|
| プロシージャ内定数 | Const TAX As Double = 0.1 | そのプロシージャ内のみ |
| モジュールレベル定数 | Const TAX As Double = 0.1(Subの外) | そのモジュール内すべて |
| Public定数 | Public Const TAX As Double = 0.1 | 全プロジェクト(全モジュール)共通 |

