VBA

【VBA】配列に要素を追加する関数(任意の位置に対応可能)

記事内に商品プロモーションを含む場合があります
わかること

配列に簡単に要素を追加できる関数のコードとその使い方

こんにちはhokkyokunです。

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

それは、配列の要素を追加する関数です。

この関数には大きく二つの使い方があり、

  1. デフォルトでは末尾に要素を追加(普段はこれで十分)、
  2. 必要に応じて、位置を指定するとその位置に要素を追加できます。

配列はプログラミングの基本中の基本要素です。
一方で、VBAの配列はクセ強なので、そのままでは取り扱いが難しいです。

これを簡単に扱えるようにしましたので最後まで見ていってください。

プログラミング代行いたします。

Python・VBAのコード対応です。

【VBA】
エクセルの自動処理全般

【Python】
スクレイピングによる、インターネット操作の自動化
デスクトップツール(データ解析等)
ワードプレスの自動化・効率化(自動更新、記事新規作成等の自動化)

ココナラで依頼を受けておりますので、お気軽にご相談ください。

依頼はこちらから

ココナラの会員登録がまだの方↓

無料登録はこちら

VBAを学習するには、動画プラットフォームUdemyがおすすめです。
Udemyの公式サイトはこちらです。

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

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

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

Sub testArray1()
    Dim arrs As Variant
    Dim num As Long
    Dim a As Variant
    
    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
    Dim a As Variant
    
    'エラー判定
    On Error GoTo err
    a = arrs(0)
    
    'エラーを起こす=配列が空→要素を一つ追加して終了
err:
    If err.Number = 9 Or err.Number = 13 Then
        ReDim arrs(0)
        arrs(0) = elm
        Exit Function
    End If
    
    
    'エラーを起こさない=配列が空ではない→orderの順番で入れる位置を決める
    'orderが-1以下、もしくは、配列の要素数を超える数値の場合、末尾に追加
    num = UBound(arrs)
    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

実際に使用

実際に使用してみます。

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

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

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

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

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

末尾に追加したい場合は、位置を指定する「order」引数は省略し、何も記入しないと勝手に末尾に追加されます。

[リンゴ、バナナ、パイナップル]の2番目に追加

次は位置を指定して追加してみます。
これもプログラムの作り方によっては便利です。

例えば、あらかじめエクセルシートのある列のデータをとっておき、後から配列の先頭にデータを追加したいときや、

配列内のデータをサーチして、特定の位置にデータを差し込んだりなどができるようになります。

位置の数え方ですが、【 0, 1, 2, 3…】と数えます
今回だと2番目となるので、「1」を指定します。

ちょっとややこしいですが、プログラムの世界では「0」から数えることが多いので、そのような仕様としました。

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

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

    
End Sub

何も入っていない、空の配列に要素を追加

ちょっと日本語としてはおかしい表現ですが、何も入っていない配列に追加をしてみます。

今回作った関数のかなり汎用性の高いところで、通常であれば配列が空の状態、つまりEmpty状態の場合、うまく場合分けをしないとすぐエラーが発生します。

ところが、この関数は配列がどんな状態だろうとお構いなしで要素の追加が可能です!

Sub testArray5()
    
    Dim arrs As Variant

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

    
End Sub

まとめ

いかがでしたでしょうか
もう一度おさらいしてみます。

  • 関数名
    addElm( arrs , elm, order )
  • 引数
    詳細は下記
  • 戻り値
    なし(引数で指定した配列に任意の位置で要素が追加されます。)
# 引数 データ型 内容
arrs Variant 対象とする配列
elm Variant 追加したい要素の値
order long 省略可(その場合は-1)
指定された位置に要素を追加。
マイナスの値および、要素数以上の値が指定されたら、末尾に追加。

コードはこちら

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

最後に、

ココナラでVBA、Pythonの作成代行を行っています。
よければ、↓からご依頼お待ちしております。

プログラミング代行いたします。

Python・VBAのコード対応です。

【VBA】
エクセルの自動処理全般

【Python】
スクレイピングによる、インターネット操作の自動化
デスクトップツール(データ解析等)
ワードプレスの自動化・効率化(自動更新、記事新規作成等の自動化)

ココナラで依頼を受けておりますので、お気軽にご相談ください。

依頼はこちらから

ココナラの会員登録がまだの方↓

無料登録はこちら

また、VBAを学習するなら動画での学習がおすすめです。
世界最大級の学習用動画プラットフォームUdemyにはVBAの動画がたくさんアップロードされています。よければ覗いてみてください。

Udemyの公式サイトはこちらです。

ではでは。