0

私は配列として数値のセットを持っています、

100,120,0,100,90 etc

整数変数nもあります

配列内のゼロをカウントし、ゼロ以外の最小の非ゼロ(最初の出現)をゼロに置き換えて、ゼロのカウントがnになるようにする必要があります。

したがって、上記のデータが与えられ、n = 3の場合、次のようになります。

 0,120,0,100,0 etc

次に、値を合計する必要があります。

私はAccessvba配列に精通しておらず、組み込みの配列操作関数はほとんどないようです。誰かが助けることができますか?

4

1 に答える 1

1

配列をソートしてから、N から始まる配列をループして現在の合計を取得します。

問題は、最小値をゼロに変換する必要がないということです。あなたがしなければならないのは、それを合計から除外することです。したがって、現在の合計を N で開始します (0 ベースの配列を想定)。

コメントを読んで、空の配列と N 未満の配列サイズを扱うように回答を修正しました。

Function ArrayTotal(MyArray() As Long, N As Long)
    Dim Idx As Long
    Dim Total As Long

    On Error Resume Next
    Idx = UBound(MyArray)
    If Err.Number <> 9 Then
        QuickSort1 MyArray
        If N < UBound(MyArray) Then
            For Idx = N To UBound(MyArray)
                Total = Total + MyArray(Idx)
            Next Idx
        End If
    End If
    ArrayTotal = Total
End Function

' Omit plngLeft & plngRight; they are used internally during recursion
Public Sub QuickSort1(ByRef pvarArray As Variant, Optional ByVal plngLeft As Long, Optional ByVal plngRight As Long)
    Dim lngFirst As Long
    Dim lngLast As Long
    Dim varMid As Variant
    Dim varSwap As Variant

    If plngRight = 0 Then
        plngLeft = LBound(pvarArray)
        plngRight = UBound(pvarArray)
    End If
    lngFirst = plngLeft
    lngLast = plngRight
    varMid = pvarArray((plngLeft + plngRight) \ 2)
    Do
        Do While pvarArray(lngFirst) < varMid And lngFirst < plngRight
            lngFirst = lngFirst + 1
        Loop
        Do While varMid < pvarArray(lngLast) And lngLast > plngLeft
            lngLast = lngLast - 1
        Loop
        If lngFirst <= lngLast Then
            varSwap = pvarArray(lngFirst)
            pvarArray(lngFirst) = pvarArray(lngLast)
            pvarArray(lngLast) = varSwap
            lngFirst = lngFirst + 1
            lngLast = lngLast - 1
        End If
    Loop Until lngFirst > lngLast
    If plngLeft < lngLast Then QuickSort1 pvarArray, plngLeft, lngLast
    If lngFirst < plngRight Then QuickSort1 pvarArray, lngFirst, plngRight
End Sub
于 2012-06-12T23:15:26.160 に答える