VBAでデータの量が不確定な場合、どうやって配列を使用したらいいんだろう…
そんな疑問を持っていませんか?
この記事では、VBAにおける「動的配列」を使ってデータを効率的に管理する方法を詳しく解説します。
「動的配列」を使うことで、データの増減に柔軟に対応でき、プログラムの効率性が大幅に向上します。
この記事では、動的配列の基本的な概念からその使い方、さらに配列のサイズ変更方法まで詳しく解説します。
使用例もすべてコピペして実行できるので、ぜひ最後までご覧いただき、実践してみてください。
そもそも配列とは?という方は、そちらを解説した記事もありますので是非ご覧ください。
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
この記事でできるようになること
この記事を読むことで、以下のことができるようになります。
VBAの動的配列とは?
動的配列とは、プログラムの実行中にサイズを変更できる配列です。
通常の配列は、宣言時にサイズを決定しますが、動的配列は後からサイズを変更することができます。
これにより、データの量が変動する状況でも、柔軟に対応することが可能です。
動的配列の宣言方法
動的配列を宣言する際には、Dimステートメントを使用しますが、サイズを指定せずに宣言します。
- 配列名 (必須)
- この配列の名前を指定します。
配列名には意味のある名前を付けると、コードの可読性が高まり、後からコードを見直すときに理解しやすくなります。
- この配列の名前を指定します。
- 型 (必須)
- この配列がどのような種類のデータを格納するのかを指定する部分です。
VBAでは、Long, String, Double, Variant など、さまざまなデータ型を指定することができます。
- この配列がどのような種類のデータを格納するのかを指定する部分です。
このように宣言された配列は、サイズが未定のままですが、次に説明する「ReDimステートメント」を使うことでサイズを決定します。
ReDimステートメントを使って動的配列を再宣言する
動的配列のサイズを設定・変更する際に使うのが、ReDimステートメントです。
ReDimを使うことで、配列のサイズを新たに設定し、必要に応じて何度でもサイズを変更することができます。
- ReDim (必須)
- このステートメントは、動的配列のサイズを設定または変更するために使用されます。
ReDimを使うことで、配列のサイズを自由に変更できます。
- このステートメントは、動的配列のサイズを設定または変更するために使用されます。
- 配列名 (必須)
- サイズを変更する対象の配列名を指定します。
この配列名は、事前にDimステートメントで宣言された動的配列の名前と一致している必要があります。
- サイズを変更する対象の配列名を指定します。
- 新しいサイズ (必須)
- 配列の新しい要素数を指定します。
この要素数は「0以上」の整数で、配列が格納できる要素の数を決定します。
サイズが変更された後、配列は指定された数の要素を持つようになります。
- 配列の新しい要素数を指定します。
使用例
Dim myArray() As Long
ReDim myArray(3) '// 配列のサイズを3に設定
このコードでは、動的配列「myArray」のサイズを「3」に設定しています。
これにより、myArrayは「4つ」の要素を持つ配列として利用できるようになります。
※要素は「0」から開始するため、「0」「1」「2」「3」の合計「4つ」の要素を持ちます。
注意点: ReDimによるデータの消失
ここで注意が必要なのは、ReDimステートメントを使ってサイズを再設定すると、既存の配列データがすべて消去され、初期化されてしまうことです。
例えば、myArray(0)にデータを格納していても、ReDimを再度実行すると、既存のデータが失われ、新しいサイズで配列が再作成されてしまいます。
Sub ExampleReDim()
Dim myArray() As Long
'// 配列を初期化してサイズを5に設定
ReDim myArray(5)
myArray(0) = 10
myArray(1) = 20
'// 現在の配列の内容を確認
Debug.Print "変更前のReDim: " & myArray(0) & ", " & myArray(1) '// 結果: 10, 20
'// 配列のサイズを10に変更
ReDim myArray(10)
'// ReDim後にデータを確認
Debug.Print "変更後のReDim: " & myArray(0) & ", " & myArray(1) '// 結果: 0, 0 (データが消える)
End Sub
処理結果
詳細解説
このように、ReDimだけを使用すると、配列の再宣言時に既存のデータが失われるため、データを保持したままサイズを変更したい場合は、ReDim Preserveステートメントを使う必要があります。
ReDim Preserveを使ってデータを保持する
先ほど説明した通り、ReDimを使って配列のサイズを変更すると、元のデータは失われます。
しかし、Preserveキーワードを使うことで、既存のデータを保持しながら配列のサイズを変更することが可能です。
- ReDim (必須)
- このステートメントは、動的配列のサイズを設定または変更するために使用されます。
ReDimを使うことで、配列のサイズを自由に変更できます。
- このステートメントは、動的配列のサイズを設定または変更するために使用されます。
- Preserve (必須)
- このキーワードを使用することで、サイズ変更時に既存のデータを保持することができます。
Preserveを付けないと、サイズ変更時にデータは消去されてしまうので、データを維持したままサイズを変更したい場合には必ず使用します。
- このキーワードを使用することで、サイズ変更時に既存のデータを保持することができます。
- 配列名 (必須)
- サイズを変更する対象の配列名を指定します。
この配列名は、事前にDimステートメントで宣言された動的配列の名前と一致している必要があります。
- サイズを変更する対象の配列名を指定します。
- 新しいサイズ (必須)
- 配列の新しい要素数を指定します。
この要素数は「0以上」の整数で、配列が格納できる要素の数を決定します。
サイズが変更された後、配列は指定された数の要素を持つようになります。
- 配列の新しい要素数を指定します。
使用例
Sub ExampleReDimPreserve()
Dim myArray() As Long
'// 配列を初期化してサイズを5に設定
ReDim myArray(5)
myArray(0) = 10
myArray(1) = 20
'// 現在の配列の内容を確認
Debug.Print "Before ReDim Preserve: " & myArray(0) & ", " & myArray(1) '// 結果: 10, 20
'// 配列のサイズを10に拡張し、データを保持
ReDim Preserve myArray(10)
'// ReDim Preserve後にデータを確認
Debug.Print "After ReDim Preserve: " & myArray(0) & ", " & myArray(1) '// 結果: 10, 20 (データが保持される)
End Sub
処理結果
詳細解説
このコードでは、myArrayのサイズを「10」に拡張しながら、最初に格納したデータ(myArray(0) = 10, myArray(1) = 20)を保持しています。
ReDim Preserveを使用することで、サイズ変更後もデータが保持され、Debug.Printで確認した際にも元のデータが表示されます。
動的配列がよく使用される場面
動的配列は、以下のような場面で特に役立ちます。
動的配列の注意ポイント
動的配列を使用する際には、いくつかの注意点があります。
- ReDimを使うと既存のデータは消える
- ReDimのみを使うと、既存のデータは消えてしまいます。
データを保持したままサイズを変更する場合は、必ずPreserveキーワードを使用してください。
⇒ もう一度「Preserveキーワード」の説明を見る
- ReDimのみを使うと、既存のデータは消えてしまいます。
- 配列サイズが大きくなりすぎないように注意する
- 動的配列を使うと、プログラムの実行中に配列が大きくなりすぎる可能性があります。
これによりメモリ不足が発生する場合があるため、必要以上に大きなサイズを設定しないよう注意しましょう。
- 動的配列を使うと、プログラムの実行中に配列が大きくなりすぎる可能性があります。
動的配列の使用例をご紹介
ここからは、「動的配列」の使用例を紹介します。
どれも実際に動作するコードなので、ぜひ実行してみてください。
使用例1: データの追加に対応する動的配列
ユーザーが入力したデータを動的配列に格納する方法を紹介します。
動的配列を使うことで、データが増えていく状況に柔軟に対応しながら、データを効率的に管理することが可能です。
主な使用用途
動的配列を使用して、入力データが増減する場合に対応したデータ管理が可能です。
例えば、Excelシートにユーザーが入力したデータを順次動的配列に格納し、後で一括処理を行いたい場合に非常に有効です。
Sub AddData()
Dim dataArray() As String
Dim i As Long
i = 0
Do While Cells(i + 1, 1).Value <> ""
ReDim Preserve dataArray(i)
dataArray(i) = Cells(i + 1, 1).Value
i = i + 1
Loop
End Sub
- STEP1動的配列の宣言
Dimステートメントを使って動的配列「dataArray」を宣言します。
この時点では配列のサイズは決まっていません。 - STEP2ループの初期化
変数「i」に初期値「0」を代入し、データの格納を開始する準備を行います。
- STEP3Do Whileループでデータの追加
Do Whileループを使用して、セルにデータが存在する限りループを続けます。
各ループでReDim Preserveステートメントを使い、配列のサイズを動的に拡張しながらデータを格納します。 - STEP4ループの終了
セルのデータが空になると、Do Whileループが終了します。
これにより、すべてのデータが動的配列に格納されます。
処理結果
このコードで使用している機能
1行ずつ解説
- Sub AddData()
- この行では、新しいサブルーチン「AddData」を定義しています。
このサブルーチンは、Excelシートに入力されたデータを動的配列に格納する機能を持っています。
- この行では、新しいサブルーチン「AddData」を定義しています。
- Dim dataArray() As String
- ここでは、動的配列「dataArray」をString型で宣言しています。
この配列は、後でユーザーが入力したデータを格納するために使用されます。
- ここでは、動的配列「dataArray」をString型で宣言しています。
- Dim i As Long
- 変数「i」をLong型で宣言しています。
この変数は、ループ内で配列のインデックスとして使用されます。
- 変数「i」をLong型で宣言しています。
- i = 0
- 変数「i」に初期値「0」を代入します。
これにより、配列のインデックスが「0」から始まるように設定されます。
- 変数「i」に初期値「0」を代入します。
- Do While Cells(i + 1, 1).Value <> “”
- Do Whileループを開始します。
この条件は、セル「A1」から順次セルが空でない限り、ループを続けるという意味です。
- Do Whileループを開始します。
- ReDim Preserve dataArray(i)
- ReDim Preserveを使って、動的配列dataArrayのサイズを配列「i」に合わせて拡張しつつ、既存のデータを保持します。
- dataArray(i) = Cells(i + 1, 1).Value
- 動的配列「dataArray」の現在のインデックス「i」に、セル「A1」から順次、セルのデータを格納します。
- i = i + 1
- 変数「i」の値を「1」増やします。
これにより、次のループで配列の次のインデックスにデータが格納されます。
- 変数「i」の値を「1」増やします。
- Loop
- この行でDo Whileループを終了します。
セルのデータが空になるまで、ループが続行されます。
- この行でDo Whileループを終了します。
- End Sub
- サブルーチンの終了を示します。
すべての処理が完了し、動的配列「dataArray」に入力データが格納されます。
- サブルーチンの終了を示します。
この使用例では、動的配列を活用してユーザーが入力したデータを効率的に管理する方法を紹介しました。
ReDim Preserveを使うことで、データを保持しながら配列のサイズを動的に変更し、柔軟なデータ処理が可能になります。
使用例2: UBoundとLBoundを使用した動的配列の範囲操作
動的配列の範囲を確認するために「UBound」と「LBound」を使用する方法を紹介します。
「UBound」は配列の上限インデックスを、「LBound」は配列の下限インデックスを取得するために使用されます。
主な使用用途
動的配列の範囲を動的に確認したい場合に使用します。
具体的には、配列の最初と最後のインデックスを確認する必要があるときに便利です。
この機能を使うことで、配列の処理を行う際に、誤って範囲外のインデックスにアクセスするリスクを回避できます。
Sub CheckArrayBounds()
Dim myArray() As Long
ReDim myArray(5)
myArray(0) = 10
myArray(1) = 20
myArray(2) = 30
MsgBox "下限のインデックス: " & LBound(myArray) & " 上限のインデックス: " & UBound(myArray)
End Sub
- STEP1動的配列の宣言とサイズ設定
Dimステートメントで動的配列「myArray」を宣言し、ReDimステートメントで配列のサイズを設定します。
- STEP2配列にデータを格納
「myArray」の各インデックスにデータを格納します。
ここでは、「myArray(0)」,「 myArray(1)」,「 myArray(2)」にそれぞれ「10」, 「20」, 「30」を格納します。 - STEP3「UBound」と「LBound」で配列の範囲を取得
「LBound」と「UBound」を使用して、配列「myArray」の下限と上限のインデックスを取得し、メッセージボックスで表示します。
処理結果
このコードで使用している機能
1行ずつ解説
- Sub CheckArrayBounds()
- この行では、新しいサブルーチン「CheckArrayBounds」を定義しています。
このサブルーチンは、動的配列の範囲を確認する機能を持っています。
- この行では、新しいサブルーチン「CheckArrayBounds」を定義しています。
- Dim myArray() As Long
- ここでは、動的配列「myArray」をLong型で宣言しています。
後に、この配列のサイズをReDimで設定し、データを格納します。
- ここでは、動的配列「myArray」をLong型で宣言しています。
- ReDim myArray(5)
- ReDimステートメントを使用して、動的配列「myArray」のサイズを「6つ」の要素に設定します(インデックスは0から5まで)。
- myArray(0) = 10
myArray(1) = 20
myArray(2) = 30- ここでは、動的配列「myArray」の最初の3つのインデックスにデータを格納しています。
myArray(0)には「10」、myArray(1)には「20」、myArray(2)には「30」が格納されます。
- ここでは、動的配列「myArray」の最初の3つのインデックスにデータを格納しています。
- MsgBox “下限のインデックス: ” & LBound(myArray) & ” 上限のインデックス: ” & UBound(myArray)
- この行では、LBoundとUBoundを使用して動的配列「myArray」の下限インデックスと上限インデックスを取得し、それをメッセージボックスで表示します。
通常、LBoundは「0」を、UBoundは「5」を返します。
- この行では、LBoundとUBoundを使用して動的配列「myArray」の下限インデックスと上限インデックスを取得し、それをメッセージボックスで表示します。
- End Sub
- この行は、サブルーチンの終了を示しています。
ここで処理が完了し、プログラムは次のステップに進みます。
- この行は、サブルーチンの終了を示しています。
この使用例では、LBoundとUBoundを使用して動的配列の範囲を確認する方法を紹介しました。
この方法を使うことで、配列のインデックス範囲を動的に取得し、安全かつ効率的に配列のデータ処理を行うことが可能になります。
特に、配列のサイズが変更される可能性がある場合や、動的に生成された配列の処理を行う際に、範囲外のエラーを防ぐために役立ちます。
まとめ
動的配列は、VBAプログラミングにおいて柔軟で効率的なデータ管理を実現する重要なツールです。
データの量が不確定な場合や、動的に増減するデータを扱う際に非常に有効です。
この記事では、動的配列の基本概念から、サイズ変更方法、データを保持するためのReDim Preserveの使い方、そして具体的な使用例について詳しく解説しました。
これらの知識を活用することで、より柔軟で効率的なプログラムを作成できるようになります。
ポイントのおさらい
さらに学ぶために
動的配列の基本を理解したら、次は配列を使った高度なデータ操作や、他の配列関連の技術に挑戦してみましょう。
データ管理のスキルが向上し、より複雑なシナリオにも対応できるようになります。