WorksheetFunction.Sum
範囲または2次元配列のいずれかで機能します。3次元配列を渡しているため、エラーが発生します。
だから、これはうまくいく
Public Function funtest(a As Double) As Double
Dim z As Long, j As Long, i As Long
Dim matrix() As Double
ReDim matrix(0 To 3, 0 To 4)
For j = LBound(matrix, 1) To UBound(matrix, 1)
For i = LBound(matrix, 2) To UBound(matrix, 2)
matrix(j, i) = a
Next i, j
funtest = Application.WorksheetFunction.Sum(matrix)
End Function
私はあなたの宣言を少し修正したことに注意してください。回答の最後にある注を参照してください。
高次元の配列を合計するには、ループを実行する必要があります。
1つのオプション(全体的な要件に適合する場合と適合しない場合があります)は、いわゆる。として、配列をわずかに異なる方法で宣言することJagged Array
です。
Public Function funtest2(a As Double) As Double
Dim z As Long, j As Long, i As Long
Dim matrix() As Variant
Dim InnerMatrix(0 To 4, 0 To 4) As Double
' Dimension Jagged Array
ReDim matrix(0 To 4)
For i = LBound(matrix, 1) To UBound(matrix, 1)
matrix(i) = InnerMatrix
Next
'Load Data into matrix
For z = LBound(matrix) To UBound(matrix)
For j = LBound(matrix(z), 1) To UBound(matrix(z), 1)
For i = LBound(matrix(z), 2) To UBound(matrix(z), 2)
matrix(z)(j, i) = a
Next i, j, z
' Sum matrix
For z = LBound(matrix) To UBound(matrix)
funtest2 = funtest2 + Application.WorksheetFunction.Sum(matrix(z))
Next
End Function
これは2次元配列の配列です。次にSum
、内部アレイのそれぞれに順番に適用されます。このように、少なくとも1つのディメンションのみをループし、3つすべてをループしているわけではありません。
注意しDim
てください。Integer
すべてAs Type
のを指定する必要があります。そうしないと、変数はデフォルトでVariant
コード内z
になり、次のj
ようになります。Variants
また、32ビットOSでは実際には逆効果ではInteger
なくを使用すると、わずかに高速になります。Long
Long