【VBA(Excelマクロ)】コンパイルエラー「定数式が必要です」の原因と対処法

スポンサードリンク
VBA

この記事を読んでわかること

  • 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つです。

  1. 青い部分をリテラルに変更して再実行する(0や1、「あ」など)
  2. 青い部分を削除して再実行する
  3. 青い部分の一行をコメントアウトして再実行する

今回の場合は、「1」でエラーは解消されますが、「2」や「3」で改善される場合もあります。
あとは最終の出力結果に問題が無いかを確認しましょう。

これでもエラーが続く場合や、別の個所にエラーが出る場合は、同じ作業を繰り返しましょう。

プログラミングの知識が身についてくるようになれば、コンパイルエラーは減っていきます。
腐らずがんばりましょう。

スポンサードリンク

エラーを繰り返さないために

「宣言に変数は使えない」という一文を覚えるだけで、このエラーを繰り返すことは少なくなります。
定数の宣言では必ずリテラルを代入し、配列の宣言では定数かリテラルで指定するだけです。

それ以外のところでもこのエラーが発生する可能性はありますが、今回解説したようにデバッグを行い、改善することで、エラーの発生を抑えることができます。

スポンサードリンク

最後に

VBA(Excelマクロ)のコンパイルエラー「定数式が必要です」について解説いたしました。

当ブログでは、VBAマクロやPythonなど、時間を生み出すプログラミング術を公開しております。
この記事がわかりやすいと感じた方は、他の記事も読んでいってください。

最後までお読みいただき、ありがとうございました。がんばってください!

タイトルとURLをコピーしました