今回はRedim Preserve
実行時に「実行時エラー’9’:インデックスが有効範囲にありません。」が出る原因と対処法を備忘録も兼ねて紹介したいと思います。
エラーが発生する原因と対処法
それではエラーが発生する原因と対処法を紹介します。
私が実際に1次元配列を使用した際にエラーが発生したため、今回は1次元配列を用いて説明します。
原因
結論から言うと末尾以外の要素数も変更しようとしている可能性があります。
以下のコードを使って説明します。
Sub test_aryError()
Dim ary_str() as String
Redim ary_str(1 to 3)
ary_str(1) = "はりぼな1"
ary_str(2) = "はりぼな2"
ary_str(3) = "はりぼな3"
Redim Preserve ary_str(4)
ary_str(4) = "はりぼな4"
End Sub
実行してみると分かりますが、Redim Preserve ary_str(4)
の所でエラーが発生するはずです。
これはRedim ary_str(1 to 3)
で配列を要素1~要素3で定義したのに、Redim Preserve ary_str(4)
で要素0~要素3で再定義しており、冒頭の要素番号が一致しなくなった為エラーが発生してしまった、ということになります。
Redim ary_str(1 to 3)
'実行後ary_str(1)~(3)で定義される(要素数:3)
ary_str(1)
ary_str(2)
ary_str(3)
Redim Preserve ary_str(4)
'実行後ary_str(0)~(3)で定義される(要素数:4)
ary_str(0)
ary_str(1)
ary_str(2)
ary_str(3)
→ary_str(0)が定義された(ary_str(1)より前に要素が追加されている)為エラー
End Sub
対処法
対処法として末尾の要素以外は変更しないようにしましょう。
今回の例で言うとRedim ary_str(1 to 3)
で定義した場合は1の部分は変更せずに3の部分だけ変えるようにする、といった感じです。
Redim ary_str(1 to 3)
~
'末尾だけ要素数を変える(1は固定にする)
Redim Preserve ary_str(1 to 4)
まとめ
今回はRedim Preserve
実行時に「実行時エラー’9’:インデックスが有効範囲にありません。」が出る原因と対処法を紹介しました。
(1 to n)
で定義した配列に対してRedim Preserve
を使用する時は、末尾の要素数だけ変更するようにしましょう!
このブログではVBAに関する記事を不定期で投稿していますので、是非ご覧ください!
コメント