二次元関数の行列変換を例に、配列を引数に配列を返す関数を紹介

二次元関数の行列変換を例に、配列を引数に配列を返す関数を紹介を紹介します。以下がコードで、二次元配列を引数で渡すと行列変換して、配列を戻り値として返します。

' 配列の行列変換
Function TransposeArray(ByVal myArray As Variant) As Variant
    Dim x As Long, y As Long
    Dim maxX As Long, minX As Long
    Dim maxY As Long, minY As Long
    
    Dim tempArr As Variant
    
    '上限と下限を取得
    maxX = UBound(myArray, 1)
    minX = LBound(myArray, 1)
    maxY = UBound(myArray, 2)
    minY = LBound(myArray, 2)
    
    '一時的な配列を作成する
    ReDim tempArr(minY To maxY, minX To maxX)
    
    '配列の行列変換
    For x = minX To maxX
        For y = minY To maxY
            tempArr(y, x) = myArray(x, y)
        Next y
    Next x
    
    '出力配列
    TransposeArray = tempArr
    
End Function

以下が、使用例です。

Sub TestTransposeArray()
    Dim tempArr(1 To 3, 1 To 2) As Variant
    Dim outputArrApp As Variant
    Dim outputArrFun As Variant
    
    '配列の値を代入する
    tempArr(1, 1) = "Steve"
    tempArr(1, 2) = "Johnson"
    tempArr(2, 1) = "Ryan"
    tempArr(2, 2) = "Jon"
    tempArr(3, 1) = "Andrew"
    tempArr(3, 2) = "Scott"
    
    '独自の行列変換関数を呼び出す
    outputArrFun = TransposeArray(tempArr)
    'Excelで使用できる行列変換関数を使用
    outputArrApp = Application.WorksheetFunction.Transpose(tempArr)
    
    ' 二次元配列のどちらの配列も、2つ以上の場合は、どちらの関数を使用しても、同じ配列に変換される
End Sub

結果は、以下のように、Excelで使用できる行列関数と同じ結果になります。

次の使用例は、二次元配列の内、二つ目の配列を、1にした場合です。

Sub TestTransposeArray1()
    'Dim tempArr(1 To 3, 1 To 2) As Variant
    Dim tempArr(1 To 3, 1 To 1) As Variant
    Dim outputArrApp As Variant
    Dim outputArrFun As Variant
    
    '配列の値を代入する
    tempArr(1, 1) = "Steve"
    'tempArr(1, 2) = "Johnson"
    tempArr(2, 1) = "Ryan"
    'tempArr(2, 2) = "Jon"
    tempArr(3, 1) = "Andrew"
    'tempArr(3, 2) = "Scott"
    
    '独自の行列変換関数を呼び出す
    outputArrFun = TransposeArray(tempArr)
    'Excelで使用できる行列変換関数を使用
    outputArrApp = Application.WorksheetFunction.Transpose(tempArr)
    
    ' 二次元配列の内、二つ目の配列を、1にした場合は、Excel関数では一次元配列になってしまう。
    ' 独自関数では、二次元配列のままで、行列が変換されている。
End Sub

結果は以下で、Excel関数では、一次元関数になってしまいます。

次の使用例は、二次元配列の内、一つ目の配列を、1にした場合です。

Sub TestTransposeArray2()
    'Dim tempArr(1 To 3, 1 To 2) As Variant
    Dim tempArr(1 To 1, 1 To 2) As Variant
    Dim outputArrApp As Variant
    Dim outputArrFun As Variant
    
    '配列の値を代入する
    tempArr(1, 1) = "Steve"
    tempArr(1, 2) = "Johnson"
    'tempArr(2, 1) = "Ryan"
    'tempArr(2, 2) = "Jon"
    'tempArr(3, 1) = "Andrew"
    'tempArr(3, 2) = "Scott"
    
    '独自の行列変換関数を呼び出す
    outputArrFun = TransposeArray(tempArr)
    'Excelで使用できる行列変換関数を使用
    outputArrApp = Application.WorksheetFunction.Transpose(tempArr)
    
    ' 二次元配列の内、一つ目の配列を、1にした場合は、
    ' どちらの関数を使用しても、同じ配列に変換される
End Sub

結果は以下で、同じ配列に変換されます。

行列変換について、独自関数とExcel関数の動作を比較してみました。二次元配列の内、二つ目の配列を、1にした場合は、Excel関数では、一次元配列に変換されるので、注意して使ってください。

以下を参考にしています。

Follow me!

コメントを残す