配列(一次元/二次元)

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

パーツ化とは

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

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

このコードをコピペでOK

'■2個の二次元配列を列方向(横方向)に結合(マージ)する
Private Function Call_MergeArray_Column(arr1 As Variant, arr2 As Variant) As Variant
    
    '■結合(マージ)後の配列サイズ
    '■■列方向(横)に結合、行方向(縦)は二次元配列の大きい方に合わせる。
    Dim ROW_NEW As Long
    Dim COL_NEW As Long
    ROW_NEW = Application.WorksheetFunction.Max(UBound(arr1, 1), UBound(arr2, 1))
    COL_NEW = 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 j = 1 To COL_NEW
        If j <= UBound(arr1, 2) Then
            For i = 1 To ROW_NEW
                If i <= UBound(arr1, 1) Then
                    newArr(i, j) = arr1(i, j)
                Else
                    newArr(i, j) = Empty
                End If
            Next i
        Else
            For i = 1 To ROW_NEW
                If i <= UBound(arr2, 1) Then
                    newArr(i, j) = arr2(i, j - UBound(arr1, 2))
                Else
                    newArr(i, j) = Empty
                End If
            Next i
        End If
    Next j
    Call_MergeArray_Column = 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_Column(arr1, arr2)
    
    '■マージ結果
    Debug.Print arr1(1, 1) ' "aaa"
    Debug.Print arr1(1, 2) ' 1
    Debug.Print arr1(1, 3) ' 2
    Debug.Print arr1(2, 1) ' Empty
    Debug.Print arr1(2, 2) ' 3
    Debug.Print arr1(2, 3) ' 4
    
End Sub

注意点

関連記事

二次元配列の行列(縦横)を入れ替える【ExcelVBA】
配列開始を1からスタートさせる【Option Base 1】【ExcelVBA】
配列から空白(Empty)を削除する【ExcelVBA】
Emptyデータかどうか判断する【IsEmpty関数】【ExcelVBA】
「二次元配列を行方向に結合(マージ)する」処理をパーツ化する【ExcelVBA】

コメント

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