VBA

【VBA】配列に要素を追加する関数(末尾と任意の場所)

記事内に商品プロモーションを含む場合があります
わかること
  • 要素数を任意の位置に追加する関数
    1. 位置を指定しなければ末尾に追加
    2. 位置を指定すればその位置に追加

こんにちはhokkyokunです。

配列の関数をいくつか作っていますが、最重要かつ最頻出の関数を紹介します。

配列の要素を追加する関数です。
デフォルトでは末尾に追加する関数で(普段はこれで十分)、必要に応じて、位置を指定するとその位置に要素を追加できるようにしました。

なぜ要素を追加する関数が必要なのか

そもそもなんで要素を追加するだけの関数を作る必要があるのでしょうか。

関数を使わずに配列を追加しようと思うと以下のような処理が必要になります。

Sub testArray1()
    Dim arrs As Variant
    Dim num As Long
    arrs = Array("リンゴ", "バナナ")
    
    On Error GoTo err
    num = UBound(arrs)
    
err:
    If err.Number = 9 Or err.Number = 13 Then
        ReDim arrs(0)
        num = -1
    End If
    
    ReDim Preserve arrs(num + 1)
    arrs(num + 1) = "パイナップル"
    

    Debug.Print "============================"
    Dim arr As Variant
    For Each arr In arrs
        Debug.Print arr
    Next
    Debug.Print "============================" & vbCrLf
    
    '以下のように出力されます。
    '============================
    'リンゴ
    'バナナ
    'パイナップル
    '============================

End Sub

プログラミングにおいて、配列は超基本の要素です。

これを手軽にかつ、無駄に思考をせずに使いこなすことが、複雑なプログラムを効率的かつ、可読性の高いコードで書くコツです。

一方で、上記のプログラムを見るとかなり冗長に見えます
この冗長になる理由を言語化すると以下の3点です。

  1. エラーキャッチが組み込まれるため(プログラムを安全に走らせるには必須!)
  2. 要素数の管理(常に最大要素数を把握する必要がある)
  3. 再宣言の手間

※特にエラーキャッチが重要で、配列は取り扱いをミスるとすぐエラーを出して止まるので、エラーキャッチは必ず入れることをお勧めします。

一方で今回作成した関数を使うと以下のようになります。

Sub testArray2()
    
    Dim arrs As Variant
    arrs = Array("リンゴ", "バナナ")

    '追加
    Call addElm(arrs, "メロン")
    
    Debug.Print "============================="
    Dim arr As Variant
    For Each arr In arrs
        Debug.Print arr
    Next
    Debug.Print "============================" & vbCrLf
    
    '以下のように出力されます。
    '=============================
    'リンゴ
    'バナナ
    'メロン
    '============================
    
End Sub

このようにコードがすっきりし、可読性もあがります。
また、要素を追加するのも基本的に一行でできるようになり、かつエラーの配慮も必要ないので、手軽にガンガン使用することができます。

繰り返しになりますが、配列はプログラミングの基本で手軽にたくさん使用することが良いコードを書く基本となります。

よって、簡単に手軽に使えるようにする関数を作ることはとてもとても重要となります。

注意点

配列の変数を宣言するときは以下の書き方でやることを守ってください。

Dim 配列名 as Variant

(例) Dim arrs as Variant
arrsの後に()(2)などをつけないのがポイント

Dim 配列名(2) as Variant のように配列名の後に要素数を入れる=静的配列で使用はしないでください。

静的配列は絶対にその後の要素数の変更はできない=要素の追加が不可能となります。

使用した場合は以下のようなエラーを起こします。

詳しくはこちらの記事を確認してください

【VBA】配列は動的配列一択である理由と配列宣言と使い方の最適解 このページでわかること 動的配列と静的配列の違い 静的配列は実務では使用価値がない理由 配列の宣言と使い方の実務上の最適...

コード

  • 関数名
    addElm( arrs , elm, order )
  • 引数
    詳細は下記
  • 戻り値
    なし(引数で指定した配列に任意の位置で要素が追加されます。)
# 引数 データ型 内容
arrs Variant 対象とする配列
elm Variant 追加したい要素の値
order long 省略可(その場合は-1)
指定された位置に要素を追加。
マイナスの値および、要素数以上の値が指定されたら、末尾に追加。
Function addElm(ByRef arrs As Variant, ByVal elm As Variant, Optional order As Long = -1)
    Dim num As Long
    Dim arr As Variant
    Dim i As Long
    
    'エラー判定
    On Error GoTo err
    num = UBound(arrs)
    
    'エラーを起こす=配列が空→要素を一つ追加して終了
err:
    If err.Number = 9 Or err.Number = 13 Then
        num = 0
        ReDim arrs(0)
        arrs(0) = elm
        Exit Function
    End If
    
    
    'エラーを起こさない=配列が空ではない→orderの順番で入れる位置を決める
    'orderが-1以下、もしくは、配列の要素数を超える数値の場合
    If order <= -1 Or order > num Then
        ReDim Preserve arrs(num + 1)
        arrs(num + 1) = elm
        
    'orderが0~要素数までの値の場合その位置に要素を入れる
    Else
        ReDim results(num + 1)
        For Each arr In arrs
            If i = order Then
                results(i) = elm
                i = i + 1
                results(i) = arr
            Else
                results(i) = arr
            End If
            i = i + 1
        Next
        arrs = results
    End If

End Function

実際に使用

実際に使用してみます。

[リンゴ、バナナ、パイナップル]という配列と
何も入っていない、空の配列を用意します。

この配列で以下の処理を試してみます。

  • [リンゴ、バナナ、パイナップル]の末尾に追加
  • [リンゴ、バナナ、パイナップル]の2番目に追加
  • 何も入っていない、空の配列に要素を追加

[リンゴ、バナナ、パイナップル]の末尾に追加

Sub testArray3()
    
    Dim arrs As Variant
    arrs = Array("リンゴ", "バナナ", "パイナップル")

    '追加
    Call addElm(arrs, "イチゴ")
    
    Debug.Print "============================"
    Dim arr As Variant
    For Each arr In arrs
        Debug.Print arr
    Next
    Debug.Print "============================" & vbCrLf
    
    '以下のように出力されます。
    '============================
    'リンゴ
    'バナナ
    'パイナップル
    'イチゴ
    '============================

    
End Sub

まとめ

いかがでしたでしょうか
まとめてみます。

まとめ
  • 配列に要素を追加する関数
  • シンプルに末尾に要素を追加する関数
    add_Elm関数
  • 任意の位置に挿入する関数
    insert_Elm関数

配列を便利に使いやすくする関数を作っています。

VBAを学習する方法をまとめました。
ご参考いただければ幸いです。

VBA(マクロ)のおすすめの学習方法 こんにちはhokkyokunです。 VBAを学ぶことで確実に業務は効率化し、余裕をもって仕事をすることができるようになります。 ...
【Udemyは講師で選べ!】UdemyがVBA学習に最適な理由とおすすめのVBA講師 こんにちはhokkyokunです。 巨大学習プラットホームUdemyの中からVBAに関する動画について講師に焦点を当ててまとめま...