VBAで同じ値を何度も使うなら、Const で定数として宣言しておくと、コードが読みやすくなります。
たとえば、税率、シート名、ファイルパス、上限回数、固定メッセージのように「処理中に変わらない値」は、Dim で変数にするより Const で名前を付けておくほうが安全です。
VBAの定数は、基本的に次の形で書きます。
Private Const TAX_RATE As Double = 0.1
Private Const REPORT_SHEET As String = "集計"
Private Const MAX_RETRY As Long = 3Const は「あとから値を変えない」という意思表示です。 処理中に値を入れ替える予定があるなら Dim、ずっと固定で使うなら Const と考えると迷いにくくなります。

| よく使う度 | |
| 難しさ | |
| 覚えておくと安心度 |
【 この記事の概要 】
VBA Constの使い方と定数宣言の基本コード
Const は、リテラル値の代わりに使う定数を宣言するステートメントです。
リテラル値とは、0.1、"集計"、3 のように、コードへ直接書かれた値のことです。
まずは「どこに、何を、どう書くか」を押さえれば大丈夫です。
Constの基本構文
VBAの Const は、基本的に次の形で書きます。

よく使う形は、次の3つです。
'// 同じモジュール内で使う定数
Private Const SHEET_NAME As String = "集計"
'// プロシージャ内だけで使う定数
Sub Sample()
Const TAX_RATE As Double = 0.1
End Sub
'// 複数モジュールから使う定数
Public Const APP_NAME As String = "残業0集計ツール"このように宣言することで使用することができます。
| 書き方 | 使える場所 | 使いどころ |
|---|---|---|
Const | 宣言した場所に応じる | 小さなサンプルやプロシージャ内の固定値 |
Private Const | 同じモジュール内 | 通常の実務コードで最も使いやすい |
Public Const | 他のモジュールから参照したい場合 ※標準モジュール先頭が基本 | アプリ名、共通シート名、共通設定値 |
Const の定数名は、変数名と同じように分かりやすい名前にします。
実務では、定数だと分かるように大文字とアンダースコアで書く方法がよく使われます。
Private Const TAX_RATE As Double = 0.1
Private Const MAX_RETRY_COUNT As Long = 3
Private Const OUTPUT_SHEET_NAME As String = "出力"ただし、既存プロジェクトで TaxRate や SheetName のような命名ルールを使っているなら、無理に変える必要はありません。 大切なのは、同じブック内で命名ルールをそろえることです。
まず使える最小コード
一番短いサンプルは、消費税率のような固定値を Const にするコードです。
Sub ConstBasicSample()
Const TAX_RATE As Double = 0.1
Dim price As Long
Dim tax As Double
price = 1000
tax = price * TAX_RATE
MsgBox "税額は " & tax & " 円です。"
End Subこのコードで大事なのは、0.1 を直接何度も書かずに、TAX_RATE という名前の定数で扱っている点です。
もしコードの中に 0.1 が10か所あると、後で値を変えるときに10か所すべて確認する必要があります。Const TAX_RATE As Double = 0.1 と書いておけば、変更対象は基本的に1か所です。
'// 悪い例: 値の意味が分かりにくい
tax = price * 0.1
'// 良い例: 値の意味が名前で分かる
tax = price * TAX_RATE最初に覚えるなら、次の型だけで十分です。
| 型 | 使いどころ | 例 |
|---|---|---|
String | シート名、ファイルパス、メッセージ | "集計" |
Long | 行番号、列番号、回数、上限値 | 100 |
Double | 税率、割合、小数 | 0.1 |
Boolean | オン/オフ、表示する/しない | True |
Date | 固定日付 | #5/10/2026# |
行番号や繰り返し回数は、Integer より Long を使うほうが安全です。
Excelの行番号は Integer の範囲を超えるため、実務では Long を標準にしておくと迷いにくくなります。
型別の定数宣言例
定数は、型を指定しておくと読みやすくなります。
Private Const SHEET_MASTER As String = "マスタ"
Private Const SHEET_OUTPUT As String = "出力"
Private Const MAX_ROW_COUNT As Long = 100000
Private Const TAX_RATE As Double = 0.1
Private Const SHOW_CONFIRM As Boolean = True
Private Const DEADLINE_DATE As Date = #5/31/2026#シート名やファイル名は、定数化の効果が分かりやすいです。
Sub CopyMasterToOutput()
Private Const SOURCE_SHEET As String = "マスタ"
End Sub上のコードは、実はそのままでは使えません。Private Const はプロシージャ内では使えないためです。
プロシージャ内だけで使うなら、次のように Const だけを書きます。
Sub CopyMasterToOutput()
Const SOURCE_SHEET As String = "マスタ"
Const OUTPUT_SHEET As String = "出力"
Worksheets(SOURCE_SHEET).Range("A1").Copy _
Destination:=Worksheets(OUTPUT_SHEET).Range("A1")
End Sub同じシート名を複数のプロシージャで使うなら、モジュールの先頭に Private Const としてまとめます。
Private Const SOURCE_SHEET As String = "マスタ"
Private Const OUTPUT_SHEET As String = "出力"
Sub CopyMasterToOutput()
Worksheets(SOURCE_SHEET).Range("A1").Copy _
Destination:=Worksheets(OUTPUT_SHEET).Range("A1")
End Sub
Sub ClearOutput()
Worksheets(OUTPUT_SHEET).UsedRange.ClearContents
End Subこの形にすると、シート名を変更したいときに、モジュール上部の定数だけを見ればよくなります。
Const(定数)とDim(変数)の違い | マクロで定数を使う場面
Const と Dim の違いは、値をあとから変えるかどうかです。
Const は「変えない値」、Dim は「処理中に変わる値」を扱います。どちらが上位という話ではなく、役割が違います。

