配列(一次元/二次元)

「二次元配列を行方向に結合(マージ)する」処理をパーツ化する【ExcelVBA】

パーツ化とは

ExcelVBAマクロ初級者からの脱却が、処理のパーツ化(プロシージャの分割)と考えています。
マクロを作る上で基本機能をパーツ化する事で、開発時間の削減に繋がります。
処理はパーツ単位で分ける事を心掛けましょう。

分かりやすく説明すると、エクセルの「関数」と同様です。
SUM関数であれば セル内に「=SUM(1+2+3)」と記載すれば、セルには「6」と表示されますよね。
値を渡せば正しい値で返ってくる動きです。

このコードをコピペでOK

'■2個の二次元配列を行方向(縦方向)に結合(マージ)する
public Function Call_MergeArray_Row(arr1 As Variant, arr2 As Variant) As Variant
    
    '■結合(マージ)後の配列サイズ
    '■■行方向(縦)に結合、列方向(横)は二次元配列の大きい方に合わせる。
    Dim ROW_NEW As Long
    Dim COL_NEW As Long
    ROW_NEW = UBound(arr1, 1) + UBound(arr2, 1)
    COL_NEW = Application.WorksheetFunction.Max(UBound(arr1, 2), UBound(arr2, 2))
    
    '■結合(マージ)後の二次元配列
    Dim newArr As Variant
    ReDim newArr(1 To ROW_NEW, 1 To COL_NEW)
    
    '■二次元配列を結合処理
    Dim i As Long
    Dim j As Long
    For i = 1 To ROW_NEW
        If i <= UBound(arr1, 1) Then
            For j = 1 To COL_NEW
                If j <= UBound(arr1, 2) Then
                    newArr(i, j) = arr1(i, j)
                Else
                    newArr(i, j) = Empty
                End If
            Next j
        Else
            For j = 1 To COL_NEW
                If j <= UBound(arr2, 2) Then
                    newArr(i, j) = arr2(i - UBound(arr1, 1), j)
                Else
                    newArr(i, j) = Empty
                End If
            Next j
        End If
    Next i
    
    Call_MergeArray_Row = newArr
    
End Function

使い方

上記をコピペでお好きなモジュール内に記載してください。

Public Sub sample()
    
    Dim arr1 As Variant
    Dim arr2 As Variant
    
    ReDim arr1(1, 1)
    ReDim arr2(2, 2)
    arr1(1, 1) = "aaa"
    arr2(1, 1) = 1
    arr2(1, 2) = 2
    arr2(2, 1) = 3
    arr2(2, 2) = 4
    
    '■二個の配列をマージ
    arr1 = Call_MergeArray_Row(arr1, arr2)
    
    '■マージ結果
    Debug.Print arr1(1, 1) ' "aaa"
    Debug.Print arr1(1, 2) ' Empty
    Debug.Print arr1(2, 1) ' 1
    Debug.Print arr1(2, 2) ' 2
    Debug.Print arr1(3, 1) ' 3
    Debug.Print arr1(3, 2) ' 4
    
End Sub

注意点

関連記事

二次元配列の行列(縦横)を入れ替える【ExcelVBA】
配列開始を1からスタートさせる【Option Base 1】【ExcelVBA】
配列から空白(Empty)を削除する【ExcelVBA】
Emptyデータかどうか判断する【IsEmpty関数】【ExcelVBA】

コメント

タイトルとURLをコピーしました