配列の先頭に要素を追加するには、どうすればよいのでしょうか?
じつはExcel VBAには、配列の先頭に追加するステートメントなどは実装されていません。
ですが、安心してください。
この記事では、配列の先頭に要素を追加する方法の説明と、実際のVBAサンプルコードを紹介していきます。
参考:Excel VBA入門 その30:「動的配列のエラー」原因・対処方法
配列の先頭に要素を追加するには
VBA配列の先頭に要素を追加するには、
- Redimステートメント及びPreserveキーワードを使って配列の要素の上限値を増やす。
- 配列に格納されているデータを増やした要素数分インデックス番号にコピーする。
- すべてのデータをコピーし終えたら、配列の先頭の要素に追加したいデータを格納する。
という流れになります。
配列の先頭に要素を追加するVBAサンプルコード(その1)
それでは、実際のVBAサンプルコードを紹介します。
【プログラムの動作概要】
要素数が3の配列に対し、「みかん、ぶどう、スイカ」が格納されています。
その後、配列の先頭に要素を3つ追加し、先頭(インデックス番号0)に「バナナ」を格納し、配列の中身を表示させるプログラムです。
Sub 配列の先頭に追加()
Dim hairetu() As Variant
ReDim hairetu(2) '要素の上限を2に設定
hairetu = Array("みかん", "ぶどう", "スイカ") '配列にデータを格納する
ReDim Preserve hairetu(5) '要素の上限を5に変更
hairetu(3) = hairetu(0) 'インデックス番号0~2のデータを、番号3~5に移動させる(コピーする)
hairetu(4) = hairetu(1)
hairetu(5) = hairetu(2)
hairetu(0) = "" 'データを移動させたので、要素を空にする
hairetu(1) = ""
hairetu(2) = ""
hairetu(0) = "バナナ" 'インデックス番号0にデータを格納する
Debug.Print hairetu(0) & "," & hairetu(1) & "," & hairetu(2) & "," & hairetu(3) & "," & hairetu(4) & "," & hairetu(5)
End Sub
実行結果は以下のように表示されます。
まず、Redim(2)で、要素数を3に設定し、それぞれの要素に「みかん、ぶどう、スイカ」を格納します。
その後、先頭に要素を3つ追加する必要ができたと仮定し、ReDim Preserve hairetu(5)で要素数を6に変更します。
hairetu(3) = hairetu(0) で先頭を3つ空けるために、インデックス番号0の要素を番号3にコピーします。
hairetu(4) = hairetu(1) 、 hairetu(5) = hairetu(2) も同様に、
インデックス番号1⇒番号4、インデックス番号2⇒番号5
としています。
hairetu(0) = “” で、移動元の要素を空にします。hairetu(1) = “”、hairetu(2) = “” も同様に要素を空にしています。
hairetu(0) = “バナナ” で、先頭要素(インデックス番号0)にデータ「バナナ」を格納し、イミディエイトウインドウに配列内容を表示させています。
この方法で、配列の先頭に要素を追加することができました。
ですが、各インデックス番号の要素のデータを移動させることをひとつひとつ記述するのは、とても大変です。データが増えれば増えるほど、膨大な時間がかかってしまいます。
次に紹介するサンプルコードは、Forステートメントを使用して、簡潔に記述したものです。
配列の先頭に要素を追加するVBAサンプルコード(その2)
データの移動をFor文で完結に記述したものになります。
なお、実行結果は先ほどのプログラムと同様になります。
Sub 自動的に配列の先頭に追加()
Dim hairetu() As Variant
Dim before_jougen As Long
Dim after_jougen As Long
Dim i As Long
before_jougen = 2
ReDim hairetu(before_jougen)
hairetu = Array("みかん", "ぶどう", "スイカ")
after_jougen = 5
ReDim Preserve hairetu(after_jougen)
For i = 0 To before_jougen
hairetu(i + after_jougen - before_jougen) = hairetu(i)
hairetu(i) = ""
Next i
hairetu(0) = "バナナ"
Debug.Print hairetu(0) & "," & hairetu(1) & "," & hairetu(2) & "," & hairetu(3) & "," & hairetu(4) & "," & hairetu(5)
End Sub
コメント