0

私がやろうとしていることは次のとおりです: 次元が0x6から 10x6 まで動的配列があるとします(つまり、0 から 10 までの行を持つことができますが、列は常に 6 です)。この最初の配列を引数として使用し、最初の配列の戻り値を要素とする 2 番目の配列を出力として作成する関数を必死に作成しようとしました (そして、マクロにバインドします)。たとえば、1x6 の単純なケースがある場合、出力配列の要素は 5 であり、それぞれの場合に式 で与えられます。さらに、関数は、入力配列から欠落している値をバイパスし、対応する存在しない戻り値を無視できる必要があります。すべてを VBA スクリプトで行う必要があります。(x_i+1 - x_i)/x_i, i=1, 2, ..., 6

必死に助けを求めてから 2 日が経ちましたが、問題は、VBA でのプログラミングについてまったく知らないことです (私は通常、MATLAB や Mathematica などの他の言語を使用しています)。私が見つけた解決策は、まとめて目標を達成することができませんでした。どんな助けでも大歓迎です。

4

1 に答える 1

0

コードが提供されていないため、何をしたいのかを正確に判断することはできませんが、配列を渡し、推測できる配列を返す例を次に示します。

編集:楽しみのために、これを更新して、最大3次元配列で機能するようにしました。

Public Sub Test()
    'Defines testArray as Variant 0 to 10
    Dim testArray(0 To 1, 0 To 6) As Long
    Dim returnArray() As Long
    Dim i As Long
    Debug.Print UBound(testArray, 2)
    'Populates testArray with Longs
    For i = 0 To UBound(testArray, 1)
        For j = 0 To UBound(testArray, 2)
            testArray(i, j) = (i + j) * 2
        Next
    Next
    'Passes testArray and returns ParseArray
    returnArray = addOne(testArray)
  End Sub

Public Function addOne(arrValues() As Long) As Variant
    Dim arrCopy() As Long
    Dim dimensionNum As Long, ErrorCheck As Long
    On Error Resume Next
    For dimensionNum = 1 To 60000
        ErrorCheck = LBound(arrValues, dimensionNum)
        If Err.Number <> 0 Then
            dimensionNum = dimensionNum - 1
            Exit For
        End If
    Next
    Dim i As Long, j As Long, k As Long
    'Copies passed array to avoid updating passed array directly
    arrCopy = arrValues
    'Adds 1 to each element of the array.
    If dimensionNum = 1 Then
        For i = LBound(arrCopy) To UBound(arrCopy)
            arrCopy(i) = arrCopy(i) + 1
        Next
    ElseIf dimensionNum = 2 Then

        For i = LBound(arrCopy) To UBound(arrCopy)
            For j = LBound(arrCopy, 2) To UBound(arrCopy, 2)
                arrCopy(i, j) = arrCopy(i, j) + 1
            Next
        Next
    ElseIf dimensionNum = 3 Then
        For i = LBound(arrCopy) To UBound(arrCopy)
            For j = LBound(arrCopy, 2) To UBound(arrCopy, 2)
                For k = LBound(arrCopy, 3) To UBound(arrCopy, 3)
                    arrCopy(i, j, k) = arrCopy(i, j, k) + 1
                Next
            Next
        Next
    Else
        MsgBox "Add function only works for three dimensions or fewer arrays"
    End If
    addOne = arrCopy
End Function
于 2012-09-26T20:24:17.547 に答える