VBA

【VBA】配列同士を結合(merge)する関数(エラー回避対応)

記事内に商品プロモーションを含む場合があります
わかること
  • 配列同士を結合する関数を作成しました。
  • 以下のようなイメージです。
    [ a, b, c ] + [ d, e ] = [ a, b, c, d, e ]
  • 配列は何個でも対応可能です
    (例)4つの配列を一つの配列に統合(マージ)
  • 空の配列が入っていても対応します。

こんにちは、hokkyokunです。

配列同士を結合する関数を作りました。
以下のようなイメージで結合します↓

[ a , b , c ]という配列と
[ d , e ]という配列があるとして、
[ a , b , c , d , e ]という配列を返します。

このとき、一方の配列が空の場合でもエラー発生しません。

[ a , b , c ]という配列と
[ ]=空の配列を結合しても
[ a , b , c ]という配列を返します。

また、配列の数はいくらでも大丈夫です。

[ a , b , c ] + [ d, e ] + [ f, g, h ] = [ a, b, c, d, e, f, g, h ]

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

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

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

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

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

依頼はこちらから

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

無料登録はこちら

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

注意点

サブ関数

関数が長く、複雑化するのを防ぐために処理を分割しています。

  1. 配列が空かどうかの判断
  2. 配列に要素を追加する

コードは以下です。
必ず、モジュールに追加してから使用してください

Function isEmptyArray(ByVal arrs As Variant)
    Dim a As Variant
    '要素をとり出してエラーが出るかどうか
    On Error GoTo err
    a = arrs(0)

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

End Function

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

コードの詳しい解説は以下をご確認ください

【VBA】配列が空の状態のバリエーションと空の状態を判定する関数 わかること VBAの配列が空の状態になる、そのバリエーションを解説 動的配列で宣言すると配列が空という扱い。エラーになる 静...
【VBA】配列に要素を追加する関数(任意の位置に対応可能) わかること 配列に簡単に要素を追加できる関数のコードとその使い方 こんにちはhokkyokunです。 配列の関数をいくつ...

配列の宣言方法

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

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

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

Dim 配列名 as Variant

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

個人的には配列の宣言は以下一択です。
他の書き方は一切しません。

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

コード

  • 関数名
    mergeArray ( arrs )
  • 引数
    arrs : ※配列をさらに配列に格納したもの。↓で詳しく説明
  • 戻り値
    あり(すべての要素が結合された配列が返ってくる
Function mergeArray(ByVal arrs As Variant)
    Dim arr As Variant
    Dim elm As Variant
    
    For Each arr In arrs
        If Not isEmptyArray(arr) Then
            For Each elm In arr
                Call addElm(mergeArray, elm)
            Next
        End If
    Next

End Function

引数「arrs」の構造について説明します。

例えば、
①[ リンゴ、バナナ、パイナップル ]
②[ トマト、キュウリ ]
③[ エビ、サンマ、サーモン ]

このような3つの配列を統合して一つの配列に格納したいとします。

この場合、3つの配列をまとめてさらに大きな配列とします。

[
[ リンゴ、バナナ、パイナップル ],
[ トマト、キュウリ ],
[ エビ、サンマ、サーモン ]
]

実際に使ってみます

三つの配列を結合

上記で説明したような「リンゴ、バナナ…」の3つの配列を使ってみます。

Sub testArray1()
     
    Dim arrs1, arrs2, arrs3 As Variant
    
    arrs1 = Array("リンゴ", "バナナ", "パイナップル")
    arrs2 = Array("トマト", "キュウリ")
    arrs3 = Array("エビ", "サンマ", "サーモン")
    
    '配列のマージ
    Dim arrsMerged As Variant
    arrsMerged = mergeArray(Array(arrs1, arrs2, arrs3))
     
    Debug.Print "============================"
    Dim arr As Variant
    For Each arr In arrsMerged
        Debug.Print arr
    Next
    Debug.Print "============================" & vbCrLf
     
    '以下のように出力されます。
    '============================
    'リンゴ
    'バナナ
    'パイナップル
    'トマト
    'キュウリ
    'エビ
    'サンマ
    'サーモン
    '============================
 
     
End Sub

空の配列が含まれている

例えば、同じような三つの配列を結合させるとして、一部の配列を初期化し、空の状態にしたとします。

それでも統合はエラーを吐かずにうまくいきます。

Sub testArray2()
     
    Dim arrs1, arrs2, arrs3 As Variant
    
    arrs1 = Array("リンゴ", "バナナ", "パイナップル")
    arrs2 = Array("トマト", "キュウリ")
    arrs3 = Array("エビ", "サンマ", "サーモン")
    
    'arrs2を初期化
    arrs2 = Array()
    
    '配列のマージ
    Dim arrsMerged As Variant
    arrsMerged = mergeArray(Array(arrs1, arrs2, arrs3))
     
    Debug.Print "============================"
    Dim arr As Variant
    For Each arr In arrsMerged
        Debug.Print arr
    Next
    Debug.Print "============================" & vbCrLf
     
    '以下のように出力されます。
    '============================
    'リンゴ
    'バナナ
    'パイナップル
    'エビ
    'サンマ
    'サーモン
    '============================

End Sub

まとめ

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

まとめ
  • 配列同士を結合するオリジナル関数を紹介
  • 配列の数はいくらでも対応可能
  • 一部の配列が空でも対応
  • 関数はこちら

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

最後に、

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

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

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

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

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

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

依頼はこちらから

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

無料登録はこちら

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

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

ではでは。