ConstとDimの違い早見表
| 比較項目 | Const | Dim |
|---|---|---|
| 役割 | 固定値に名前を付ける | 値を入れる箱を作る |
| 値の変更 | できない | できる |
| 代表例 | 税率、上限回数、シート名 | 合計値、行番号、カウンター |
| 宣言例 | Const TAX_RATE As Double = 0.1 | Dim total As Long |
| 再代入 | 不可 | 可 |
| 向いている用途 | 意味のある固定値を安全に使う | 処理結果や途中経過を保持する |
次のように、処理中に増える値は Dim が向いています。
Sub DimSample()
Dim total As Long
Dim i As Long
For i = 1 To 10
total = total + i
Next i
MsgBox total
End Subtotal はループのたびに変わるため、Const にはできません。
一方、ループの上限が決まっているなら、その上限は Const にできます。
Sub ConstAndDimSample()
Const MAX_COUNT As Long = 10
Dim total As Long
Dim i As Long
For i = 1 To MAX_COUNT
total = total + i
Next i
MsgBox total
End Subこのように、MAX_COUNT は変わらない値、total と i は変わる値です。

定数(Const)に向いている値
定数に向いているのは、意味が固定されていて、コードの中で何度も使う値です。
| 定数にしたい値 | 理由 | 例 |
|---|---|---|
| シート名 | 名前変更時に修正箇所を減らせる | "集計" |
| ファイルパス | 保存先を一元管理できる | "C:\Reports\売上.xlsx" |
| 税率・割合 | 数字の意味が分かる | 0.1 |
| 最大行数・上限回数 | 条件の意味が分かる | 3 |
| 固定メッセージ | 表記ゆれを防げる | "処理が完了しました" |
| 列番号 | どの列か分かりやすい | 5 |
たとえば、列番号をそのまま書くと、あとから見たときに意味が分かりにくくなります。
'// 列番号の意味が分かりにくい
Cells(i, 5).Value = "完了"定数にすると、5列目が何の列なのか分かります。
Private Const STATUS_COL As Long = 5
Sub MarkDone()
Dim i As Long
For i = 2 To 10
Cells(i, STATUS_COL).Value = "完了"
Next i
End Sub業務でよくある「担当者列」「ステータス列」「処理日列」のような列番号は、定数化すると保守しやすくなります。
変数(Dim)のほうがよい値
何でも Const にすればよいわけではありません。
次のような値は、Dim で変数として扱います。
| 値 | Dim がよい理由 |
|---|---|
| セルから読み取った値 | 実行時に変わる |
| 集計結果 | 処理中に増減する |
| ループカウンター | 1回ごとに値が変わる |
| 最終行番号 | シートの状態で変わる |
| ユーザー入力値 | 入力内容で変わる |
Sub ReadCellValue()
Dim userName As String
userName = Range("A2").Value
MsgBox userName & "さんのデータを処理します。"
End SubRange("A2").Value は実行時に変わるため、Const ではなく Dim で受け取ります。
また、Const に変数や関数の戻り値を入れることはできません。
'// これはNG
Const TODAY_TEXT As String = Format(Date, "yyyy/mm/dd")Format や Date の結果は実行時に決まるため、定数にはできません。
この場合は Dim を使います。
Sub TodayTextSample()
Dim todayText As String
todayText = Format(Date, "yyyy/mm/dd")
MsgBox todayText
End SubPublic Const・Private Const・グローバル定数の使い分け
Const は、宣言する場所によって使える範囲が変わります。 この範囲をスコープと呼びます。
このスコープを曖昧にすると、動くコードは書けても、あとから修正しにくいコードになりがちです。

