配列

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

記事内に商品プロモーションを含む場合があります
わかること
  • 配列同士を結合する関数です。
  • エラー回避します。
    一方の配列が空の状態でも処理が止まりません。

こんにちは、hokkyokunです。

配列同士を結合する関数を
紹介します。

コピペOKの関数を作りました。

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

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

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

空の配列を処理する意味はあるの?

処理を自動化する場合、
時として配列が空になるかもしれません。

このときエラーでいちいち止まっていては仕事にならないので
極力エラー回避を考えておくことは重要です。

エラー回避関数はこちらにありますので、
良かったら見ていってください。

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

注意点

複数の関数に分けて処理している

個人的にはプログラムは小分けに関数化することで
自分もわかりやすく、エラーも回避しやすくなると考えています。

今回の配列を結合する関数を作るのに以下の関数を使用しました。

  • 配列に要素を追加する
    オリジナル関 add_Elm関数記事はこちら
  • 配列がエラーの生じる空かどうかを判定する
    Is_correct_array関数記事はこちら

使用する側としては面倒だと思いますが、全てコピペしていただけると
エラーの起こしにくいプログラムになると思いますので、よろしくお願いします。

配列の宣言方法

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

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

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

Dim 配列名 as Variant

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

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

この書き方の場合はエラーが起きないはずです。
起きた場合はご連絡いただければ幸いです。

配列は一方の関数にすべて格納するイメージ

配列はすべての関数を一方の配列に格納させます。
(後述しますが、引数arrs1の方にすべて格納します

新たに配列を生成するのではないので注意してください。

イメージ的にはPythonという言語のExtend関数のようなものを作りました。

関数

関数はオリジナルです。

Extend関数 配列同士の結合

  • 関数名
    Extend( arrs1 , arrs2 )
  • 引数
    ① arrs1 : 配列1(データ型はVariant)
    ② arrs2 : 配列2(データ型はVariant)
  • 戻り値
    なし(配列1に要素がすべて結合されている
  • 下記の関数を全てコピペして使用してください。
  • 一番上のExtend関数が本体です。
Function Extend(ByRef arrs1 As Variant, ByVal arrs2 As Variant)
    Dim arr As Variant
    
    'arrs2がエラーを起こす空の場合処理をせずに終了
    If Not Is_correct_array(arrs2) Then Exit Function
    
    For Each arr In arrs2
        Call add_Elm(arrs1, arr)
    Next
    
End Function
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
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

実際に使ってみます

実際に動かしてみます。

配列+配列

Sub test_extend1()
Dim arrs, arrs2 As Variant
arrs = Array("a", "b", "c")
arrs2 = Array("d", "e", "f")

Call Extend(arrs, arrs2)

'中身を確認
Dim msg As String
Dim arr As Variant
For Each arr In arrs
    msg = msg & arr & ","
Next
Debug.Print Left(msg, Len(msg) - 1)
'>>a,b,c,d,e,f
End Sub

一方が空の場合

配列の要素数がうまくできておらず、
このまま使うとエラーが生じる場合も対応しております。

Sub test_extend2()
Dim arrs, arrs2 As Variant

'=======================
'arrsが空
'=======================
arrs2 = Array("d", "e", "f")

Call Extend(arrs, arrs2)

'中身を確認
Dim msg As String
Dim arr As Variant
For Each arr In arrs
    msg = msg & arr & ","
Next
Debug.Print Left(msg, Len(msg) - 1)
'>>d,e,f

'===========================
'arrs2が空
'===========================
arrs = Array("a", "b", "c")
arrs2 = Array()
Call Extend(arrs, arrs2)

'中身を確認
msg = ""
For Each arr In arrs
    msg = msg & arr & ","
Next
Debug.Print Left(msg, Len(msg) - 1)
'>>a,b,c

End Sub

まとめ

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

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

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

VBAの学習方法をまとめました。

VBA(マクロ)のおすすめの学習方法 こんにちはhokkyokunです。 VBAを学ぶことで確実に業務は効率化し、余裕をもって仕事をすることができるようになります。 ...

VBAを高コスパで、短期間で学ぶにはUdemyがおすすめです。
Udemyは良質の学習プラットフォームですが、
動画数が多すぎてどれを見ればよいか迷います。

おすすめの講師をまとめました。

【Udemyは講師で選べ!】UdemyがVBA学習に最適な理由とおすすめのVBA講師 こんにちはhokkyokunです。 巨大学習プラットホームUdemyの中からVBAに関する動画について講師に焦点を当ててまとめま...

VBAを短時間で習得するためには
何はともあれ質問、相談する環境が重要です。

侍エンジニアはVBAをオンラインで学習できます。

質問の回答に力を入れていますので、
短時間でサクッと習得するにはオンライン学習を検討してみてください。

リアルに学習したい場合は
KENスクールがお勧めです。

KENスクールもオンライン対応していますが、
KENスクールにはリアルな教室があり、対面で学習できる強みがあります。

VBAカリュキュラムがあるパソコン教室はあまりないので、
実際に出向いて学習する方はこちらを検討してみてください。

新宿、池袋、北千住、横浜、名古屋、梅田、札幌、福岡に校舎があります!

KENスクール[ピーシーキョウシツ]
無料体験レッスンあります!