Excel VBA Constの使い方|Dim違い・Public Const徹底解説

当ページのリンクには広告 (Amazonアソシエイト含む) が含まれています。
アイキャッチ

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 = 3

Const は「あとから値を変えない」という意思表示です。 処理中に値を入れ替える予定があるなら Dim、ずっと固定で使うなら Const と考えると迷いにくくなります。

Constの基本構文
よく使う度
難しさ
覚えておくと安心度

【 この記事の概要 】

目次

VBA Constの使い方と定数宣言の基本コード

Const は、リテラル値の代わりに使う定数を宣言するステートメントです。
リテラル値とは、0.1"集計"3 のように、コードへ直接書かれた値のことです。

まずは「どこに、何を、どう書くか」を押さえれば大丈夫です。

Constの基本構文

VBAの Const は、基本的に次の形で書きます。

Const 定数 As 定数の型 = 値

よく使う形は、次の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 = "出力"

ただし、既存プロジェクトで TaxRateSheetName のような命名ルールを使っているなら、無理に変える必要はありません。 大切なのは、同じブック内で命名ルールをそろえることです。

まず使える最小コード

一番短いサンプルは、消費税率のような固定値を 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(変数)の違い | マクロで定数を使う場面

ConstDim の違いは、値をあとから変えるかどうかです。

Const は「変えない値」、Dim は「処理中に変わる値」を扱います。どちらが上位という話ではなく、役割が違います。

Const(定数)とDim(変数)の違い

ConstとDimの違い早見表

スクロールできます
比較項目ConstDim
役割固定値に名前を付ける値を入れる箱を作る
値の変更できないできる
代表例税率、上限回数、シート名合計値、行番号、カウンター
宣言例Const TAX_RATE As Double = 0.1Dim 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 Sub

total はループのたびに変わるため、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 は変わらない値、totali は変わる値です。

変数について学びたい方には以下もおすすめです

