この記事を読んでわかること
- VBAのコンパイルエラー「定数式が必要です」と出た場合の原因と対処法がわかる
- エラーの原因を特定するコツを知れる
- エラーを繰り返さない方法を学べる
※わかりやすさを重視しております。厳密には解釈が異なる場合がありますことをご了承ください。
-著者情報-
名前:Utatane
VBA(マクロ)歴:3年
Excel使用歴:15年以上
ひとこと:初心者だった当時に戻った気持ちになって解説いたします
VBA(Excelマクロ)のコンパイルエラー「定数式が必要です」とは?

このエラーは、定数で指定する必要があるのに、変数や取得した値で指定した場合に発生します。
定数とは、プログラム途中で変化することの無い値を指します。
例えば、定数として宣言した値やリテラルなどです。
関連記事{定数とは}
リテラルとは、コード内で直接指定する数値や文字列のことです。
例えば、「i = 1」の「1」は直接指定しているのでリテラルです。
「i = num」のnumは変数なのでリテラルではありません。
「定数式」と言われると、「は?何のこと?」と思ってしまいますが、
単純に「変数じゃなくて定数(もしくはリテラル)で指定してくださいよ」と言っているだけです。
【コンパイルエラーとは?】
プログラム実行前のコンパイル(コードチェック)の段階で発生したエラーのことです。
このままプログラムを実行してもエラーになるから、実行前に教えてくれているということです。
「真冬に半袖で出かけるってダメでしょ!風邪引くよ!」と言われているようなものでしょうか。
コンパイルエラーはコードに問題がある場合が多いです。
エラーには、コンパイルエラーの他に「実行時エラー」があります。
実行時エラーは、コンパイルが承認された後、プログラムを実行中に発生したエラーのことです。
「コート着て来たたけど、外が寒すぎた…帰ろう」といったところでしょうか。
では、具体的な原因と対処法を見ていきましょう。
コンパイルエラー「定数式が必要です」の原因と対処法
よくある原因を2つ紹介いたします。
定数の宣言に変数を指定した
定数の宣言に変数を指定することはできません。
下記のVBAコードを見てください。
Sub 定数式が必要です1()
Dim myname As String ' 変数「myname」を宣言
myname = "Utatane" ' 変数に値を代入
Const CAST As String = myname ' 定数を宣言(変数を代入しているのでエラー)
End Sub
4行目で定数を宣言しています。
定数は、宣言と同時に値を代入する決まりになっていますが、変数を代入しているためエラーになります。
正しくは、変数を使わずリテラルを代入します。
Sub 改善案1()
Dim myname As String ' 変数「myname」を宣言
myname = "Utatane" ' 変数に値を代入
Const CAST As String = "Utatane" ' 定数を宣言
End Sub
これでエラーは解消されました。
セルから取得した値も同様に指定できません。
Sub 定数式が必要です2()
Const CAST As String = Range("A1").Value ' エラー
End Sub
Sub 改善案2()
Const CAST As String = "Utatane"
End Sub
定数は必ずリテラルを代入するようにしましょう。
配列の宣言で変数を使用した
配列を宣言する際、要素数を指定する場合があります。
その要素数を変数を使って指定した場合、エラーが発生します。
例えば、下記のようにExcelのシート名を全て取得して配列に入れたい場面があったとします。
Sub 定数式が必要です3()
Dim myname(1 To Worksheets.Count) As String ' エラー
Dim i As Integer
For i = 1 To Worksheets.Count
myname(i) = Worksheets(i).Name
Next i
End Sub
2行目の配列「myname」の宣言で変数である「Worksheets.Count」を使って要素数を指定したためエラーが発生します。
「Worksheets.Count」は、現在のシート数を取得できる機能です。
例えば「Sheet1~3」の3シートがあった場合、3を取得できる便利なものです。
しかしながら、それを配列の宣言では使うことができません。
改善案は下記のとおりです。
Sub 改善案3()
Dim myname() As String
ReDim myname(1 To Worksheets.Count) As String
Dim i As Integer
For i = 1 To Worksheets.Count
myname(i) = Worksheets(i).Name
Next i
End Sub
関連記事{配列とは?宣言と使い方}
2行目の宣言では要素数を指定せず宣言し、3行目の「ReDim」で要素数を指定します。
「ReDim」では変数が使えるため、これでエラーは解消されます。
配列の宣言は定数が必須条件となっています。
下記の例もエラーが発生します。
Sub 定数式が必要です4()
Dim num As Integer
num = 3
Dim myname(1 To num) As String ' エラー
Dim i As Integer
For i = 1 To Worksheets.Count
myname(i) = Worksheets(i).Name
Next i
End Sub
要素数が変わる場合は、さきほどのように「ReDim」にて変数で指定しましょう。
原因を特定するためのコツ
コンパイルエラーは原因が特定しづらいエラーの1つですが、コツをお教えします。
まず、エラーが発生したら、エラー画面の「OK」ボタンをクリックしましょう。

すると、該当するプロシージャが黄色くマーキングされ、原因と思われる箇所が青くなります。

試してみるのは以下の3つです。
- 青い部分をリテラルに変更して再実行する(0や1、「あ」など)
- 青い部分を削除して再実行する
- 青い部分の一行をコメントアウトして再実行する
今回の場合は、「1」でエラーは解消されますが、「2」や「3」で改善される場合もあります。
あとは最終の出力結果に問題が無いかを確認しましょう。
これでもエラーが続く場合や、別の個所にエラーが出る場合は、同じ作業を繰り返しましょう。
プログラミングの知識が身についてくるようになれば、コンパイルエラーは減っていきます。
腐らずがんばりましょう。
エラーを繰り返さないために
「宣言に変数は使えない」という一文を覚えるだけで、このエラーを繰り返すことは少なくなります。
定数の宣言では必ずリテラルを代入し、配列の宣言では定数かリテラルで指定するだけです。
それ以外のところでもこのエラーが発生する可能性はありますが、今回解説したようにデバッグを行い、改善することで、エラーの発生を抑えることができます。
最後に
VBA(Excelマクロ)のコンパイルエラー「定数式が必要です」について解説いたしました。
当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。
最後までお読みいただき、ありがとうございました。がんばってください!