Excel VBA入門 その33:配列の先頭に要素を追加する方法

エクセルVBA VBA



配列の先頭に要素を追加するには、どうすればよいのでしょうか?

じつはExcel VBAには、配列の先頭に追加するステートメントなどは実装されていません。

ですが、安心してください。

この記事では、配列の先頭に要素を追加する方法の説明と、実際のVBAサンプルコードを紹介していきます。

参考:Excel VBA入門 その30:「動的配列のエラー」原因・対処方法



配列の先頭に要素を追加するには

VBA配列の先頭に要素を追加するには、

  1. Redimステートメント及びPreserveキーワードを使って配列の要素の上限値を増やす。
  2. 配列に格納されているデータを増やした要素数分インデックス番号にコピーする。
  3. すべてのデータをコピーし終えたら、配列の先頭の要素に追加したいデータを格納する。

という流れになります。

配列の先頭に要素を追加する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

コメント

タイトルとURLをコピーしました