Выберите последнюю запись по дате и введите в Excel

0

У меня есть данные, которые мне крайне необходимо проанализировать, и я не знаю, как поступить. Данные в трех столбцах; первая дата. Даты не в порядке (по разным причинам), и новые данные просто добавляются в конец списка. У меня также есть продажная цена продукта во втором столбце и тип продукта в третьем. Например:

пример данных

Расчеты должны основываться на семи самых последних ценах любого типа. 3-я самая низкая цена и 2-я самая высокая цена входят в таблицу, начиная с ячеек «A» ( F12) и «B» ( G12), соответственно.

Третья формула должна исключать (игнорировать) самую высокую и самую низкую из семи самых последних цен и вычислять среднее из оставшихся пяти цен. Это идет в последнем столбце таблицы, начиная с ячейки «C» ( H12).

Затем мне нужен комбинированный гистограмма с «типом» на горизонтальной оси и «ценой» на вертикальной. Мне нужна столбчатая диаграмма с накоплением, показывающая нижний диапазон (ячейка «A») и более высокий диапазон (ячейка «B»), а линейный график должен быть наложен на средние значения (ячейка «C»).

Я не мастер Excel, и я попробовал все учебные пособия по самопомощи, которые я могу решить. Я дошел до мысли, что это VLOOKUPможет быть полезно, но сейчас я в растерянности.

Ли Робертс
источник
Спасибо за корректирующую помощь Bandersnatch и Скотт
Ли Робертс
Да, спасибо, Скотт. :-) Ли, эта проблема довольно сложна по нескольким причинам. Одна проблема заключается в том, что 7 последних дат для данного типа могут иметь более 7 продаж. Я сделаю еще одну попытку завтра.
Bandersnatch
Это звучит достаточно сложно, так что я думаю, что вам придется использовать функцию
Ross
(1) Мне кажется, что тот факт, что у вас есть несколько записей в день для каждого типа (например, строки 8 и 10 являются 1-Jun-17, тип 7), делает это абсолютно неразрешимым (даже вручную!), Потому что Концепция «семи самых последних» записей любого типа не определена. (2) Вам решать, но, если вы решите проблему № 1, считаете ли вы, что линейный график действительно имеет смысл, когда одна ось (горизонтальная или ось X) является типом?
Скотт
1
@ Скотт, да, я сделал, и я благодарю тебя. Я был прерван до того, как закончил, но это не оправдание, и я обещаю позаботиться в будущем.
Bandersnatch

Ответы:

0

Хорошо, ограничение в отношении нескольких продаж одного и того же типа в данный день, о котором говорил Скотт, сделало это возможным. Но это все еще довольно сложно. Использование 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}),""))

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

Любые комментарии или предложения приветствуются.

Bandersnatch
источник
Вау! не понял, что это было так сложно! действительно ценю время и усилия, которые вы вложили в это, чтобы выручить меня. Я поработаю над этим утром и дам знать, как я ухожу.
Ли Робертс
Привет еще раз. У меня было время, чтобы пройти через это сейчас, и это работает очень хорошо. Большое спасибо за очень четкий ответ. У меня есть один вопрос; как вы изменяете формулы для столбца бесконечной длины? Таким образом, в случае столбца A вместо A2: A55 это будет A2: Ax. Таким образом, я могу добавить неопределенное количество данных без необходимости переопределять размер столбца.
Ли Робертс
Попробуйте изменить ссылки на столбцы на $ A: $ A или эквивалент для B и C. Не совсем уверен, что произойдет, но дайте мне знать. Кроме того, если вы нашли это полезным, примите ответ.
Bandersnatch
Не берите в голову, я попробовал это, и это не работало. Позвольте мне взглянуть на это снова завтра.
Bandersnatch
Из-за строки заголовка все диапазоны должны начинаться со строки 2. Но вы можете сделать их все произвольно большими, например $A2:$A5000, и т. Д.
Bandersnatch