2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

VBAでRedimがEnumを変数扱いしてくる件【闇の魔術に対する防衛術 第9⁴ ⁄ ₃章】

Last updated at Posted at 2021-08-04

なにごと?

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.Horus3として扱われます。

「定数式が必要です」に遭遇したコード

実際に「定数式が必要です」に遭遇したコードがこちらです。

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!

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?