配列の任意の位置へのデータの追加や削除を行うには

VBAの配列はRedim Preserve構文で終端より先の領域を拡張することはできますが、配列の途中の部分にデータを挿入したり削除したりする仕組みはありません

一般的に一連のデータの途中にデータの追加や削除を行いたい場合は連結リストという仕組みを利用しますが、VBAには連結リストが実装されていません。

連結リストがどうしても必要であればクラスを自作するとかの話になります。ただ、そこまではちょっと面倒です。

ここでは、連結リストクラスを自作するのが面倒なので、配列を使って任意の位置にデータを追加したり、任意の位置を削除したりする方法を紹介します。

紹介しているデータ追加関数とデータ削除関数はどちらも処理速度は最小O(1)から最大O(n)(n=配列要素数+1)の範囲になります。


配列の任意の位置にデータを追加する関数

以下の関数は配列の任意の位置にデータを追加します。追加された箇所以降は1つ後ろのインデックスにシフト(移動)します。

引数が3つあり、「配列」「追加データ」「追加する位置(配列のインデックス値)」を指定します。追加データのデータ型はなんでもOKです。



配列の任意の位置にデータを削除する関数

以下の関数は配列の任意の位置のデータを削除します。削除された箇所以降は1つ前のインデックスにシフト(移動)します。

引数が2つあり、「配列」「削除する位置(配列のインデックス値)」を指定します。



データコピー関数

上記の2つ関数はどちらも配列のデータ型はなんでもOKにしています。

そのため、Integer型やString型などのプリミティブ型でも、Range型やDictionary型などの各種オブジェクト型でも動作します。

ただ、オブジェクト型と非オブジェクト型ではデータの代入にSetステートメントを使うかどうかというコーディングの仕方が異なるため、この関数でデータ型を判定した上でそれに応じた代入を行うようにしています。



使い方

String型の配列とRange型の配列を用意して、配列の任意の要素位置にデータの追加を行い、その後任意の要素位置のデータを削除するテストコードです。

実行結果
0 – a
1 – abc(ここが追加部分)
2 – b
3 – c
4 – d
5 – e
6 – f
7 – g
8 – h
0 – G100(ここが追加部分)
1 – A1
2 – A2
3 – A3
4 – A4
5 – A5
6 – A6
7 – A7
8 – A8

0 – a
1 – b(ここが削除部分。2のbがこっちにシフトした。)
2 – c
3 – d
4 – e
5 – f
6 – g
7 – h
0 – A1(ここが削除部分。1のA1がこっちにシフトした。)
1 – A2
2 – A3
3 – A4
4 – A5
5 – A6
6 – A7
7 – A8