【VBA】VBAでのデータ管理: 配列の力を理解する


今回は配列について見ていきます。配列は複数のデータを扱う上で必要になる概念です。しっかりと覚えておきましょう。
配列は、同じタイプのデータを効率的に管理するための強力なツールです。一見複雑に見えるかもしれませんが、基本を理解すれば大変便利なものです。
それでは一緒に見ていきましょう。
配列とは?
配列とは、同じデータ型(数値、文字列など)の値の集合を言います。
配列とは、プログラミング言語における基本的なデータ構造の一つで、同じ種類の複数のデータを一つの変数名で扱うことができます。
これにより、データの管理が容易になり、コードの可読性と効率性が向上します。
具体的には、配列の各値は配列内の特定の位置(インデックスと呼ぶ)に格納されます。
例えば、10人の学生の試験のスコアを保持したい場合、個々のスコアを個別の変数に保存するのではなく、1つの配列を使用することで、これらすべてのスコアを保存できます。
配列は、「箱」のようなものと考えることができます。
各「箱」には、インデックスと呼ばれる番号が付けられており、この番号を使用して、特定の「箱」にアクセスし、その「箱」に何かを保存したり、その「箱」から何かを取り出したりできます。
また、配列は一次元(線形)であることもあれば、二次元(表形式)、三次元以上(立方体やそれ以上の形)であることもあります。これにより、より複雑なデータ構造を作成して扱うことができます。
配列はプログラミングにおける非常に重要な概念であり、それを理解し、適切に使用することで、より高度で効率的なコードを書くことができます。
基本的な使い方
配列の宣言
VBAで配列を宣言するには、以下のようにDim
ステートメントを使用します。
Dim MyArray(5) As Integer
上記のコードは、6つの整数を格納できる配列を作成します。
VBAの配列は0から始まるため、5という数は0から5までの6つの場所を意味します。(インデックスは0、1、2、3、4、5の6つ)
配列への値の格納
配列に値を格納するには、特定のインデックスを指定します。
MyArray(0) = 10
MyArray(1) = 20
MyArray(2) = 30
上記の例で0から2のインデックスにそれぞれ数値が入ったことになります。
配列から値の取得
値を取得するには、格納した位置のインデックスを指定します。
Debug.Print MyArray(0) ' 10が出力されます。

ここまでが基本的な使い方だにゃ。でも、毎回箱を作って別々に代入するのは大変だにゃ。そこで一気に数値を入れる方法が「初期化」だにゃ。
配列の初期化
配列を宣言する際、その値を初期化(デフォルトの値に設定)することがあります。
初期化は特に、配列が使用される前に値をリセットしたい場合や、確実に特定の状態から開始したい場合に重要です。
VBAでは、配列の宣言と同時に初期化を行うことができます。
例えば以下のように、配列を宣言し、その要素すべてを特定の値で初期化することができます。
Dim MyArray(5) As Integer
上記のコードは、6つの要素を持つ配列を宣言し、すべての要素を初期化(0に設定)します。これは、VBAが数値型の変数をデフォルトで0に初期化するためです。
一方、初期化の値を自分で定めたい場合は、Array
関数を使用すると便利です。以下は、Array
関数を使用して配列を初期化する例です。
Dim MyArray() As Variant
MyArray = Array(1, 2, 3, 4, 5, 6)
このコードは、要素が6つの配列を宣言し、各要素を1から6の値で初期化します。この場合、配列はVariant
型として宣言され、その後Array
関数で初期化されます。
配列の初期化は、配列を使う際の基本的なステップであり、データの管理を一貫性のあるものに保つために重要な役割を果たします。初期化を忘れると予期しない結果やバグを生む可能性があるため、配列の使用時には初期化に注意しましょう。
配列のループ処理
配列は複数のデータをまとめて管理するツールであることはここまでの説明で理解できたかと思います。
そして、その真価が発揮されるのは、配列内の各要素に対する一括の操作が必要な場合です。
VBAではFor
ループを使って、配列のすべての要素に対して操作を行うことができます。
Dim i As Integer
For i = 0 To 5
Debug.Print MyArray(i)
Next i
上記のコードは、先ほど作った配列MyArray
のすべての要素(0から5のインデックス)を出力します。
しかし、配列の要素数が動的に変わる場合や、プログラムの可読性を高めたい場合は、For Each
ループを使用するとより便利です。
For Each
ループでは、配列の要素数を事前に知る必要がなく、自動的に配列のすべての要素をループします。
Dim element As Variant
For Each element In MyArray
Debug.Print element
Next element
このコードは、配列MyArray
のすべての要素を順にelement
に代入し、その値を出力します。
このように、ループ処理を使用すると、配列内の複数の要素に対して一括して操作を行うことができ、効率的かつ読みやすいコードを書くことが可能になります。
配列のサイズ変更
プログラムを作成する際、配列のサイズが事前にわからない場合や、途中でサイズを変更する必要が出てくることがあります。このような時に役立つのが、VBAのReDim
ステートメントです。
配列のサイズを変更するには、ReDim
ステートメントを使用します。これにより、配列のサイズを変更し、新たにメモリを確保することができます。
ReDim MyArray(10)
上記のコードは、配列MyArray
のサイズを11(0から10までのインデックス)に変更します。
ただし注意すべき重要な点があります。ReDim
ステートメントを使用すると、既に配列に格納されていたデータはすべて消去されます。すなわち、新たなサイズにリサイズされた配列は、値がすべて初期化された状態となります。
既存のデータを保持したまま配列のサイズを変更したい場合は、Preserve
キーワードを使用します。
ReDim Preserve MyArray(10)
このコードは、配列MyArray
のサイズを11(0から10の11の値)に変更しますが、Preserve
キーワードがあるため、既存のデータは保持されます。
新たに追加されたインデックス(この場合は6から10まで)は初期化され、既存の値(この場合は0から5までのインデックス)はそのまま保持されます。
ReDim
とPreserve
は、プログラムの柔軟性と動的性を向上させる重要な機能です。
ただし、使用には注意が必要であり、必要な時だけ使用するようにしましょう。
なぜなら、頻繁に配列のサイズを変更すると、パフォーマンスに影響を及ぼす可能性があるからです。
まとめ
今回の記事では、Excel VBAにおける配列の基本的な概念と使用方法について深く掘り下げてきました。
配列は、複数の値を一括して管理し操作するための強力なツールであり、プログラムの効率性と可読性を大幅に向上させることができます。
まず、配列とは何か、その仕組みと用途など基本的な事項から、配列の宣言と初期化、サイズの変更、そして各要素の操作について見てきました。
特に、ReDim
とPreserve
キーワードを使った配列のサイズ変更は、プログラムの動的な性質を利用する際に非常に役立ちます。
また、For
ループとFor Each
ループを使用した配列のループ処理は、配列内の全ての要素に対して一括の操作を行う際に重要です。
プログラミングの学習は、知識を理解するだけでは十分ではありません。実際にコードを書き、様々なシナリオで配列を使用することで、理解が深まりスキルが向上します。今回学んだVBAでの配列の知識も活用をぜひ試してみてください。

VBAを体系的に学びたい場合、本で学ぶことをお勧めしています。
kindle unlimited(キンドルアンリミテッド)であれば、いくつかのVBA関係の本を無料で読むこともできますよ。