VBAでデータを効率的に管理したいけれど、どうやって固定されたデータを扱えばいいんだろう…
そんな疑問を持っていませんか?
この記事では、VBAにおける「静的配列」を使ってデータを効率的に管理する方法を詳しく解説します。
「静的配列」を使うことで、データの管理が容易になり、プログラムのパフォーマンスを最適化できます。
この記事では、静的配列の基本的な概念からその使い方、さらに初期化の方法まで詳しく解説します。
使用例もすべてコピペして実行できるので、ぜひ最後までご覧いただき、実践してみてください。
そもそも配列とは?という方は、そちらを解説した記事もありますので是非ご覧ください。
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
この記事でできるようになること
この記事を読むことで、以下のことができるようになります。
静的配列とはなにか?
VBAにおいて、静的配列とは、配列のサイズをあらかじめ固定して宣言する方法で、データが固定されている場面でよく使用されます。
静的配列の基本
静的配列とは、配列のサイズを事前に決めて固定する配列のことです。
これは、データの数が事前に確定している場合や、後でサイズを変更する必要がない場合に特に有効です。
例えば、1週間分の売上データや、固定されたオプションリストなどを管理する際に、静的配列を使用することで、データの管理が簡単になります。
静的配列の宣言方法
静的配列を宣言する際には、次のように記述します。
- 配列名 (必須)
- この配列の名前を指定します。
配列名には意味のある名前を付けると、コードの可読性が高まり、後からコードを見直すときに理解しやすくなります。
- この配列の名前を指定します。
- 数値 (必須)
- この配列が格納できる要素の数を指定しています。
基本的にはインデックスは「0」から始まります。
- この配列が格納できる要素の数を指定しています。
- 型 (必須)
- この配列がどのような種類のデータを格納するのかを指定する部分です。
VBAでは、Long, String, Double, Variant など、さまざまなデータ型を指定することができます。
- この配列がどのような種類のデータを格納するのかを指定する部分です。
また、「To」を使って、インデックスの範囲を指定する方法もあります。
- 配列名 (必須)
- この配列の名前を指定します。
配列名には意味のある名前を付けると、コードの可読性が高まり、後からコードを見直すときに理解しやすくなります。
- この配列の名前を指定します。
- 数値1 To 数値2 (必須)
- この配列が格納できる要素の範囲を指定します。
「数値1」がインデックスの開始番号で、「数値2」がインデックスの終了番号を意味します。
例えば、「Dim 売上(1 To 5) As Long」と記述すると、この配列はインデックスが「1」から「5」までの範囲を持ち、「5」つの要素を格納できます。
この形式を使用すると、インデックスが「0」以外の値から始まる配列を作成でき、特定の場面で非常に便利です。
- この配列が格納できる要素の範囲を指定します。
- 型 (必須)
- この配列がどのような種類のデータを格納するのかを指定する部分です。
VBAでは、Long, String, Double, Variant など、さまざまなデータ型を指定することができます。
- この配列がどのような種類のデータを格納するのかを指定する部分です。
この宣言方法では、インデックスが1から7までの要素を持つ静的配列を作成できます。
静的配列をリセットする方法
静的配列の内容をリセットしたい場合、Erase ステートメントを使うと便利です。
Erase を使用すると、配列の全ての要素がそのデータ型に応じた初期値にリセットされます。
Erase ステートメントの使い方
例えば、以下のように配列に値を設定した後、それをリセットすることができます。
Dim 数字(4) As Long
'// 配列に値を設定
数字(0) = 10
数字(1) = 20
数字(2) = 30
数字(3) = 40
数字(4) = 50
'// 配列をリセット(初期化)
Erase 数字
処理結果
このコードを実行すると、数字 配列内の全ての要素が「0」にリセットされます。
Erase は、配列を一度クリアして、再度データを設定し直したい場合などに有効です。
静的配列がよく使われる場面
静的配列は、次のような場面でよく使われます。
静的配列を使う際の注意ポイント
- 効率的なメモリ管理
- 静的配列は、サイズが固定されているため、効率的にメモリを使用できます。
しかし、事前に正確なサイズを決めておく必要があるため、データ量をしっかりと把握してから配列を設計することが重要です。
- 静的配列は、サイズが固定されているため、効率的にメモリを使用できます。
- データ量の予測
- 静的配列は、データ量が確定している場合に便利ですが、後からサイズを変更することができないため、追加のデータが発生する可能性がある場合には注意が必要です。
データの変動が予想される場合は、静的配列ではなく動的配列を検討しましょう。
- 静的配列は、データ量が確定している場合に便利ですが、後からサイズを変更することができないため、追加のデータが発生する可能性がある場合には注意が必要です。
- サイズ変更の制約
- 静的配列のサイズを変更する場合、ReDimステートメントを使用できますが、この操作を行うと既存のデータが失われます。
そのため、サイズを変更する必要がある場合には、別の配列にデータをコピーしてからReDimを行うなどの工夫が必要です。
この点を理解し、適切なサイズを予め見積もることが大切です。
- 静的配列のサイズを変更する場合、ReDimステートメントを使用できますが、この操作を行うと既存のデータが失われます。
- サイズを間違えて呼び出すとエラーが発生
- 静的配列のサイズを間違えて呼び出すと、エラーが発生します。
例えば、配列に存在しないインデックスを参照しようとすると、「インデックスが範囲外です」というエラーが発生します。
このため、コードを書く際には、配列のサイズを正確に把握し、誤って範囲外の要素にアクセスしないように注意が必要です。
- 静的配列のサイズを間違えて呼び出すと、エラーが発生します。
静的配列の使用例
ここからは、静的配列の使用例を紹介します。
使用例1: 固定データを入力する
静的配列を使用して、固定されたデータを効率的に管理する方法を紹介します。
この例では、曜日の名前を静的配列に格納し、各曜日を順番に表示します。
主な使用用途
曜日や月など、変更されない固定されたデータを管理する際に使用します。
データが決まっている場合、静的配列で効率よく管理でき、コードの可読性や保守性が向上します。
Sub ManageFixedData()
Dim 曜日(6) As String
Dim i As Long
曜日(0) = "日曜日"
曜日(1) = "月曜日"
曜日(2) = "火曜日"
曜日(3) = "水曜日"
曜日(4) = "木曜日"
曜日(5) = "金曜日"
曜日(6) = "土曜日"
'// 配列内のデータを出力
For i = 0 To 6
Debug.Print "曜日(" & i & ") = " & 曜日(i)
Next i
End Sub
- STEP1変数「曜日」の宣言と初期化
文字列型の静的配列「曜日」を宣言し、7つの要素(インデックスは0から6)を持つ配列として初期化します。各要素には、日曜日から土曜日までの曜日名を格納します。
- STEP2配列へのデータ格納
各曜日名を対応するインデックスに手動で格納します。曜日(0)には「日曜日」、曜日(1)には「月曜日」…と、全ての曜日が配列に保存されます。
- STEP3Forループの開始
Forループを使って、配列「曜日」の全ての要素を順に処理します。iはインデックスとして機能し、0から6までの値を取ります。
- STEP4デバッグウィンドウへの出力
ループ内で、配列「曜日」の各要素をDebug.Printを使ってデバッグウィンドウに出力します。これにより、各曜日の名前が順番に表示されます。
- STEP5ループの終了
インデックスiが6に達すると、ループが終了します。これで、全ての曜日がデバッグウィンドウに表示され、処理が完了します。
このコードで使用している機能
処理結果
1行ずつ解説
- Sub ManageFixedData()
- この行で、新しいサブルーチン「ManageFixedData」を定義します。
曜日を静的配列に格納し、その内容を表示する処理が行われます。
- この行で、新しいサブルーチン「ManageFixedData」を定義します。
- Dim 曜日(6) As String
- ここでは、文字列型の静的配列「曜日」を宣言しています。
この配列は「7」つの要素を持ち、それぞれに曜日の名前を格納します。
- ここでは、文字列型の静的配列「曜日」を宣言しています。
- 曜日(0) = “日曜日” ~ 曜日(6) = “土曜日”
- これらの行では、各曜日名を配列の対応する要素に格納しています。
これにより、配列「曜日」に全ての曜日が保存されます。
- これらの行では、各曜日名を配列の対応する要素に格納しています。
- For i = 0 To 6
- この行で、Forループが開始されます。
「i」が「0」から「6」まで変化し、その範囲内の全ての配列要素が順に処理されます。
- この行で、Forループが開始されます。
- Debug.Print “曜日(” & i & “) = ” & 曜日(i)
- この行で、配列「曜日」の現在の要素がデバッグウィンドウに表示されます。
これにより、「i」に対応する曜日名が順に表示されます。
- この行で、配列「曜日」の現在の要素がデバッグウィンドウに表示されます。
- Next i
- この行で、Forループが次のインデックスに進みます。
「i」が「6」になるまで、ループが繰り返されます。
- この行で、Forループが次のインデックスに進みます。
- End Sub
- この行で、サブルーチンが終了します。
全ての処理が完了し、プログラムの次のステップに進みます。
- この行で、サブルーチンが終了します。
静的配列は、固定されたデータを扱う際に非常に便利で、特にデータの数が変わらない場合に適しています。
配列を使用することで、複数のデータを一括で管理でき、コードの可読性や保守性が向上します。
また、配列の要素を順に処理するためにForループを使うことで、簡単に全ての要素にアクセスできることを確認しました。
これは、データが増えることのない固定されたリストを処理する際に非常に有効です。
使用例2: Array関数を使用してデータを格納
Array 関数を使用して、複数のデータを効率的に静的配列に格納する方法を紹介します。
この例では、数値をArray関数でまとめて配列に格納し、その内容を順番に表示します。
主な使用用途
複数のデータを一度にまとめて配列に格納したい場合に使用します。
特に、固定されたデータが既にある場合や、データの数が決まっている場合に便利です。
Array関数を使うことで、手動でデータを入力する手間を省き、コードを簡潔に保つことができます。
Sub StoreDataWithArray()
Dim データ As Variant
Dim i As Long
データ = Array(100, 200, 300, 400, 500)
'// 配列内のデータを出力
For i = LBound(データ) To UBound(データ)
Debug.Print "データ(" & i & ") = " & データ(i)
Next i
End Sub
- STEP1変数「データ」の宣言と初期化
Variant型 の配列「データ」を宣言し、Array 関数を使用して「5つ」の要素を持つ配列として初期化します。
各要素には、「100」から「500」までの数値が格納されます。 - STEP2Forループの開始
Forループ を使って、配列「データ」の全ての要素を順に処理します。
「i」 はインデックスとして機能し、配列の最初のインデックスから最後のインデックスまでの値を取ります。 - STEP3デバッグウィンドウへの出力
ループ内で、配列「データ」の各要素を Debug.Print を使ってデバッグウィンドウに出力します。
これにより、各数値が順番に表示されます。 - STEP4ループの終了
インデックス 「i」 が配列の最後の要素に達すると、ループが終了します。
これで、全てのデータがデバッグウィンドウに表示され、処理が完了します。
このコードで使用している機能
処理結果
1行ずつ解説
- Sub StoreDataWithArray()
- この行では、StoreDataWithArray という新しいサブルーチンを定義しています。
このサブルーチンを実行すると、Array 関数を使用してデータを配列に格納し、その内容を出力する処理が実行されます。
- この行では、StoreDataWithArray という新しいサブルーチンを定義しています。
- Dim データ As Variant
- こでは、「データ」という配列を Variant型 として宣言しています。
Variant型 は、様々なデータ型を格納できる柔軟な型であり、Array 関数を使用して複数のデータを格納する際に便利です。
- こでは、「データ」という配列を Variant型 として宣言しています。
- Dim i As Long
- この行では、インデックスを管理するための変数「i」を Long型 として宣言しています。
この変数は Forループ で使用され、配列の各要素を順に処理するために使います。
- この行では、インデックスを管理するための変数「i」を Long型 として宣言しています。
- データ = Array(100, 200, 300, 400, 500)
- Array 関数を使用して、数値「100」から「500」までの値を持つ配列を データ に格納しています。
このコードにより、5つの数値が配列にまとめられ、それぞれにインデックスが割り当てられます。
- Array 関数を使用して、数値「100」から「500」までの値を持つ配列を データ に格納しています。
- For i = LBound(データ) To UBound(データ)
- ここでは、Forループ を開始しています。
LBound(データ) は配列の最初のインデックスを、UBound(データ) は配列の最後のインデックスを取得します。
これにより、配列の全要素が順に処理されます。
- ここでは、Forループ を開始しています。
- Debug.Print “データ(” & i & “) = ” & データ(i)
- この行では、現在のインデックス i に対応する データ の値を Debug.Print で出力しています。
この結果、イミディエイトウィンドウに配列内の各要素が順番に表示されます。
例えば、「データ(0) = 100」のように出力されます。
- この行では、現在のインデックス i に対応する データ の値を Debug.Print で出力しています。
- Next i
- Forループ の次のサイクルに進みます。
インデックス i が次の値に増加し、配列の次の要素が処理されます。
この処理が配列の最後の要素まで繰り返されます。
- Forループ の次のサイクルに進みます。
- End Sub
- この行で、Sub StoreDataWithArray のサブルーチンが終了することを示しています。
すべての処理が完了し、この時点でプログラムは次のステップに進みます。
- この行で、Sub StoreDataWithArray のサブルーチンが終了することを示しています。
Array 関数を利用することで、複数のデータを一度に配列に格納でき、配列の初期化が簡単になります。
また、LBound と UBound を使用して配列の最初と最後のインデックスを自動的に取得し、For ループを使って全ての要素を効率的に処理することができます。
このように、Array 関数は柔軟で強力な機能を持ち、VBAで配列を操作する際に非常に便利です。
特に、データの数が固定されている場合や、手動での初期化が煩雑になる場合には、この方法が非常に有効です。
まとめ
静的配列は、データの数が予め決まっている場合に非常に有効なデータ管理手法です。
これにより、効率的にデータを格納・操作することができ、VBAプログラムのパフォーマンスを向上させることができます。
ポイントのおさらい
さらに学ぶために
静的配列の基本を理解したら、次は動的配列や他の配列操作方法に挑戦してみましょう。データの柔軟な管理が可能になり、より高度なVBAプログラミングを実現するためのステップアップになります。