我有一组数值作为数组,就像这样
100,120,0,100,90 etc
我还有一个整数变量 n
我必须计算数组中的零,并将最低的非零(第一次出现)替换为零,直到零的计数 = n
因此,鉴于上面的数据和 n = 3 我最终会得到
0,120,0,100,0 etc
然后我需要对这些值求和。
我对 Access vba 数组不熟悉,而且似乎根本没有很多内置数组操作函数。有人能帮忙吗?
我有一组数值作为数组,就像这样
100,120,0,100,90 etc
我还有一个整数变量 n
我必须计算数组中的零,并将最低的非零(第一次出现)替换为零,直到零的计数 = n
因此,鉴于上面的数据和 n = 3 我最终会得到
0,120,0,100,0 etc
然后我需要对这些值求和。
我对 Access vba 数组不熟悉,而且似乎根本没有很多内置数组操作函数。有人能帮忙吗?
对数组进行排序然后从 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