固定長(その1)
変数宣言時には要素数を指定せず、 Array()
で初期化する方法。
動作確認用サンプルコード
Dim arr_1_() As Variant
arr_1_ = Array("あ", "い", "う")
Dim val_1_ As Variant
For Each val_1_ In arr_1_
Debug.Print val_1_ & " ですね"
Next
要素数が多くなったり、要素の値が長いと Array()
が横にどんどん長くなってしまう。
(コードの可読性が落ちる)
また、後述のような注意点もある。
変数はVariantで宣言が必要
下記コードはコンパイルエラーにならない、しかし…
コンパイルは通るのに実行時に例外となるサンプル
Dim arr_1_() As String
arr_1_ = Array("あ", "い", "う")
固定長(その2)
『最大インデックス』を指定して変数宣言する方法。
『要素数』ではなく『最大インデックス』なので注意。
動作確認用サンプルコード
Dim arr_2_(2) As String
arr_2_(0) = "いち"
arr_2_(1) = "にー"
arr_2_(2) = "さん"
Dim val_2_ As Variant
For Each val_2_ In arr_2_
Debug.Print val_2_ & " ですね"
Next
可変長
ReDim Preserve
を使って配列を再定義。
動作確認用サンプルコード
Dim arr_3_() As String
Dim i_ As Long
For i_ = 0 To 2
'ReDimで配列を再定義できる。
'しかし、ReDim『だけ』だとそれまで入っていた要素を全て消してしまう。
'なので、 Preserveを付けている。
ReDim Preserve arr_3_(i_)
'UBound()で配列の『最大インデックス』が取得できる。
arr_3_(UBound(arr_3_)) = (i_ + 1) & "ばんめ"
Next
Dim val_3_ As Variant
For Each val_3_ In arr_3_
Debug.Print val_3_ & " ですね"
Next
変数宣言時に最大インデックス指定するとコンパイルエラー
蛇足
『固定長(その1)』は一見便利そうだが、『人が気を付けてコーディングする必要がある』という点があるのでやめた方がいい。
『固定長(その2)』は『要素が固定』という前提が崩れることがほぼゼロ%が場合に限りアリ。
要素が動的に変わる(変わる余地がありそう)なら、配列ではなく連想配列(Scripting.Dictionary)を使った方がいい。
参考サイトさん
バージョン
Windows 10 Pro 22H2 19045.2913
Microsoft Access for Microsoft 365 MSO (バージョン 2304 ビルド 16.0.16327.20200) 32 ビット