二次元関数の行列変換を例に、配列を引数に配列を返す関数を紹介
二次元関数の行列変換を例に、配列を引数に配列を返す関数を紹介を紹介します。以下がコードで、二次元配列を引数で渡すと行列変換して、配列を戻り値として返します。
' 配列の行列変換
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関数では、一次元配列に変換されるので、注意して使ってください。
以下を参考にしています。