我有一组数值作为数组,如此
100,120,0,100,90 etc
我还有一个整数变量n
我必须计算数组中的零,并用零替换最低的非零(第一次出现),直到计数为零= n
所以给出上面的数据,并且n = 3 我最终会
0,120,0,100,0 etc
我需要对这些值求和。
我不熟悉Access vba数组,看起来根本没有很多构建的数组操作函数。有人能帮忙吗?
答案 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