Excel VBA:对矩阵求和

Excel VBA:对矩阵求和,excel,matrix,vba,Excel,Matrix,Vba,为什么这个函数不起作用 在Excel中键入=funtest(2.1),它会给我#值 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 funt

为什么这个函数不起作用

在Excel中键入
=funtest(2.1)
,它会给我
#值

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
首先,当你得到
#值这意味着存在错误,可能意味着使用的矩阵无效

为了回答您的问题,您的代码无法工作,因为您的语法不正确。以下函数根据值创建矩阵

Function FQ_matrix_create(StartValue As Double, Interval As Double,
nrow As Long, ncol As Long) As Double()
Dim M() As Double
' Creates matrix with sequential element values with given row and
' column sizes. Fills matrix row-wise with numbers.
' - set Interval = 0 for constant element values
' - error input arguments nrow and ncol are not positive integers
要对值求和,请使用:

Function FQ_matrix_element_sum(M() As Double, SumOption As
MatrixDirection) As Double()
' Returns the sum of elements of matrix M, either row or column wise
' - Rowwise sum returns a horizontal 1xNcol matrix
' - Columnwise sum returns a vertical 1 xNrow matrix
' - Element sum (all elements) returns a 1x1 matrix
' - error if M is not a matrix
' - error if SumOption is not 1 (nRowWiseSum) or 2 (nColWiseSum) or
3 (nElementSum)
为了帮助您理解Excel VBA中的矩阵,这里有一个很好的资源:


具体来说,请看网站上的PDF下载。

当你说“我试图解决一个(3,3,3)矩阵的简单情况,每个元素等于某个双精度a”时,我会逐字理解你。这将做到:

Public Function funtest(a As Double) As Double
   funtest = 4*4*4*a
End Function

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
这是一个二维数组。然后将
依次应用于每个内部数组。这样,至少您只循环了一个维度,而不是全部三个维度

关于
Dim
Integer

必须将所有
指定为类型
,否则变量默认为
变量

在您的代码中,
z
j
将是
变体


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

我相信Sum函数以范围作为输入,不是一个双精度VBA数组。你想用这个函数实现什么?@brettdj我创建的名为
matrix
的对象是一个具有
(3,3,3)
维度的三维数组。我想对这个矩阵中的每个元素求和。对于
2.1
,将函数调用为
funtest(2.1)
是任意的。我只想测试它是否可以与任何
double
一起使用。我的实际问题更复杂,但在我进一步研究之前,我正试图解决一个简单的例子,即a
(3,3,3)
矩阵,每个元素都等于某个双精度,
a
。我从来不知道你能把下一个I,j,z都放在一行上+1就为了这个。@Harokitty你不需要第一步。仅当增量大于1或正在递减时才使用步骤-1。因此矩阵没有本机功能?矩阵函数语法是[{1,2,3;4,5,6}]而不是(1,2,3)。我看不出声明一个二维常量数组与所问的问题有什么关系。而且
变量
更慢。在VBA中,通过在模块开头添加
Option Explicit
来打开静态键入并没有什么坏处。