VBA

【VBA】配列に要素を追加する関数(末尾、任意の場所、コピペで使える)

記事内に商品プロモーションを含む場合があります
わかること
  • 以下の二つの関数を紹介します。
    1. シンプルな末尾追加関数
    2. 任意の位置に挿入する関数
  • エラー回避関数を組み合わせることで
    要素数宣言でプログラムが止まることを気にしないで使えます。

こんにちはhokkyokunです。
実務ですぐに使える配列に要素を追加する関数です。

要素を末尾に追加するadd_elm関数
任意の場所に追加するinsert_elm関数です。

注意点だけ気を付ければ要素数の宣言など面倒な処理を気にせず
気軽に配列に追加できるようになります。

注意点

関数をご紹介する前に注意点が二つあります。
ざっくりまとめると以下のような点に注意してください。

  • エラー回避関数Is_correct_array関数を使って
    エラーが生じる空の状態を回避する
  • 配列を格納する変数の宣言方法は
    「Dim 配列名 as Variant」

配列は要素数の宣言をうまくやらないとすぐにエラーが生じます。

そこで
①エラー回避関数の使用と②配列宣言の指定によって
快適に配列を使えるようにしていただけると助かります。

エラー回避関数

配列で生じるエラーを回避する関数として
Is_correct_array関数を作りました。

これを用いると配列がエラー状態なのかどうか
ブール型(TrueかFalse)で返してくれます。

【VBA】配列が空かどうかを判定する関数とエラー回避する関数 わかること 配列が空の状態は2種類①エラーが発生する状態②エラーが出ずEmptyが要素として入った状態 配列の状態を把握するこ...

コードはこちらに乗せておきますので、
こちらも忘れずコピーしておいてください。

Function Is_correct_array(ByVal arrs As Variant)
    Dim a As Long
    
    'なんでもいいが、エラーを生じさせる
    On Error GoTo err
    a = UBound(arrs)

    'エラーが生じたときエラー番号で9か13の場合はFalse
err:
    If err.Number = 9 Or err.Number = 13 Then
        Is_correct_array = False
    Else
        Is_correct_array = True
    End If
    
End Function

変数の宣言方法

配列を変数として格納していくと思いますが、
その宣言方法には注意が必要です。
以下の宣言方法で変数を宣言してください。

Dim 配列名 as Variant

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

配列は静的配列(宣言時に要素数を指定する配列)で
使用しないでください

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

関数

関数はオリジナルです。
以下の二つを作りました。

  • add_Elm関数
    末尾に追加するシンプルな関数
  • insert_Elm関数
    任意の位置に挿入する関数

add_Elm関数 末尾に追加するシンプルな関数

コード

まずはオーソドックスな配列の末尾に追加する関数です。

  • 関数名
    add_Elm( arrs , elm )
  • 引数
    ① arrs : 配列(データ型はVariant)
    ② elm : 要素(データ型はVariant)
  • 戻り値
    なし(配列に要素が追加されています)
Function add_Elm(ByRef arrs As Variant, ByVal elm As Variant)
    Dim num As Long
    
    'Is_correct_array関数で配列がエラーを起こす空の状態かどうか判定
    
    'エラーを起こす空の状態
    If Not Is_correct_array(arrs) Then
    
        '要素数が一つ=「0」で宣言
        ReDim arrs(0)
        arrs(0) = elm
    
    'エラーを起こす空の状態ではない
    Else
        num = UBound(arrs)
        ReDim Preserve arrs(num + 1)
        arrs(num + 1) = elm
    End If
End Function

配列のエラー回避コードはIs_correct_array関数は
こちらの記事にあります。

実際に使ってみます

では、実際に使ってみます。

Sub test_add_elm()
    Dim arrs As Variant
    arrs = Array(1, 2, 3, 4, 5, 6)
    Call add_Elm(arrs, 7)
End Sub

こんな感じで、末尾に入れることができました。

insert_Elm関数 要素を任意の場所に追加する関数

コード

末尾に追加するだけでも実用的ですが、
場所を指定して入れたい場合や先頭に入れたい場合もあると思います。
そんな時はこちらを使ってみてください。

  • 関数名
    insert_Elm(arrs , elm , order )
  • 引数
    ① arrs : 配列(データ型はVariant)
    ② elm : 要素(データ型はVariant)
    ③ order : 挿入する位置(データ型はlong)
  • 戻り値
    なし(配列に要素が挿入されています)

使い方に癖がありますので
少し説明させてください。

  • 引数orderで挿入する位置を指定します。
  • 例えば、1を指定した場合、左から「0,1」の「2番目」の位置に挿入します。
  • 要素数のインデックスより大きい数値を入れた場合、最後尾に挿入されます。
    [“a”,”b”,”c”]という3要素の配列で「4」を指定すると
    [0,1,2,3,4]の「5番目」に挿入することになりますが、最後尾は「4番目」なので、4番目に挿入されます
  • 「-1」を指定すると問答無用で最後尾に挿入されます。
'配列に要素が何も入っていない状態 = 空と定義すると
'①エラーが生じる状態
'②エラーが生じない、Emptyが入った状態
'の二つがあります。

'②は基本的に静的配列にしていなければ生じないので無視

Function insert_Elm(ByRef arrs As Variant, ByVal elm As Variant, ByVal order As Long)
    Dim i As Long
    Dim arr As Variant
    Dim results As Variant
    Dim num As Long
    
    'Is_correct_array関数で配列が
    '①エラーを起こす空の状態かどうか判定
    
    'エラーを起こす空の状態
    If Not Is_correct_array(arrs) Then
    
        '要素数が一つ=「0」で宣言
        ReDim arrs(0)
        arrs(0) = elm
    
    'エラーを起こす空の状態ではない
    Else
    
        'orderが-1またはorderがarrsの最大インデックスより大きい場合
        '末尾に入れる
        num = UBound(arrs)
        If order = -1 Or order > num Then
            ReDim Preserve arrs(num + 1)
            arrs(num + 1) = elm
        'orderが-1、最大インデックスより大きい数値以外
        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 If
End Function

実際に使ってみます

ちょっと癖がありますが、位置を任意で指定できますし、
エラーも発生しないように工夫しています。

また、「-1」を指定すると最後尾に挿入されるようにしています。

①先頭

Sub test_insert_elm1()

Dim arrs As Variant
arrs = Array(1, 2, 3, 4, 5, 6)
Call insert_Elm(arrs, 7, 0)

'結果 >> [7,1,2,3,4,5,6]
End Sub

②先頭<位置<最後尾

Sub test_insert_elm1()

Dim arrs As Variant
arrs = Array(1, 2, 3, 4, 5, 6)
Call insert_Elm(arrs, 7, 3)

'結果 >> [1,2,3,7,4,5,6]
End Sub

③最後尾

Sub test_insert_elm3()

Dim arrs, arrs2 As Variant

'-1を入れると問答無用で最後尾
arrs = Array(1, 2, 3, 4, 5, 6)
Call insert_Elm(arrs, 7, -1)
'結果 >> [1,2,3,4,5,6,7]

'最大インデックスより大きい数値の場合も最後尾
arrs2 = Array(1, 2, 3, 4, 5, 6)
Call insert_Elm(arrs2, 7, 10)
'結果 >> [1,2,3,4,5,6,7]
End Sub

まとめ

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

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

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

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

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