【ExcelVBA】配列の要素数を拡張させながらその配列に値を1つずつ格納するには

この記事では、配列の要素数を拡張させながらその配列に値を1つずつ格納する方法についてご説明します。

【動画】配列の要素数を拡張させながらその配列に値を1つずつ格納する実際の動き

本題に入る前に、まずは次の動画をご覧ください。


セルの値を1つずつ格納させるため、配列に値を1つ格納させたら1つ要素数を拡張する処理を繰り返し行っています。

マクロ作成の流れ

STEP.1
配列を宣言する
配列を宣言します。
ここでは要素数は入れません。
STEP.2
「ReDim Preserve」を使って配列の再宣言を行う
「ReDim Preserve」を使って配列の再宣言を行います。
今回は配列の要素数を1つ拡張させて値を1つ格納していくので、まずは配列の再宣言するのに要素数を0で指定して配列の再宣言を行います。
STEP.3
配列に値を格納する
配列に値を格納します。
STEP.2で、要素数を0で指定して配列の再宣言を行いましたが、その0番目の位置(インデックス)に値を格納します。
STEP.4
STEP.2で行った配列の再宣言を再度行う
STEP.2で行った配列の再宣言を再度行います。
なお、STEP.2では要素数を0で指定し配列の再宣言を行いましたが、ここでは要素数を1つ増やすため1を指定します。
STEP.5
STEP.4で拡張された位置に次の値を格納する
STEP.4で拡張された位置に次の値を格納します。
「ReDim Preserve」で配列の要素数を1つ拡張すると、0番目の位置(インデックス)に値が格納された値は消えたり上書きされることなくそのまま残り、1番目の位置に格納したい値を配列に格納することができます。
STEP.6
配列に拡張したい値の個数分、「ReDim Preserve」で配列の要素数を拡張と、その拡張した要素の位置に値を格納していく
配列に拡張したい値の個数分、「ReDim Preserve」で配列の要素数を拡張と、その拡張した要素の位置に値を格納していきます。

Excelファイルの例

今回は次のExcelファイルを用意しました。

今回のサンプルでは以上の表の名前を、配列に値を1つ格納→配列の要素数を1つ拡張→格納した値はそののままに拡張した要素の位置に次の値を配列に格納→・・・という流れを行います。

コードの例

Excelのマクロのコード(例)

Option Explicit

sub test()

    Dim cnt         As Long             'カウンタ用変数
    Dim rowPos      As Long             '表のデータの行位置
    Dim valAry()    As String           'シート名用配列
    
    '表のデータの1つ目の行位置を取得する
    rowPos = 2
    
    'カウンタを初期化する
    cnt = 0
    
    'セルの値が空白セルまで処理を繰り返すFor文
    Do While (Worksheets("top").Range("B" & rowPos).Value <> "")
        
        '動的配列の再宣言を行う(配列に格納されている値を残したまま)
        ReDim Preserve valAry(cnt)
        
        '配列にセルの値を格納する
        valAry(cnt) = Worksheets("top").Range("B" & rowPos).Value
        
        'カウンタの値を1つ増やす
        cnt = cnt + 1
        rowPos = rowPos + 1
        
        DoEvents
    
    Loop

End Sub

注目すべきコード①

最初に見て頂きたいのは7行目です。

    Dim valAry()    As String           'シート名用配列

今回使う配列を宣言しています。

なお、ここでは配列の要素数は指定しないでおきます。

なぜなら、配列の要素数を拡張する際に要素数を指定するからです。

        '動的配列の再宣言を行う(配列に格納されている値を残したまま)
        ReDim Preserve valAry(cnt)

注目すべきコード②

次に見て頂きたいのは16行目です。

    'セルの値が空白セルまで処理を繰り返すFor文
    Do While (Worksheets("top").Range("B" & rowPos).Value <> "")

以上のコードは、B列のセルに値が入っている場合は処理を繰り返すループ処理です。

注目すべきコード③

次に見て頂きたいのは19行目です。

        '動的配列の再宣言を行う(配列に格納されている値を残したまま)
        ReDim Preserve valAry(cnt)
        
        '配列にセルの値を格納する
        valAry(cnt) = Worksheets("top").Range("B" & rowPos).Value
        
        'カウンタの値を1つ増やす
        cnt = cnt + 1

以上のコードは、配列valAryの配列の再宣言し、セルの値をその配列に格納後にカウンタの値も1つ増やす処理のコードです。

配列の要素数にカウンタ変数cntを指定しており、このカウンタはループ処理内で1つずつ値が増えていきます。

配列の要素数を1つ拡張(19行目)→拡張した要素のインデックスにセルの値を格納(22行目)→カウンタを1つ増やす(25行目)、という流れで配列に1つずつ値を格納していきます。

ReDim Preserveは、配列の要素をどんどん拡張させて値を格納しても、すでに格納された値はそのまま何もしません。

配列に格納した値をあとでどこかで使いたい場合に便利です。

動作確認

配列の要素数を拡張させながらその配列に値を1つずつ格納する流れを確認してみます。

なお、配列には下の表のB列にある名前を格納していきます。

①1回目のループに入った直後に配列の再宣言を行う前

配列valAryには何もない状態です。

②1回目のループに入った直後に配列の再宣言を行った後

1回目の配列の再宣言を行った後は、配列valAryの0番目の要素が割り振られました。

配列valAryにはカウンタ変数cntを指定していますが、この変数cntの値は0です。

なので、要素数は0番目だけが割り振られています。

③1回目の配列の再宣言を行った後に配列に名前を格納する

1回目の配列の再宣言を行った後に、その0番目の要素に1つ目の名前を格納しています。

④カウンタを1つ増やす

次の名前を配列に格納するために、カウンタの値を1つ増やしたので変数cntの値は1です。

⑤1つ値が増えたカウンタの値で再度配列を拡張した直後

カウンタの変数cntは1で、このcntの値(1)で拡張されたので配列の要素数が1つ拡張されています。

⑥再度要素が拡張された配列に値を格納した直後

再度拡張された要素の位置に名前が格納されています。

ちなみに、最初に格納した名前はそのままの状態で格納されています。

⑦最後まで処理を実行した後の配列の状態

最後まで処理を実行した後の配列の状態は下の通りです。

配列に名前がすべて格納されたことが確認できました。

最後に

本記事では、配列の要素数を拡張させながらその配列に値を1つずつ格納する方法についてご説明しました。

値をどんどん配列に追加したい時に便利なので、同じことをやりたい場合は本記事を参考にしてみてくださいね。

Excelのスキル向上やExcelの基礎知識をしっかりと学びたいなら

Excelのスキルを習得したい、Excelの基礎知識をもっと理解したい、そう考えているなら「無期限サポート付きExcel講座【すごい改善】」がおすすめです。

Excelのスキルの基礎を身につけるなら【すごい改善】で無期限サポート付きがあるので、これで「Excelのスキルや基礎」を学ぶのにおすすめですよ。

→ 受講後、何度でも無期限でメールで質問できるアフターサポートがついているExcelマスター講座はこちら