宣言場所と使える範囲
| 宣言場所 | 書き方 | 使える範囲 | おすすめ度 |
|---|---|---|---|
| プロシージャ内 | Const TAX_RATE As Double = 0.1 | その Sub / Function 内だけ | 小さな処理ならOK |
| モジュール先頭 | Private Const TAX_RATE As Double = 0.1 | 同じモジュール内 | 実務の基本 |
| 標準モジュール先頭 | Public Const TAX_RATE As Double = 0.1 | 他の標準モジュールからも参照 | 全体共通だけ |
迷ったら、まず Private Const を使いましょう。
Public Const は便利ですが、どこからでも参照できるため、使いすぎると「どの処理が何に依存しているか」が分かりにくくなります。
'// 標準モジュール ModuleConfig の先頭に書く
Public Const APP_NAME As String = "売上集計マクロ"
Public Const MASTER_SHEET As String = "マスタ"
Public Const OUTPUT_SHEET As String = "集計"別の標準モジュールから、次のように使えます。
Sub ShowAppName()
MsgBox APP_NAME & "を開始します。"
End SubPublic Const は、ブック全体で意味が変わらない値だけに使うのが安全です。
実務ではPrivate Constを基本にする
たとえば、ひとつのモジュールの中でだけ使うシート名や列番号なら、Private Const で十分です。
Option Explicit
'// 定数を宣言
Private Const SOURCE_SHEET As String = "元データ"
Private Const OUTPUT_SHEET As String = "集計"
Private Const CUSTOMER_COL As Long = 2
Private Const AMOUNT_COL As Long = 5
Sub BuildSummary()
Dim lastRow As Long
Dim i As Long
Dim total As Double
With Worksheets(SOURCE_SHEET)
lastRow = .Cells(.Rows.Count, CUSTOMER_COL).End(xlUp).Row
For i = 2 To lastRow
total = total + .Cells(i, AMOUNT_COL).Value
Next i
End With
Worksheets(OUTPUT_SHEET).Range("B2").Value = total
End Subこのコードでは、SOURCE_SHEET、OUTPUT_SHEET、CUSTOMER_COL、AMOUNT_COL が定数です。
集計処理そのものは Dim の lastRow、i、total で進めます。
固定値と変動値が分かれているため、後から読んでも役割が分かりやすくなります。

