0

我有一组数值作为数组,就像这样

100,120,0,100,90 etc

我还有一个整数变量 n

我必须计算数组中的零,并将最低的非零(第一次出现)替换为零,直到零的计数 = n

因此,鉴于上面的数据和 n = 3 我最终会得到

 0,120,0,100,0 etc

然后我需要对这些值求和。

我对 Access vba 数组不熟悉,而且似乎根本没有很多内置数组操作函数。有人能帮忙吗?

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 回答