为什么这个功能不起作用?
键入=funtest(2.1)在Excel中,它会给我#VALUE!.
Public Function funtest(a As Double) As Double
Dim z, j, i As Integer
Dim matrix(3, 3, 3) As Double
For z = 0 To 3 Step 1
For j = 0 To 3 Step 1
For i = 0 To 3 Step 1
matrix(z, j, i) = a
Next i, j, z
funtest = Application.WorksheetFunction.Sum(matrix)
End Function
Run Code Online (Sandbox Code Playgroud)
WorksheetFunction.Sum将适用于范围或二维数组。它会出错,因为您向它传递了一个 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
Run Code Online (Sandbox Code Playgroud)
请注意,我稍微修改了您的声明,请参阅答案末尾的注释。
要对高维数组求和,您将需要进行一些循环。
一种选择(可能适合也可能不适合您的总体要求)是稍微不同地声明您的数组,即所谓的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
Run Code Online (Sandbox Code Playgroud)
这是一个二维数组的数组。然后依次Sum应用于每个内部数组。这样,至少您只循环一个维度,而不是所有三个维度。
注意DimandInteger
您必须指定 all As Type's,否则变量默认为Variant
在您的代码中z,并且j将Variants
另外,在 32 位操作系统上使用Integer而不是Long实际上会适得其反:Long会稍微快一些。
| 归档时间: |
|
| 查看次数: |
11187 次 |
| 最近记录: |