6-4.配列

今回は、配列について説明します。

配列とは

配列は、複数の変数が1つにまとまったようなもので、配列変数と呼ぶこともあります。
データを入れる箱が規則的に並べられたような構造をしており、変数は格納できるデータが1つだけなのに対し、配列は複数のデータを格納することができます。

配列と変数

配列を使用するには、配列を宣言⇒配列にデータを格納⇒配列内のデータを使用、といった手順が必要です。

配列の構造

配列の構造は、要素次元で決定します。

要素とは、データを格納する箱のことを言います。
要素数が1つの場合は、データを格納する箱が1つ(変数と同じ)、要素数が2つの場合は、データを格納する箱が2つ、といったイメージです。

次元とは、要素が並ぶ方向のことを言います。
次元の数に応じて、1次元配列、2次元配列、3次元配列…となり、最大32次元配列まであります。

1次元配列は、要素が1列に並んだ構造の配列、2次元配列は、要素が縦横方向に並んだ構造の配列になります。1次元配列はx方向、2次元配列はxy方向、3次元配列はxyz方向に並んだ構造になります。

2次元配列は、エクセルの行列と同じ構造であり、2次元配列のデータとエクセルのデータは構造的に互換性があります。つまり、セル範囲のデータを2次元配列に格納する、反対に2次元配列のデータをセル範囲に反映するという形で、相互にデータをやり取りすることができます。

1次元配列は横方向、2次元配列は縦横方向、3次元配列は縦横奥方向に要素が並ぶ構造

配列の種類

配列には、動的配列静的配列の2種類あります。
動的配列と静的配列の違いは、次元数と要素数を定義するタイミングと、次元数と要素数を再定義できるかどうかです。

静的配列は、配列を宣言する際に、次元数と要素数を定義します。次元数と要素数を再定義(変更)することはできません。
動的配列は、配列を宣言する際に、次元数と要素数を定義しません。処理の途中で、必要に応じて次元数と要素数を定義します。一度定義した次元数と要素数を再定義(変更)することもできます。

配列の宣言

配列の宣言は、基本的に変数の宣言と同じDimステートメントを使用します。
静的配列と動的配列では、宣言の方法が異なります。というより、宣言方法によって、静的配列か動的配列か決まります。

静的配列の宣言

○構文
Dim 配列名(下限値 to 上限値 ,下限値 to 上限値 , …) as データ型

()内には、次元数に応じてカンマ区切り次元ごとの要素数を指定します。
1つ目の下限 to 上限は、1次元目の要素数を定義し、2つ目の下限 to 上限は、2次元目の要素数を定義しています。
要素数は、要素のインデックス番号の下限値と上限値を指定します。
下限値は0から始まり、省略すると0として定義されます。
下限値を0より大きい値で指定することもできます。
上限値のみ省略することはできません。(というより、上限値のみ省略した場合、下限値が上限値扱いになります。下限値も上限値も省略した場合は、動的配列となります。)

ややこしいので、以下のサンプルを見ながら理解してもらえればと思います。

<要素数3の1次元配列>
① Dim ary(0 to 2) as Variant :下限値0~上限値2
② Dim ary(2) as Variant :下限値0~上限値2
③ Dim ary(1 to 3) as Variant :下限値1~上限値3

①と②は、下限値を省略しているかしていないかの違いのみで、作成される配列は同じ構造になります。③は、①・②と構造は同じですが、要素のインデックスが変わります。

1次元配列構造の例

<要素数3×要素数5の2次元配列>
① Dim ary(0 to 2,0 to 4) as Variant :下限値0~上限値2 × 下限値0~上限値4
② Dim ary(2,4) as Variant :下限値0~上限値2 × 下限値0~上限値4
③ Dim ary(1 to 3,1 to 5) as Variant :下限値1~上限値3 × 下限値1~上限値5

1次元配列と同じく、①と②は作成される配列は同じ構造になります。
③は、①・②と構造は同じで、要素のインデックスが変わります。

2次元配列構造の例

動的配列の場合

○構文
Dim 配列名() as Variant

動的配列の場合、Dimステートメントでは、()内の次元数と要素数を空白のまま宣言します。
動的配列の次元数と要素数を定義する場合は、ReDimステートメントを使用します。

○構文
ReDim 配列名(下限値 to 上限値 ,下限値 to 上限値 , …) as データ型

