WorksheetFunction.Sum
可以用于范围或二维数组。由于您传递了一个三维数组,因此会出现错误。
因此,以下内容是有效的:
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
请注意,我稍微修改了您的声明,详见答案结尾的注释。
如果要对高维数组求和,您需要进行一些循环操作。
其中一种选项(可能适合您的整体要求)是稍微不同地声明您的数组,称为所谓的“锯齿形数组”。
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
这是一个二维数组的数组。接着对每个内部数组分别应用Sum
函数。这样,你至少只需要循环一维而不是所有三维。
Dim
和 Integer
的注意事项
必须指定所有的As Type
,否则变量默认为Variant
在你的代码中,z
和j
会成为Variants
此外,在32位操作系统上使用Integer
而不是Long
实际上是适得其反的:Long
会稍微更快。
matrix
,是一个三维数组,具有(3,3,3)
的维度。我想要对这个矩阵中的每个元素进行求和。将函数命名为funtest(2.1)
与2.1
无关,我只是想测试它是否适用于任何double
类型。我的实际问题更加复杂,但我正在尝试解决每个元素都等于某个双精度浮点数a
的(3,3,3)
矩阵的简单情况,然后再进一步处理。 - user1125946