【VBA】2次元のVariant配列を結合する | あじゅWeb

【VBA】2次元のVariant配列を結合する

エクセルVBAで使うコードの備忘録。2次元のVariant配列を結合するコード。列方向(横方向)への結合と行方向(縦方向)への結合の両方をご紹介します。比較的簡単に実現できます。

スポンサーリンク

列方向に配列を結合

まずは、二つの2次元配列を列方向に結合する場合について。列方向というのは、エクセルのワークシートで言うと横側のことを言っています。イメージは、2次元の配列をエクセルシート上でどんどん右側につなげていくイメージです(下図参照)。

列方向の結合

引数として結合する2次元配列(vArray1とvArrray2)を指定します。結合後の配列サイズは、行はサイズが大きいもの、列は2つの配列の足し合わせた値、になります。

列方向に2次元配列を結合

'--- 2つのVariant配列を結合する(列方向) ---'
Private Function MergeVariantArraysCol(vArray1 As Variant, vArray2 As Variant) As Variant
    
    '結合する配列のサイズ
    Dim vArray1_row As Long
    Dim vArray1_col As Long
    Dim vArray2_row As Long
    Dim vArray2_col As Long
    vArray1_row = UBound(vArray1, 1)
    vArray1_col = UBound(vArray1, 2)
    vArray2_row = UBound(vArray2, 1)
    vArray2_col = UBound(vArray2, 2)
    
    '結合後の配列のサイズ
    Dim newArray_row As Long
    Dim newArray_col As Long
    newArray_row = Application.WorksheetFunction.Max(vArray1_row, vArray2_row)
    newArray_col = vArray1_col + vArray2_col
    
    '結合後の配列
    Dim newArray As Variant
    ReDim newArray(1 To newArray_row, 1 To newArray_col)
    
    '配列を結合する
    Dim i As Long
    Dim j As Long
    For j = 1 To newArray_col
        If (j <= vArray1_col) Then
            For i = 1 To newArray_row
                If (i <= vArray1_row) Then
                    newArray(i, j) = vArray1(i, j)
                Else
                    newArray(i, j) = Empty
                End If
            Next i
        Else
            For i = 1 To newArray_row
                If (i <= vArray2_row) Then
                    newArray(i, j) = vArray2(i, j - vArray1_col)
                Else
                    newArray(i, j) = Empty
                End If
            Next i
        End If
    Next j
    
    MergeVariantArraysCol = newArray
    
End Function

行方向に配列を結合

次は、二つの2次元配列を行方向に結合する場合について。行方向というのは、エクセルのワークシートで言うと下側のことを言っています。イメージは、2次元の配列をエクセルシート上でどんどん下側につなげていくイメージです(下図参照)。

行方向の結合

引数として、列方向と同様に結合する2次元配列(vArray1とvArrray2)を指定します。結合後の配列サイズは、行は2つの配列の足し合わせた値、列はサイズが大きいもの、になります。

行方向に2次元配列を結合

'--- 2つのVariant配列を結合する(行方向) ---'
Private Function MergeVariantArraysRow(vArray1 As Variant, vArray2 As Variant) As Variant
    
    '結合する配列のサイズ
    Dim vArray1_row As Long
    Dim vArray1_col As Long
    Dim vArray2_row As Long
    Dim vArray2_col As Long
    vArray1_row = UBound(vArray1, 1)
    vArray1_col = UBound(vArray1, 2)
    vArray2_row = UBound(vArray2, 1)
    vArray2_col = UBound(vArray2, 2)
    
    '結合後の配列のサイズ
    Dim newArray_row As Long
    Dim newArray_col As Long
    newArray_row = vArray1_row + vArray2_row
    newArray_col = Application.WorksheetFunction.Max(vArray1_col, vArray2_col)
    
    '結合後の配列
    Dim newArray As Variant
    ReDim newArray(1 To newArray_row, 1 To newArray_col)
    
    '配列を結合する
    Dim i As Long
    Dim j As Long
    For j = 1 To newArray_row
        If (j <= vArray1_row) Then
            For i = 1 To newArray_col
                If (i <= vArray1_col) Then
                    newArray(j, i) = vArray1(j, i)
                Else
                    newArray(j, i) = Empty
                End If
            Next i
        Else
            For i = 1 To newArray_col
                If (i <= vArray2_col) Then
                    newArray(j, i) = vArray2(j - vArray1_row, i)
                Else
                    newArray(j, i) = Empty
                End If
            Next i
        End If
    Next j
    
    MergeVariantArraysRow = newArray
    
End Function