Сумма максимального значения дубликатов на основе порога даты - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть следующие столбцы данных:

 Unique ID | Value | Date
     1     |   20  | 15/10/2018
     2     |   30  | 15/10/2018
     1     |   40  | 16/10/2018
     2     |   50  | 16/10/2018

Затем мне нужно написать формулу для суммирования столбца Значение на основе порога даты, но я хочу включить только максимальное значение каждого уникального идентификатора.

Date Threshold | Sum Formula
16/10/2018     | =SUMIF(C:C,"<="&F2,B:B)

Очевидно, что приведенная выше формула суммирует все значения (140).Мне нужно, чтобы он суммировал только одно значение MAX, которое меньше или равно пороговой дате для каждого уникального идентификатора (40 + 50 = 90).

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Любая отдельная формула рабочего листа потребует нескольких уровней циклического расчета, что усложнит формулу и, следовательно, потребует времени расчета.Один или несколько вспомогательных столбцов могут существенно уменьшить это.

Поместите это в D2 и заполните.

=IF(COUNTIF(A$2:A2, A2)=1, AGGREGATE(14, 7, B:B/((C$1:C$9<=F$2)*(A$1:A$9=A2)), 1), "")

Сумма отфильтрованных максимальных значений, которые вы ищете, простосумма столбца D (например, =sum(D:D)).

Обратите внимание, что я добавил к вашим исходным образцам данных для более четкого подтверждения дополнительных критериев.

enter image description here

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

Откройте VBE с помощью Alt + F11, ВставьтеЛист кода модуля с помощью Alt + I, M и вставьте этот код в недавно открытую область кода.Используйте новую пользовательскую функцию, как и любую другую стандартную функцию рабочего листа.

Option Explicit

Function maxUniqueWithThreshold(ids As Range, vals As Range, _
                                dates As Range, thold As Long)
    Static d As Object, i As Long

    'create a dictionary for unique ids only if not previously created
    If d Is Nothing Then Set d = CreateObject("scripting.dictionary")
    d.RemoveAll

    'limit the processing ranges
    Set ids = Intersect(ids, ids.Parent.UsedRange)
    Set vals = vals.Resize(ids.Rows.Count, ids.Columns.Count)
    Set dates = dates.Resize(ids.Rows.Count, ids.Columns.Count)

    'cycle through the processing ranges
    For i = 1 To ids.Cells.Count
        'is date within threshold?
        If dates.Cells(i) <= thold Then
            'collect the maximum value for each unique id into dictionary Items
            d.Item(ids.Cells(i).Value2) = _
              Application.Max(d.Item(ids.Cells(i).Value2), vals.Cells(i).Value2)
        End If
    Next i

    maxUniqueWithThreshold = Application.Sum(d.items)

End Function

Обратите внимание, что UDF используется на рабочем листе в G2, как и любая другая стандартная функция рабочего листа.

enter image description here

0 голосов
/ 04 декабря 2018

Шаг 1) Создайте уникальный список идентификаторов

Создайте список уникальных идентификаторов.Есть формулы, которые могут сделать это для вас, или вы можете их напечатать.Допустим, для вашего примера вы пишете идентификаторы в F2: F3

Шаг 2) Вырезание даты

Поместите отсечение даты в ячейку, скажем, E2.

Шаг3) Найти MAX

Я считаю, что в 2016 году есть функция MAXIF.Используйте это, чтобы получить максимум на основе уникального идентификатора и <= дата отключения.MAXIF - лучшая формула для использования, но, к сожалению, у меня нет к ней доступа, и я не могу провести вас через нее больше, чем описано здесь.Если у вас нет 2016 года или нет доступа к MAXIF, вы можете использовать агрегат.Агрегат может быть функцией, которая выполняет операции, подобные массиву.В результате не используйте полные ссылки на столбцы в пределах своей функции, иначе будет произведено избыточное вычисление, которое затормозит ваши системы или еще хуже. </p>

=AGGREGATE(14,6,$B$2:$B$5/(($A$2:$A$5=$F2)*($C$2:$C$5<=$E$2)),1)

Поместите эту формулу в G2 и скопируйте рядом с каждым уникальным идентификатором.Затем он предоставит максимальное значение для этой даты до или равное дате отсечения.

Шаг 4) Суммирование максимумов

В неиспользованном столбце суммируйте результаты предыдущей формулы

=SUM(G2:G3)

Предполагается, что ваша первая таблица - это столбцы A: C.Предполагается также, что ваши даты в формате последовательной даты Excel, а не в виде строки, маскирующейся под дату Excel.Вы можете проверить позже с =ISNUMBER(A1), где A1 - это ячейка с датой.Значение false указывает, что это строка и ее необходимо преобразовать.Отрегулируйте диапазоны в соответствии с вашими данными.

...