なにごと?
VBAでコーディングをしていると、たまに、「定数式が必要です」というエラーメッセージに遭遇することがあります。
これは多くの場合、配列の宣言時に次元の要素数を指定する際に、変数を使って指定していることに起因します。
例えば、以下のようなプログラムは、2行目で静的解析エラーになります。
Dim A As Integer = 2
Dim TestArray(A) As String
これは、ReDim
構文により回避可能です。
Dim A As Integer = 2
Dim TestArray() As String
ReDim TestArray(A) As String
ところが、ReDim
構文を使っているにも関わらず、「定数式が必要です」というエラーメッセージが出ることがあるのです。
それはEnum
を使っているときです。
Enumとはそもそも何?
Enumとは日本語で列挙型といい、その要素は定数として扱われるものです。
Private Enum Animals
Lion = 1
Bastet
Horus
Cerberus
End Enum
上記のようなAnimals
という列挙型を定義した場合、Animals.Horus
は3
として扱われます。
「定数式が必要です」に遭遇したコード
実際に「定数式が必要です」に遭遇したコードがこちらです。
Private Enum ColumnIndex
Partname = 1
SpecificationNumber
Dimensions
Tolerances
Actuals
Judge
End Enum
Sub Export()
Dim SourceSheet As Worksheet
Set SourceSheet = ThisWorkbook.Worksheets("DataBase")
Dim SourceTable As ListObject
Set SourceTable = SourceSheet.ListObjects(1)
Dim SourceArray() As String
ReDim SourceArray(SourceTable.ListRows.Count, ColumnIndex.Judge - 1)
' any code
MsgBox "Finish Export"
End Sub
一見すると、Redim
を利用しているので問題なさそうです。
「定数式が必要です」を回避できた方法
そして、これを「定数式が必要です」から解放した方法が、まさかのEnum
の宣言方法の変更でした。
Private Enum ColumnIndex
Partname = 1
SpecificationNumber = 2
Dimensions = 3
Tolerances = 4
Actuals = 5
Judge = 6
End Enum
このように、Enum
の宣言にて省略していた数値と等号を復活させたら、「定数式が必要です」が消えてくれました。
まとめ
この現象及び方法は、再現性を確認しておりません。鵜呑みにする前に各自の環境にて試し、その有用性をお試しすることをお勧めします。念のため、当記事執筆時の環境を記しておきます。
環境:Windows10, Office Home and Business 2013
Excelsior!