今回はFor文を使用して配列の要素数を動的に増やす方法を紹介します。
不定期でVBAに関する記事を投稿していますので、是非こちらも併せてご覧ください!
For文を使用して配列の要素数を動的に増やす方法
配列の要素数は以下の手順で増やすことができます。
- UBoundを使って現在の要素数を取得する
- 現在の要素数に1を加算する
- Redimを使って要素数を増やす
以下にテストコードを用意しました。コピペしてチェックしてみてください。
Sub test_Array_1()
Dim ary() As Long
Dim i As Long
ReDim ary(0)
For i = 1 To 10
ReDim ary(UBound(ary) + 1)
ary(UBound(ary)) = i
Next i
MsgBox "要素数:" & UBound(ary)
End Sub
実行するとメッセージボックスに配列の要素数が表示されます。
![For文を使用して配列の要素数を動的に増やす方法_1](https://masashi-blog418.com/wp-content/uploads/2022/10/image-14.png)
ポイント
ポイントはReDim ary(UBound(ary) + 1)の部分です。
For i = 1 To 10
ReDim ary(UBound(ary) + 1)
...
Next i
今回のコードでは処理を分けずにまとめて記述していますが、動作は最初に紹介したものと同じです。
- UBoundを使って現在の要素数を取得する
- 現在の要素数に1を加算する
- Redimを使って要素数を増やす
ary(UBound(ary)で現在の要素数を取得し、それに1を加算することで要素数を増やしています。これをFor文で繰り返すことで配列の要素数が指定の数まで増えていく、というイメージです。
既に格納されている値を消さずに要素数を増やしたい場合
気づいた方もいると思いますが、実は上記コードのままだと要素数は増えていますが、値が思った通りに格納されません。
というのも、Redimを実行すると要素数を上書きして再定義してしまうからです。ary(1) = 1を入れても次にRedim ary(2)をした瞬間に入れていた値が全て消えてしまいます。
![既に格納されている値を消さずに要素数を増やしたい場合_1](https://masashi-blog418.com/wp-content/uploads/2022/10/image-17.png)
つまり、Redimだけだと値を保持しながら要素数を増やすことが出来ません。
![](https://masashi-blog418.com/wp-content/uploads/2022/09/b0261.png)
じゃあどうやって消さずに要素数を増やすの?
ってなると思います。
既に格納されている値を消さずに要素数を増やしたい場合はPreserveを使用します。以下にテストコードを用意していますので、コピペしてチェックしてみてください。
Sub test_Array_2()
Dim ary() As Long
Dim i As Long
ReDim ary(0)
For i = 1 To 10
ReDim Preserve ary(UBound(ary) + 1)
ary(UBound(ary)) = i
Next i
MsgBox "要素数:" & UBound(ary)
End Sub
実行すると最初に紹介したコードと同じようにメッセージボックスが表示されますが、aryの中身を見てみると格納された値が消えずに残っているのが確認できます。
![既に格納されている値を消さずに要素数を増やしたい場合_2](https://masashi-blog418.com/wp-content/uploads/2022/10/image-16-1024x453.png)
既に格納されている値を消さずに要素数を増やしたい場合は、Redimの後ろにPreserveを付けておくようにしましょう。
注意点
配列の要素数を増やす時に注意しておくことがあります。それが事前に配列を初期化しておく必要があることです。
というのも、配列を定義した段階では配列の中身は空っぽな為、その状態でUBoundを使用して要素数を取得しようとするとエラーが発生してしまいます。
![注意点_1](https://masashi-blog418.com/wp-content/uploads/2022/10/image-15.png)
なので配列の要素数を増やすときは、事前に配列を初期化しておくことを忘れないようにしましょう。
ReDim ary(0)
まとめ
今回はFor文を使用して配列の要素数を動的に増やす方法を紹介しました。
動的に要素数を増やすときは、
- UBoundを使って現在の要素数を取得する
- 現在の要素数に1を加算する
- 格納されている値を上書きしたくない場合はPreserveを使用する
上記3点に気を付けることを忘れないようにしましょう。
コメント