多次元配列使用時のエラー解決方法|VBA
インデックスが有効範囲にありません
![インデックスが有効範囲にありません](https://moewe-net.com/wp-content/uploads/2018/11/vba-error1.png)
多次元配列の要素数をReDim Preserve
で変更(既存データを保持)する場合は最終次元しか変更できません。
ReDim
のみ(既存データを破棄)は可能です。
NGパターン
Dim arrays() As String
ReDim arrays(1, 128)
ReDim Preserve arrays(0, 64)
解決方法
Dim arrays() As String
ReDim arrays(1, 128)
ReDim Preserve arrays(1, 64)
この場合、[0, 0]-[0, 64], [1, 0]-[1, 64]までの二次元配列になります。
配列はすでに宣言されています
![配列はすでに宣言されています](https://moewe-net.com/wp-content/uploads/2018/11/vba-error2.png)
静的な配列が1回しか宣言できないために発生します。次元を変更できるのは動的な配列だけです。
NGパターン
Dim arrays(1, 128) As String
ReDim arrays(1, 128)
解決方法
Dim arrays() As String
ReDim arrays(1, 128)
この配列は固定されているか、または一時的にロックされています
![この配列は固定されているか、または一時的にロックされています](https://moewe-net.com/wp-content/uploads/2018/11/vba-error3.png)
静的な配列を引数として渡した場合、コールされた関数側で引数の配列に対して、ReDim
やReDim Preserve
を実行すると発生します。
2次元配列を引数に渡す方法
多次元配列を引数として受け取る方法です。通常の配列と同じように受け取って使用します。
呼び出し側
Dim arrays() As String
ReDim arrays(1, 128)
Call FillArrays(arrays)
受け取り側
Function FillArryas(ByRef arrays() As String)
arrays(0, 1) = "01"
End Function