配列をソートしてから、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