定数(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 Sub

Range("A2").Value は実行時に変わるため、Const ではなく Dim で受け取ります。

また、Const に変数や関数の戻り値を入れることはできません。

'// これはNG
Const TODAY_TEXT As String = Format(Date, "yyyy/mm/dd")

FormatDate の結果は実行時に決まるため、定数にはできません。
この場合は Dim を使います。

Sub TodayTextSample()
    Dim todayText As String

    todayText = Format(Date, "yyyy/mm/dd")
    MsgBox todayText
End Sub
スポンサーリンク

Public Const・Private Const・グローバル定数の使い分け

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 Sub

Public 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_SHEETOUTPUT_SHEETCUSTOMER_COLAMOUNT_COL が定数です。

集計処理そのものは DimlastRowitotal で進めます。
固定値と変動値が分かれているため、後から読んでも役割が分かりやすくなります。

Private Constの宣言について

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行ずつコードを解説
クリック」してコードの詳細解説を見る
  1. Const FILE_PATH As String = “C:\新しいパス\新しいファイル名.xlsx”
    • この行では、定数「FILE_PATH」を宣言しています。
      「Const」は定数を宣言するキーワードで、一度設定された値を後から変更できません
      ここでは「String (文字列型)」の定数として、パス(”C:\新しいパス\新しいファイル名.xlsx”)を保持しています。
      定数を使うことで、プログラム全体でこのパスを使い回しつつ、誤って変更されるリスクを防ぐことができます
  2. Sub OpenReport()
    Workbooks.Open FILE_PATH
    End Sub
    • このブロックでは、「OpenReport 」というサブルーチンを定義しています。
      サブルーチン「Sub」は、特定の処理をまとめて実行するコードの塊です。
      Workbooks.Open」は指定されたパスのファイルを開くためのメソッドで、引数として定数「FILE_PATH」を渡しています
      これにより、先ほど設定したパスにあるExcelファイルが開かれます。
  3. Sub SaveReport()
    ThisWorkbook.SaveAs FILE_PATH
    End Sub
    • このブロックでは、「SaveReport」というサブルーチンを定義しています。
      ThisWorkbook は、現在のExcelファイル(コードが実行されているブック)を指し、「SaveAs」メソッドを使って保存する処理を行います。
      定数「FILE_PATH」に指定されたファイル名で保存します
      これにより、プログラムの中で同じ場所に保存する処理が一貫して行われます。

このコードは、定数「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行ずつコードを解説
クリック」してコードの詳細解説を見る
  1. Const ERROR_MESSAGE As String = “An unexpected error has occurred.”
    • この行では、定数「ERROR_MESSAGE」を宣言しています。
      定数は、一度設定した値を変更できない変数のようなものです。
      この定数には、エラーメッセージとして「An unexpected error has occurred.」(予期しないエラーが発生しました)という文字列が設定されています。
      このように定数を使うことで、コード全体で統一されたメッセージを使用でき、後で変更が必要になった場合もこの1か所を変更するだけで済むため、メンテナンスが容易になります。
  2. Sub ExampleProcedure()
    • ここでは、新しいサブルーチン「ExampleProcedure」を定義しています。
      サブルーチンは、一連の処理をまとめたコードのブロックです。このサブルーチンが呼び出されると、中に書かれた処理が順番に実行されます。
  3. On Error GoTo ErrorHandler
    • この行は、エラーハンドリングの設定を行っています。
      もしこのサブルーチン内でエラーが発生した場合、コードの実行は通常の流れを中断し、指定されたラベル「ErrorHandler」にジャンプします
      これにより、エラーが発生した際の処理をまとめて実行することが可能になります。
  4. ‘// コード本体
    • この場所にメインの処理を記述してください。
  5. Exit Sub
    • この行は、サブルーチンの処理を途中で終了させる命令です。
      通常の流れでは、この行が実行されると、 サブルーチン「ExampleProcedure」はここで終了し、その後の処理は行われません
      つまり、Exit Sub に到達した時点でサブルーチンは停止し、プログラムの次の命令があれば、別のサブルーチンやプロシージャに移ることになります。
      エラーが発生しなければ、この行で「ExampleProcedure」は終了します。
  6. ErrorHandler:
    • これはエラーハンドリングのためのラベルです。
      もしこのサブルーチン内でエラーが発生すると、前述の「On Error GoTo ErrorHandler」によって処理がこのラベルの場所にジャンプします
      このラベル以降の行には、エラー発生時に実行される処理が書かれています。
  7. MsgBox ERROR_MESSAGE
    • この行では、MsgBox関数を使用してメッセージボックスを表示します。
      表示されるメッセージは、最初に宣言した定数「ERROR_MESSAGE」の値、つまり「An unexpected error has occurred.」です。
      このメッセージボックスは、エラーが発生したことをユーザーに知らせるために使用されます。
  8. 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 で実行時に取得
DateFormat の結果を定数にするできないDim で実行時に作る
オブジェクトを定数にするできないDimSet を使う

一度宣言した定数に、あとから値を入れ直すことはできません。

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 Sub

Const は単体の固定値、Enum は選択肢のまとまり、と考えると使い分けやすくなります。

FAQとまとめ

Q. ConstDim はどちらを使えばいいですか?

あとから値を変えないなら Const、処理中に値を変えるなら Dim です。
税率、シート名、列番号、固定メッセージは Const に向いています。

Q. Public Const はどこに書きますか?

標準モジュールの先頭に書きます。Sub の中には書けません。
ブック全体で使う共通設定だけに絞るのがおすすめです。

Q. Private ConstConst の違いは何ですか?

モジュール先頭に書くなら、Private Const と書くと「このモジュール内だけ」という意図が明確になります。
プロシージャ内で使う場合は Private を付けず、Const だけを書きます。

Q. Const の型は省略してもいいですか?

省略しても動く場合はありますが、実務では As StringAs Long のように型を書いたほうが安全です。
値の種類が一目で分かり、意図しない型の扱いを避けやすくなります。

Q. vba const string はどう書きますか?

文字列定数は Const SHEET_NAME As String = "集計" のように書きます。
シート名、ファイル名、固定メッセージに向いています。

Q. const long はどんなときに使いますか?

行番号、列番号、上限回数、IDなど、整数の固定値に使います。
Excelの行番号を扱うなら Long を基本にすると安全です。

Q. 定数に配列は使えますか?

配列そのものを Const で宣言するのは基本的にできません。
個別の定数に分ける、Enum を使う、関数で配列を返す、などの方法で代替します。

まとめ

Const は「値を変えないための文法」だけではなく、「コードの意味を名前で説明するための道具」です。

次に読むなら、変数、グローバル変数、配列、最終行取得の記事をあわせて確認すると、定数の使いどころがより分かりやすくなります。

あわせて読みたい
サイトマップ このページは、本サイトの記事を分かりやすくまとめました。ぜひご覧ください。 目次 「共通」を見る 「VBA」を見る 「Officeスクリプト」を見る 「ワークシート関数」...
スポンサーリンク
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次