Любая отдельная формула рабочего листа потребует нескольких уровней циклического расчета, что усложнит формулу и, следовательно, потребует времени расчета.Один или несколько вспомогательных столбцов могут существенно уменьшить это.
Поместите это в 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)
).
Обратите внимание, что я добавил к вашим исходным образцам данных для более четкого подтверждения дополнительных критериев.
Определяемая пользователем функция, которая может упростить и ограничить необходимые шаги, может быть вашей лучшей ставкой.
Откройте 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, как и любая другая стандартная функция рабочего листа.