Excel VBA | 定数を定義する

Excel VBA VBA
スポンサーリンク

実際の動作例・落とし穴・使いどころまで含めて、わかりやすく解説します。

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
VB

5. よくある落とし穴・注意点

落とし穴説明
再代入しようとしてエラー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全プロジェクト(全モジュール)共通
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました