1つ前の記事で説明した配列は正確には1次元配列です。

ここでは、2次元以上の配列について説明します。



配列サイズの変更

配列は、宣言時に要素数を指定しないで宣言をすることができます。

要素数を指定しないで宣言をした配列は、値を入れる場所を持っていませんので、リサイズして要素数を指定します。

このような配列を動的配列と呼びます。

配列をリサイズする場合は以下の書式を使用します。

ReDim 配列変数名(段の数 - 1, 要素数 - 1) As データ型

以下は、Integer型の配列dataを要素数3個でリサイズする例です。

    Option Explicit

Sub 配列のリサイズ1()
  Dim data() As Integer
  
  ReDim data(2)
  
  data(0) = 1
  data(1) = 2
  data(2) = 3
End Sub


すでに要素数が決まっている配列のリサイズ

すでに要素が入っている配列のリサイズも ReDim を使用します。

単純に ReDim を使用して配列をリサイズすると、もともと入っていたデータは消えてしまいますので注意してください。

Dim 配列変数名(要素数)

以下は、Integer型の配列dataを要素数3個でリサイズする例です。

    Option Explicit

Sub 配列のリサイズ例2()
  Dim data() As Integer
  Dim i As Integer
  
  '要素数が3個の配列にリサイズ
  ReDim data(2)
  
  data(0) = 1
  data(1) = 2
  data(2) = 3
  
  '要素数が5個の配列にリサイズ
  '配列に入れていた1,2,3のデータは消えてしまう
  ReDim data(4)
  
  For i = LBound(data) To UBound(data)
      Debug.Print data(i)
  Next
End Sub


元のデータを残してリサイズする

ReDim でリサイズすると元のデータが消えてしまうことがわかりました。

「ReDim Preserve」を使用すると、もとのデータを残してリサイズすることができます。

もとのサイズよりも大きくした場合は、後ろの要素には初期値が入ります。Integer型であれば0が入ります。

もとのサイズよりも小さくした場合は、後ろの方から要素が切り捨てられます。

以下に、「ReDim Preserve」を使用した例を示します。

Option Explicit

Sub 配列のリサイズ例3()
  Dim data() As Integer
  Dim i As Integer
  
  '要素数が3個の配列にリサイズ
  ReDim data(2)
  
  data(0) = 1
  data(1) = 2
  data(2) = 3
  
  '要素数が5個の配列にリサイズ
  '配列の要素は 1, 2, 3, 0, 0 となる
  ReDim Preserve data(4)
  
  For i = LBound(data) To UBound(data)
      Debug.Print data(i)
  Next
  
  '要素数が2個の配列にリサイズ
  '配列の要素は 1, 2 となる
  ReDim Preserve data(1)
  
  For i = LBound(data) To UBound(data)
      Debug.Print data(i)
  Next
End Sub