Хорошо, ограничение в отношении нескольких продаж одного и того же типа в данный день, о котором говорил Скотт, сделало это возможным. Но это все еще довольно сложно. Использование VBA может быть намного проще, и, возможно, кто-то здесь опубликует процедуру.
Я собираюсь начать с использования таблицы «помощник», потому что полезно видеть промежуточные данные и дважды проверять, что все рассчитывается правильно, но я также покажу формулы, которые не используют таблицу помощника. Таблица помощников показана ниже вместе с результатами.
Я использовал случайные цены и даты, но соблюдали вышеупомянутое ограничение для нескольких продаж данного типа за дату. Теперь давайте создадим формулу, которая идет в F2.
Во-первых, нам нужен массив из семи самых последних цен для каждого типа. Как только это станет доступно, легко рассчитать три показателя в таблице результатов из этого массива.
Мы начинаем с этим выражением: ($C$2:$C$55=ROW()-1)
. Это часть формулы в F2, поэтому ROW()-1
равно 1, и это выражение дает массив значений True / False, причем True везде, где Type равен 1, и False везде. По мере того, как он заполнен, ROW()
увеличивается, в следующей строке он дает массив с True, где Type равен 2 и т. Д.
Теперь мы умножаем этот массив колонки дат: ($A$2:$A$55)*($C$2:$C$55=ROW()-1)
. Это дает массив, содержащий дату, где Type равен 1, и False везде.
Теперь нам нужны самые последние 7 из этих дат, и мы получаем те, которые используют LARGE()
функцию. Из-за вышеуказанного ограничения (на каждую дату есть только одна продажа типа 1), это дает даты 7 самых последних продаж типа 1:
LARGE(($A$2:$A$55)*($C$2:$C$55=ROW()-1),{1,2,3,4,5,6,7})
Ряд чисел в фигурных скобках говорит LARGE()
о том, что нужно возвращать значения с 1-го по 7-е по величине.
Теперь мы используем, IF()
чтобы получить цены, соответствующие этим датам:
IF($A$2:$A$55=LARGE(($A$2:$A$55)*($C$2:$C$55=ROW()-1),{1,2,3,4,5,6,7})*($C$2:$C$55=ROW()-1),$B$2:$B$55)
Первая часть IF()
логического теста возвращает массив, где дата в столбце A является одной из 7 дат выше, и этот массив умножается на массив, где type = 1 снова, потому что другие типы были проданы в эти 7 дат. Таким образом, IF()
проверяется, равна ли дата в столбце A одному из массива из 7 самых последних дат, и была ли конкретная продажа в эту дату для Типа = 1. Если оба эти условия выполняются, IF()
возвращается цена продажи из столбца B, и ложь в противном случае.
Теперь, чтобы перечислить цены в таблице помощников от высокой к низкой, мы используем LARGE()
:
(LARGE(IF($A$2:$A$55=LARGE(($A$2:$A$55)*($C$2:$C$55=ROW()-1),{1,2,3,4,5,6,7})*($C$2:$C$55=ROW()-1),$B$2:$B$55),COLUMN()-5)
Эта формула находится в столбце F, поэтому COLUMN()-5
равна 1, и формула возвращает первое по величине значение массива в этом столбце. По мере того, как он заполняется, COLUMN()
увеличивается, в следующем столбце он дает второе по величине значение и т. Д.
Наконец, формула упакована IFERROR()
так, что она будет возвращать пустое место, где имеется менее 7 продаж данного типа. Окончательная формула:
=IFERROR(LARGE(IF($A$2:$A$55=LARGE(($A$2:$A$55)*($C$2:$C$55=ROW()-1),{1,2,3,4,5,6,7})*($C$2:$C$55=ROW()-1),$B$2:$B$55),COLUMN()-5),"")
вводится в F2. Поскольку это формула массива, ее нужно вводить с помощью CTRLShiftEnter, а не просто Enter. Если введено правильно, Excel окружит формулу фигурными скобками {} в строке формул. После ввода выберите F2 и заполните формулу вниз, а затем поперек, чтобы получить таблицу помощников выше.
Теперь легко заполнить таблицу результатов. Эти две формулы
=SMALL(F2:L2,3) and
=LARGE(F2:L2,2)
вычислите 3-е наименьшее и 2-е наибольшие значения в первой строке вспомогательной таблицы. И эта формула
=AVERAGE(IFERROR(LARGE(F2:L2,{2,3,4,5,6}),""))
вычисляет среднее из средних 5 значений. Это также формула массива, поэтому она должна быть введена, как указано выше. Заполнение этих формул приводит к таблице результатов.
Чтобы заполнить таблицу результатов без использования вспомогательной таблицы, используйте эти три формулы массива в F, G и H12 и заполните:
=SMALL(IFERROR(LARGE(IF($A$2:$A$55=LARGE(($A$2:$A$55)*($C$2:$C$55=ROW()-11),{1,2,3,4,5,6,7})*($C$2:$C$55=ROW()-11),$B$2:$B$55),{1,2,3,4,5,6,7}),""),3)
=LARGE(IFERROR(LARGE(IF($A$2:$A$55=LARGE(($A$2:$A$55)*($C$2:$C$55=ROW()-11),{1,2,3,4,5,6,7})*($C$2:$C$55=ROW()-11),$B$2:$B$55),{1,2,3,4,5,6,7}),""),2)
=AVERAGE(IFERROR(LARGE(IFERROR(LARGE(IF($A$2:$A$55=LARGE(($A$2:$A$55)*($C$2:$C$55=ROW()-11),{1,2,3,4,5,6,7})*($C$2:$C$55=ROW()-11),$B$2:$B$55),{1,2,3,4,5,6,7}),""),{2,3,4,5,6}),""))
Я надеюсь, что это поможет вам, и я уверен, что вы можете получить график, который вы хотите, как только у вас есть эти данные.
Любые комментарии или предложения приветствуются.