7

Why doesn't this function work?

Type =funtest(2.1) in Excel and it'll give me #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
4

3 に答える 3

3

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なくを使用すると、わずかに高速になります。LongLong

于 2012-09-12T06:15:26.593 に答える
0

「各要素がいくつかのdoubleに等しい(3,3,3)行列の単純なケースを解こうとしている」と言うとき、私は文字通りあなたを連れて行くつもりです。これはそれを行います:

Public Function funtest(a As Double) As Double
   funtest = 4*4*4*a
End Function
于 2012-09-12T04:43:14.163 に答える
-1

まず、#VALUE!これがエラーがあることを意味する場合、それは無効な行列を使用していることを意味する可能性があります。

あなたの質問に答えるために、あなたの構文が正しくないのであなたのコードは機能しません。次の関数は、値から行列を作成します。

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のMatrixを理解するのに役立つ、優れたリソースがあります:http: //finaquant.com/download/matrixvectorvba

具体的には、サイトのPDFダウンロードをご覧ください。

于 2012-09-12T03:54:53.453 に答える