構文としては、静的配列の宣言と同じ形で、DimがReDimになっただけの違いです。

ReDimステートメントを使用すると、動的配列の次元数と要素数を何度でも変更することができます。
ただし、既に配列にデータが格納されている場合、ReDimステートメントで変更すると、格納されているデータは削除されてしまいます。

配列内のデータをそのままにしたい場合は、ReDim Preserveステートメントを使用します。

○構文
ReDim Preserve 配列名(下限 to 上限 ,下限 to 上限 , …) as データ型

その他の配列

配列の種類は、前述の静的配列と動的配列の2種類ですが、通常の変数(配列変数として宣言していない変数)に対して、配列構造のデータを格納すると、その変数は配列として機能します。
※データの格納は、次項目を参照ください

配列構造のデータを格納した変数は、動的配列と同じ扱いをすることが可能です。
ReDimステートメントによる次元数と要素数の再定義もできます。

データの格納

ここでは、配列にデータを格納する方法と、格納したデータを初期化する方法を説明します。

配列にデータを格納

配列にデータを格納する方法は3種類あります。
いずれも代入(=)の形式で格納します。

1.インデックスで指定
○構文

1次元配列:ary(インデックス)= データ
2次元配列:ary(インデックス,インデックス)= データ

インデックスで指定した位置の要素にデータを代入します。
静的配列、動的配列どちらでも使用できます。
1次元配列の場合:ary(0) = 0 ary(1) = 1
2次元配列の場合:ary(0,0) = 0 ary(1,1) = 1

2.セル範囲
○構文
ary = Range().Value

セル範囲内のデータを配列に格納します。
配列全体にセル範囲内のデータを一括で格納する構造です。
動的配列または配列でない変数で使用できます。
セル範囲のデータを格納する場合、配列は必ず2次元配列となります。
行方向が1次元目、列方向が2次元目となります。
要素の下限は0ではなく、必ず1になります。
(宣言時に下限を0にしても、データを格納後、自動で1になります)

3.Array関数
○構文
ary = Array(データ,データ,…)

Array関数を使用して、配列にデータを格納します。
配列全体にArray関数内のデータを一括で格納する構造です。
動的配列または配列でない変数で使用できます。
主に1次元配列にデータを格納する際に使用します。
要素の下限は必ず0になります。

<データの変更>
上記の方法でデータを格納する際、既に配列内にデータが格納されている場合、データは変更(上書き)されます。

<格納方法の違い>
インデックスで指定する方法は、インデックスで指定した要素内にデータを格納する方法になります。
一方、セル範囲とArray関数は、インデックスで指定せず、配列構造のデータを配列全体に一括で格納する方法になります。

静的配列は、インデックスで指定した要素にデータを格納する構文になります。
そのため、配列全体に一括でデータを格納するセル範囲とArray関数の方法を適用することができません。

ただし、配列内の1つの要素に配列構造のデータを格納する場合は、静的配列でも動的配列でも、インデックスで要素を指定し、そこにセル範囲やArray関数でデータを格納することができます。

なお、配列を宣言した際のデータ型と、格納するデータ型が異なる場合もエラーとなります。
文字列や数値が混在したデータを格納する際は、配列をVariant型で宣言する必要があります。

配列の初期化

配列内のデータを初期化する場合は、Eraseステートメントを使用します。

○構文
Erase 配列名

配列のデータを取得

取得したい要素のインデックスを指定することで、配列内のデータを取得することができます。
インデックスを省略すると、配列全体のデータを取得することができます。セル範囲に2次元配列のデータを反映させる場合などに使用します。

配列でよく使用する関数等

  • LBound関数
    配列の下限値を取得します。
    配列が2次元以上の場合は、第2引数に次元数を指定します。
    ○構文LBound(配列名,次元数)
  • UBound関数
    配列の上限値を取得します。
    配列が2次元以上の場合は、第2引数に次元数を指定します。
    ○構文UBound(配列名,次元数)
  • Option Baseステートメント
    配列の下限値を指定します。
    ○構文Option Base 下限値
    宣言セクションに記述する必要があります。
    下限値には、0または1を指定できます。
    これを指定した場合、宣言する配列の下限値はすべて、この値になります。
    ※Array関数やセル範囲でデータを格納した場合は除く

コメント