2016-04-18 2 views
2

Я не так свободно владею Excel, поэтому мой вопрос потенциально очень прост, но тем не менее дает мне головную боль.Excel: суммируйте N наибольших чисел в непересекающемся массиве ячеек

У меня есть специальная таблица с двумя типами значений. Одно абсолютное значение, которое рассчитывается как процент от этого абсолютного значения.

 A 
1 10 
2 0.1 
3 20 
4 0.2 
5 30 
6 0.3 
7 40 
8 0.4 
9 50 
10 0.5 

В этом примере второе значение составляет 1% от первого значения (например, 0,1 из 10). В моей фактической таблице эти значения различаются, а числа - случайные. Доля% от второго значения зависит от некоторого ключа и т. Д. Таким образом, это упрощенное представление для минимального примера.

Я хочу определить сумму самых больших 4 (из 5) чисел, но только из значений 1% (например, 0,1, а не 10). Все цифры находятся ниже друг друга. В принципе, я хочу игнорировать абсолютные числа (например, 10) и применять только относительные (например, 0,1) числа.

БОЛЬШОЙ функция определяет наибольшее число п и имеет следующий формат:

=SUM(LARGE(array, k)) 

Массив представляет собой непрерывный диапазон в таблице. Однако мне нужно выбрать выбранный набор полей. Есть ли способ сделать это с помощью набора ячеек?

Другими словами, если я использовать массив У ​​меня есть

=SUM(LARGE(A1:A10, {1,2,3,4})) 

алгоритмы всегда подберут 20,30,40 и 50.

В идеале, я хочу что-то вроде этого:

=SUM(LARGE(array(A2,A4,A6,A8,A10), {1,2,3,4})) 

Помощь?

+0

Является ли число относительным тогда и только тогда, когда оно меньше 1.0? –

+0

Нет, только в этом упрощенном примере. Невозможно определить, является ли число rel или abs, но то, что я знаю, является его ячейкой. Другими словами, у меня есть список ячеек, которые, как я знаю, я хочу включить. – RalfB

+0

Значит, каждое другое число относительное? –

ответ

0

Для упрощенного примера предположим, что B1: B4 содержит значения 1,2,3,4. Затем в С1: С4 ввести формулу массива:

{=LARGE(IF(MOD(ROW(A1:A10),2)=0,A1:A10,-1),B1:B4)} 

Аналогично, формула

{=SUM(LARGE(IF(MOD(ROW(A1:A10),2)=0,A1:A10,-1),B1:B4))} 

(используя Ctrl + Shift + Enter принять как формулу массива)

даст вам сумму в верхней 4.

Это предполагает, что все цифры положительны. Вы можете заменить -1 в формуле на min всех значений -1, если это предположение неверно.

Другой подход, если критерии для того, чтобы быть относительной ячейки слишком одноранговой быть суммированы по простой формуле, но если у вас есть список ячеек, чтобы использовать Indirect функцию:

enter image description here

На приведенном выше снимке экрана у меня есть список ячеек, содержащих относительные значения. В D1 я положил формулу =INDIRECT(C1) и скопировал ее вниз.Затем формула

=SUM(LARGE(D1:D5,{1,2,3,4})) 

возвращает желаемую сумму.

Возможно, существует способ отказаться от вспомогательной колонки, хотя функция INDIRECT, похоже, не очень хорошо сочетается с формулами массива.

На Edit: Вот решение VBA:

'The following function returns the sum of the largest k 
'elements in range R that are at the list of indices 
'if indices is left blank, then the sum of 
'the largest k in R is returned 

Function SumLargest(R As Range, k As Long, ParamArray indices() As Variant) As Double 
    Dim A As Variant 
    Dim i As Long, n As Long 
    Dim sum As Double 

    n = UBound(indices) 
    If n = -1 Then 
     For i = 1 To k 
      sum = sum + Application.WorksheetFunction.Large(R, i) 
     Next i 
     SumLargest = sum 
     Exit Function 
    Else 
     ReDim A(0 To n) 
     For i = 0 To n 
      A(i) = R.Cells(indices(i)).Value 
     Next i 
     For i = 1 To k 
      sum = sum + Application.WorksheetFunction.Large(A, i) 
     Next i 
     SumLargest = sum 
    End If 
End Function 

Если вы поставите эту функцию в стандартном модуле кода, то он может быть использован с листа, как:

=SumLargest(A1:A10,4,2,4,6,8,10) 

эти последние возвратов сумма наибольших 4, взятых из записей в 2,4,6,8,10

0

Используя предоставленные образцы данных, что-то вроде этой обычной формулы (не требует ввода массива) должно работать для вас, потому что проценты всегда будут меньше или равно 1:

=SUMPRODUCT(LARGE((A1:A10<=1)*A1:A10,{1,2,3,4})) 

Если вы хотите более гибкий способ захвата верхних чисел N, вы можете заменить {1,2,3,4} с функцией ROW(), например, так:

=SUMPRODUCT(LARGE((A1:A10<=1)*A1:A10,ROW(1:4))) 

EDIT: Если единственный способ получить относительные значения, если они каждый ряд, начиная в строке 2, вы можете использовать эту формулу вместо:

=SUMPRODUCT(LARGE(INDEX((MOD(ROW(A1:A10),2)=0)*A1:A10,),ROW(1:4))) 
+0

Что делает 'ИНДЕКС (X * A1: A10,)', чтобы сделать эту работу? –

+0

@JerryJeremiah Он позволяет вычислять функцию MOD как массив, а не только возвращать первый результат, он будет вычислять его для каждой ячейки в диапазоне, предоставляемом функции «MOD» – tigeravatar