はじめに
VBAで動的配列を扱う際、変数に括弧を付けて動的配列変数を宣言するパターンと、括弧を付けない変数に配列を代入するパターンがあり、その違いが気になっていたので、調べてみました。
変数の宣言
変数に括弧を付けて動的配列変数を宣言するパターン
Dim 括弧付き変数_A() As 型
- 型はString型、Long型、Object型、Variant型など、任意の型を選ぶことができる。
- ただし、セル範囲から値を取り出して格納する場合は、必ずVariant型で宣言しておく必要がある。(セル範囲から取り出す値が文字列型だからといって、String型で宣言することはできない)
括弧を付けない変数に配列を代入するパターン
Dim 括弧無し変数_B As Variant
- 配列を代入するには、必ずVariant型で宣言する必要がある。
- この時点ではまだ配列変数ではない。単一の値も、オブジェクトも、配列も、何でも代入することができる、代入前の変数、というイメージ。
ReDimステートメント
ReDim 括弧付き変数_A(1 To 3)
ReDim 括弧無し変数_B(1 To 3)
- ReDimステートメントで「括弧付き変数_A」のサイズを変更できる。
- 「括弧無し変数_B」はReDimステートメントによって配列変数になる。
セル範囲の値を配列に格納する
括弧付き変数の場合
括弧付き変数_A() = ThisWorkbook.Worksheets(1).Range("A1:E1").Value
- 変数名の後ろの括弧は省略可能
括弧付き変数_A = ThisWorkbook.Worksheets(1).Range("A1:E1").Value
- .Valueの記述を省略することはできない
'↓これはエラー
括弧付き変数_A() = ThisWorkbook.Worksheets(1).Range("A1:E1")
括弧付き変数_A = ThisWorkbook.Worksheets(1).Range("A1:E1")
括弧無し変数の場合
括弧無し変数_B = ThisWorkbook.Worksheets(1).Range("A1:E1").Value
- .Valueの記述は省略可能
括弧無し変数_B = ThisWorkbook.Worksheets(1).Range("A1:E1")
- "変数名()"のように、括弧を付けるとエラーになる。
'↓これはエラー
括弧無し変数_B() = ThisWorkbook.Worksheets(1).Range("A1:E1").Value
括弧無し変数_B() = ThisWorkbook.Worksheets(1).Range("A1:E1")
Eraseステートメント
「括弧付き変数」も「括弧無し変数」も、Eraseステートメントで初期化できる。
Erase 括弧付き変数_A
Erase 括弧無し変数_B
変数に単一の値やオブジェクトを再代入する
- 括弧付き変数には、単一の値(文字列、数値、日付)やオブジェクトを再代入することは出来ない。
- 括弧無し変数には、単一の値(文字列、数値、日付)やオブジェクトを再代入することが出来る。その際、配列変数ではなくなる。
'括弧付き変数_A = 1000 ←エラー
括弧無し変数_B = "XYZ"
Set 括弧無し変数_B = ThisWorkbook
まとめ
動的配列変数は、変数宣言時に括弧が付いているかどうかによって、扱い方に細かな違いや注意点がある。特に、セル範囲の値を配列に格納する際の記述の違いがややこしく感じた。
今回検証のために使ったコード
Option Explicit
Sub 配列変数テストマクロ()
Dim 括弧付き変数_A() As Variant
Dim 括弧無し変数_B As Variant
Stop
ReDim 括弧付き変数_A(1 To 3)
ReDim 括弧無し変数_B(1 To 3)
Stop
括弧付き変数_A() = ThisWorkbook.Worksheets(1).Range("A1:E1").Value
括弧無し変数_B = ThisWorkbook.Worksheets(1).Range("A1:E1").Value
Stop
Erase 括弧付き変数_A
Erase 括弧無し変数_B
Stop
'括弧付き変数_A = 1000 ←エラー
括弧無し変数_B = "XYZ"
Stop
Set 括弧無し変数_B = ThisWorkbook
Stop
End Sub