zukucode
主にWEB関連の情報を技術メモとして発信しています。

VBA ループ処理で配列に要素を追加していく

VBAでループ処理で配列に要素を追加していく方法を紹介します。

配列が初期化されているかどうか判定するisArrayExファンクションについては後述します。

詳しくはVBA 配列が初期化されているかどうかを判定するで紹介しています。

Dim arr() As String
For i = 0 To 4
    If isArrayEx(arrPkey) = -1 Then
        '初期化されていないので初期化
        ReDim Preserve arrPkey(0)
    Else
        '初期化されているので要素を追加
        ReDim Preserve arr(UBound(arr) + 1)
    End If
    arr(UBound(arr)) = i * 2
Next

'結果
'arr(0) 0
'arr(1) 2
'arr(2) 4
'arr(3) 6
'arr(4) 8

For文のループ処理で配列の要素を1つづつ追加しながら、値を設定しています。

Ubound関数は、指定した配列の最大のインデックスを返します。

Ubound関数で取得した結果 + 1を配列の要素数として再定義していくことによって、配列の要素を増やしていきます。

配列が初期化されていない場合はUBound関数が使えないため、VBA 配列が初期化されているかどうかを判定するで紹介した方法で、場合分けをしています。

また、配列を再定義するコマンドReDim 配列ですが、これだと配列の各要素の値が全てクリアされてしまいます。

配列の各要素を保持したまま配列を再定義するにはReDim Preserve 配列のように、Preserveを追加します。

以下のようにループ処理で実装する前に、1ステップづつ実装していくとイメージがつかめるかと思います。

Dim arr() As String

ReDim Preserve arrPkey(0) '初期化

'Ubound(arr)の結果は0(0が最大のインデックス)
arr(UBound(arr)) = "a"


ReDim Preserve arr(UBound(arr) + 1) '値を保持したまま配列を最大のインデックス+1で再定義

'Ubound(arr)の結果は1(1が最大のインデックス)
arr(UBound(arr)) = "b"


ReDim Preserve arr(UBound(arr) + 1) '値を保持したまま配列を最大のインデックス+1で再定義

'Ubound(arr)の結果は2(2が最大のインデックス)
arr(UBound(arr)) = "c"

配列の初期化判定

配列の初期化判定にはsgn関数を使用する方法がよく紹介されていますが、この方法だと環境によってエラーになることがあります。(詳しくはVBA 配列が初期化されているかどうかを判定するで紹介しています)

そのため、以下のURLで紹介しているファンクションを使用します。

参考URL: https://qiita.com/satoko138/items/7e06dda56683065968f7

参考ページより抜粋
'--------------------------------------------------------------
'機能:引数が配列か判定し、配列の場合は空かどうかも判定する
'戻り値:判定結果(1:配列 / 0:空の配列 / -1:配列ではない
'--------------------------------------------------------------
Public Function isArrayEx(varArray As Variant) As Long
On Error GoTo ERROR_
    If IsArray(varArray) Then
        isArrayEx = IIf(UBound(varArray) >= 0, 1, 0)
    Else
        isArrayEx = -1
    End If

    Exit Function

ERROR_:
    If Err.Number = 9 Then
        isArrayEx = 0
    Else
        '想定外エラー
    End If
End Function

関連記事

  • VBA システム日付と時刻をフォーマットして表示する

    VBAでシステム日付と時刻をフォーマットして表示する方法を紹介します。以下の例では、例えばシステム日付が2019年01月23日4時56分01秒の場合は2019/01/23 04:56:01が設定されま...


  • VBA シート名でシートオブジェクトを取得する方法

    VBAでシート名でシートオブジェクトを取得する方法を紹介します。以下の例ではsheet1という名称のシートをwsという変数に設定しています。取得したシートをアクティブシートに設定するには、取得したシー...


  • VBA シートをコピーして複製する方法

    VBAでシートをコピーして複製する方法を紹介します。まずはコピーしたいシートを取得します。(シートの取得方法はVBA シート名でシートオブジェクトを取得する方法で紹介しています。)以下のコマンドで、シ...


  • VBA 指定した範囲のセルを結合・結合解除する方法

    VBAで指定した範囲のセルを結合または結合解除する方法を紹介します。VBA 指定した範囲に配列の値をセットする方法で紹介した方法と同じように、Range(始点のセル, 終点のセル)の形式で範囲を指定し...


  • VBA 指定した範囲に配列の値をセットする方法

    VBAで指定した範囲に配列の値をセットする方法を紹介します。Range(始点のセル, 終点のセル)の形式で範囲を指定します。範囲内のセルの数を配列の要素数と合わせています。また、配列は1次配列のため、...


  • VBA 書式のみをコピーして貼り付ける方法

    VBAで書式のみをコピーして貼り付ける方法を紹介します。まずは指定した範囲に対してCopyを実行します。コピーの手順はVBA 指定した範囲をコピーして別の場所に貼り付ける方法で紹介した方法と同じです。...


  • VBA 複数の行を選択して操作を行う方法

    VBAで複数の行を選択して、コピーや削除などの操作を行う方法を紹介します。わかりやすくするために、まずは1行のみ選択する方法を確認します。以下の例では1行目を選択しています。複数行の場合は「範囲指定」...


  • VBA 指定した範囲をコピーして別の場所に貼り付ける方法

    VBAで指定した範囲をコピーして別の場所に貼り付ける方法を紹介します。まずは指定した範囲に対してCopyを実行します。VBA 指定した範囲のセルを結合・結合解除する方法で紹介した方法と同じように、Ra...


  • VBA セルの内容に合わせて列幅を設定する方法

    VBAでセルの内容に合わせて列幅を自動で設定する方法を紹介します。以下のように、自動調整したい列に対してAutoFitを実行します。自動で列幅を設定すれば、セルの内容が途中で折り返されたり切れたりとい...


  • VBA セルに値を設定する方法

    VBAでセルに値を設定する方法を紹介します。(値ではなく数式を設定する方法VBA セルに数式を設定する方法で紹介しています)以下の例では、アクティブシートのセルC1(1行目のC列目(3列目))にsam...