Public Constを使いすぎないための基準
Public Const はグローバル定数として使えます。 ただし、グローバルにするほど影響範囲が広がります。
次の基準で判断すると、使いすぎを防げます。
| 判断基準 | Public Const にしてよい | Private Const にしたほうがよい |
|---|---|---|
| 使う範囲 | 複数モジュールで共通 | 1モジュール内だけ |
| 値の意味 | ブック全体で同じ | 処理ごとに意味が違う |
| 変更頻度 | ほぼ変わらない | 処理単位で変わる可能性がある |
| 例 | アプリ名、共通シート名、共通フォルダ | 一時的な列番号、処理ごとの上限値 |
おすすめは、共通設定だけを ModuleConfig のような標準モジュールにまとめる形です。
'// ModuleConfig
Option Explicit
Public Const APP_NAME As String = "売上集計マクロ"
Public Const MASTER_SHEET As String = "マスタ"
Public Const OUTPUT_SHEET As String = "集計"
Public Const LOG_SHEET As String = "処理ログ"ただし、何でも ModuleConfig に入れると、逆に見通しが悪くなります。
「そのモジュールでしか使わない値」は、使うモジュールの先頭に Private Const として置くほうが読みやすいです。
FAQと実務例:String・Long・配列で定数を使う注意点
最後に、実務でそのまま使いやすい例と、つまずきやすい注意点をまとめます。
Const は単なる文法ではなく、修正漏れを減らすための整理方法です。
よく変わる業務ルールほど、固定値の置き場所を決めておく価値があります。
実務で使う定数テンプレート
使用例1:定数でファイルパスを管理する
複数のプロシージャで同じファイルパスを使用する場合、定数を使うことで管理が容易になります。
Const FILE_PATH As String = "C:\新しいパス\新しいファイル名.xlsx"
Sub OpenReport()
Workbooks.Open FILE_PATH
End Sub
Sub SaveReport()
ThisWorkbook.SaveAs FILE_PATH
End Sub■ このコードで使用している機能
■ 1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Const FILE_PATH As String = “C:\新しいパス\新しいファイル名.xlsx”
- この行では、定数「FILE_PATH」を宣言しています。
「Const」は定数を宣言するキーワードで、一度設定された値を後から変更できません。
ここでは「String (文字列型)」の定数として、パス(”C:\新しいパス\新しいファイル名.xlsx”)を保持しています。
定数を使うことで、プログラム全体でこのパスを使い回しつつ、誤って変更されるリスクを防ぐことができます。
- この行では、定数「FILE_PATH」を宣言しています。
- Sub OpenReport()
Workbooks.Open FILE_PATH
End Sub- このブロックでは、「OpenReport 」というサブルーチンを定義しています。
サブルーチン「Sub」は、特定の処理をまとめて実行するコードの塊です。
「Workbooks.Open」は指定されたパスのファイルを開くためのメソッドで、引数として定数「FILE_PATH」を渡しています。
これにより、先ほど設定したパスにあるExcelファイルが開かれます。
- このブロックでは、「OpenReport 」というサブルーチンを定義しています。
- Sub SaveReport()
ThisWorkbook.SaveAs FILE_PATH
End Sub- このブロックでは、「SaveReport」というサブルーチンを定義しています。
ThisWorkbook は、現在のExcelファイル(コードが実行されているブック)を指し、「SaveAs」メソッドを使って保存する処理を行います。
定数「FILE_PATH」に指定されたファイル名で保存します。
これにより、プログラムの中で同じ場所に保存する処理が一貫して行われます。
- このブロックでは、「SaveReport」というサブルーチンを定義しています。
このコードは、定数「FILE_PATH」に設定されたパスを使用して、Excelファイルの開閉や保存を行います。
定数を使うことで、ファイルパスを統一管理し、誤って変更されるリスクを防いでいます。
使用例2:エラーメッセージの統一化
エラーメッセージを定数として宣言し、コード内で一貫して使用することで、メッセージの変更が容易になります。
Const ERROR_MESSAGE As String = "An unexpected error has occurred."
Sub ExampleProcedure()
On Error GoTo ErrorHandler
'// コード本体
Exit Sub
ErrorHandler:
MsgBox ERROR_MESSAGE
End Sub■ このコードで使用している機能
- Error (エラー処理)
■ 1行ずつコードを解説
「クリック」してコードの詳細解説を見る
- Const ERROR_MESSAGE As String = “An unexpected error has occurred.”
- この行では、定数「ERROR_MESSAGE」を宣言しています。
定数は、一度設定した値を変更できない変数のようなものです。
この定数には、エラーメッセージとして「An unexpected error has occurred.」(予期しないエラーが発生しました)という文字列が設定されています。
このように定数を使うことで、コード全体で統一されたメッセージを使用でき、後で変更が必要になった場合もこの1か所を変更するだけで済むため、メンテナンスが容易になります。
- この行では、定数「ERROR_MESSAGE」を宣言しています。
- Sub ExampleProcedure()
- ここでは、新しいサブルーチン「ExampleProcedure」を定義しています。
サブルーチンは、一連の処理をまとめたコードのブロックです。このサブルーチンが呼び出されると、中に書かれた処理が順番に実行されます。
- ここでは、新しいサブルーチン「ExampleProcedure」を定義しています。
- On Error GoTo ErrorHandler
- この行は、エラーハンドリングの設定を行っています。
もしこのサブルーチン内でエラーが発生した場合、コードの実行は通常の流れを中断し、指定されたラベル「ErrorHandler」にジャンプします。
これにより、エラーが発生した際の処理をまとめて実行することが可能になります。
- この行は、エラーハンドリングの設定を行っています。
- ‘// コード本体
- この場所にメインの処理を記述してください。
- Exit Sub
- この行は、サブルーチンの処理を途中で終了させる命令です。
通常の流れでは、この行が実行されると、 サブルーチン「ExampleProcedure」はここで終了し、その後の処理は行われません。
つまり、Exit Sub に到達した時点でサブルーチンは停止し、プログラムの次の命令があれば、別のサブルーチンやプロシージャに移ることになります。
エラーが発生しなければ、この行で「ExampleProcedure」は終了します。
- この行は、サブルーチンの処理を途中で終了させる命令です。
- ErrorHandler:
- これはエラーハンドリングのためのラベルです。
もしこのサブルーチン内でエラーが発生すると、前述の「On Error GoTo ErrorHandler」によって処理がこのラベルの場所にジャンプします。
このラベル以降の行には、エラー発生時に実行される処理が書かれています。
- これはエラーハンドリングのためのラベルです。
- MsgBox ERROR_MESSAGE
- この行では、MsgBox関数を使用してメッセージボックスを表示します。
表示されるメッセージは、最初に宣言した定数「ERROR_MESSAGE」の値、つまり「An unexpected error has occurred.」です。
このメッセージボックスは、エラーが発生したことをユーザーに知らせるために使用されます。
- この行では、MsgBox関数を使用してメッセージボックスを表示します。
- End Sub
- この行は、サブルーチンの終了を示します。
ExampleProcedure サブルーチンの処理がすべて完了したことを示し、プログラムは次の処理に進みます。
エラーハンドリングが行われた場合も、ここでサブルーチンが終了します。
- この行は、サブルーチンの終了を示します。
このコードは、定数「ERROR_MESSAGE」を使用して、エラーが発生した際に一貫したエラーメッセージを表示する仕組みを作成しています。
「On Error GoTo」によりエラー発生時に「ErrorHandler」にジャンプし、定数で定義されたメッセージをメッセージボックスで表示します。
これにより、エラー処理が統一され、管理が簡単になります。
Constでできないこと・エラーになりやすいこと
Const は便利ですが、何でも固定できるわけではありません。
| やりたいこと | 可否 | 対応方法 |
|---|---|---|
| 数値や文字列を固定する | できる | Const MAX_COUNT As Long = 3 |
| 日付リテラルを固定する | できる | Const LIMIT_DATE As Date = #5/31/2026# |
| 配列を定数にする | 基本的にできない | 個別定数、Enum、関数で代替 |
| セルの値を定数にする | できない | Dim で実行時に取得 |
Date や Format の結果を定数にする | できない | Dim で実行時に作る |
| オブジェクトを定数にする | できない | Dim と Set を使う |
一度宣言した定数に、あとから値を入れ直すことはできません。
Sub ConstErrorSample()
Const MAX_COUNT As Long = 3
'// これはエラーになります
MAX_COUNT = 5
End Sub値をあとから変更する必要があるなら、最初から Dim を使います。
Sub VariableSample()
Dim maxCount As Long
maxCount = 3
maxCount = 5
End Sub配列についても注意が必要です。
'// これはConstでは書けません
Const TARGET_SHEETS = Array("元データ", "集計", "ログ")Array は関数であり、定数の式としては使えません。
代わりに、個別の定数に分けるか、関数で配列を返します。
Private Const SHEET_DATA As String = "元データ"
Private Const SHEET_SUMMARY As String = "集計"
Private Const SHEET_LOG As String = "ログ"
Function GetTargetSheets() As Variant
GetTargetSheets = Array(SHEET_DATA, SHEET_SUMMARY, SHEET_LOG)
End Functionまた、選択肢のまとまりを扱うなら Enum も候補です。
Public Enum ProcessMode
ModePreview = 0
ModeExecute = 1
ModeRetry = 2
End Enum
Sub RunByMode(ByVal mode As ProcessMode)
Select Case mode
Case ModePreview
MsgBox "確認モードです。"
Case ModeExecute
MsgBox "実行モードです。"
Case ModeRetry
MsgBox "再実行モードです。"
End Select
End SubConst は単体の固定値、Enum は選択肢のまとまり、と考えると使い分けやすくなります。
FAQとまとめ
まとめ
Const は「値を変えないための文法」だけではなく、「コードの意味を名前で説明するための道具」です。
- 固定値は
Const、変わる値はDim
Const(定数)とDim(変数)の違い-|-定数を使う場面 をもう一度見る - 実務では
Private Constを基本にする
実務ではPrivate-Constを基本にする をもう一度見る Public Constはブック全体の共通設定だけに使う
Public-Constを使いすぎないための基準 をもう一度見る- シート名、列番号、ファイルパス、固定メッセージは定数化しやすい
定数(Const)に向いている値 をもう一度見る - 配列や実行時に決まる値は
Constではなく、別の方法で扱う
Constでできないこと・エラーになりやすいこと をもう一度見る
次に読むなら、変数、グローバル変数、配列、最終行取得の記事をあわせて確認すると、定数の使いどころがより分かりやすくなります。


