在Access中操作数组

时间:2012-06-12 20:38:51

标签: ms-access

我有一组数值作为数组,如此

100,120,0,100,90 etc

我还有一个整数变量n

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

所以给出上面的数据,并且n = 3  我最终会

 0,120,0,100,0 etc

我需要对这些值求和。

我不熟悉Access vba数组,看起来根本没有很多构建的数组操作函数。有人能帮忙吗?

1 个答案:

答案 0 :(得分: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