VBA:总结矩阵

7 excel vba matrix excel-vba

为什么这个功能不起作用?

键入=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)

chr*_*sen 3

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,并且jVariants

另外,在 32 位操作系统上使用Integer而不是Long实际上会适得其反:Long会稍微快一些。