ОБНОВЛЕНИЕ ОТВЕТА :

Я неправильно понял работу MATCH и LOOKUP; они явно не выбирают последнее значение автоматически.

Обновленная формула выглядит следующим образом:

=IF(
    ISNUMBER( MATCH(2,INDEX(1/($D2=$D$1:$D1),0)) ), 
    ($A2+$B2) - (LOOKUP(2,1/($D2=$D$1:$D1),$A$1:$A1)+LOOKUP(2,1/($D2=$D$1:$D1),$B$1:$B1))
    ,0 )

Основные отличия заключаются в том, что MATCH теперь MATCH(2,INDEX(1/($D2=$D$1:$D1),0)), а LOOKUP теперь LOOKUP(2,1/($D2=$D$1:$D1),$A$1:$A1).

Спасибо Барри Гудини и Нанаши за их помощь!


Я работаю над тем, что должно было быть простой таблицей, но одна из моих формул дает мне неожиданные результаты. Снимок экрана с моими данными можно увидеть ниже:

! [Скриншот таблицы] [1]

В столбце C я пытаюсь получить разницу во времени между предыдущей точкой данных того же типа и текущей точкой данных. Моя формула (отформатированная для облегчения чтения и взятая в ячейке C11) выглядит следующим образом:

=IF(
    NOT( ISNA( MATCH($D11,$D$1:$D10,1) ) ),
    ($A11+$B11)-(
        LOOKUP($D11,$D$1:$D10,$A$1:$A10)+LOOKUP($D11,$D$1:$D10,$B$1:$B10)
    ),FALSE)

Нумерация ячеек изменяется для соответствующей ячейки - например, C10 ссылается на $ D10, а диапазон $ D $ 1: $ D9 и т. Д.

  • Условное выражение (NOT( ISNA( MATCH($D11,$D$1:$D10,1) ) ) проверяет, есть ли в столбце C предыдущее значение, равное текущему; в противном случае оно возвращает FALSE, как в строках 1 и 12.
  • Вычисление ($A11+$B11)-(LOOKUP($D11,$D$1:$D10,$A$1:$A10)+LOOKUP($D11,$D$1:$D10,$B$1:$B10) берет дату и время текущей строки и вычитает дату и время в строке, соответствующей предыдущему экземпляру того же типа (предполагается, что функция LOOKUP возвращает последнее вхождение значения в массиве, согласно документации).

Моя проблема заключается в следующем: после строки 12 все функции MATCH и LOOKUP принимают строку 11 как последнюю строку, в которой столбец C имеет значение 1. I Я пробовал тестировать их по отдельности, и обе функции возвращают соответствующие значения из строки 11. Например, вставив следующую формулу в E16: =MATCH(1,$D$1:$D16,1) вернул 11, тогда как я ожидал, что значение будет равно 16.

Что я делаю не так?

3
Lee 26 Мар 2014 в 18:19
D11 относится к значению, которое в этой электронной таблице равно 1 — я ищу в диапазоне D1:D10 последнее значение, равное 1. Я не думаю, что это проблема, поскольку я регулярно использую подобные методы, и несоответствие все еще присутствует, если я явно поставлю 1 вместо D11.
 – 
Lee
26 Мар 2014 в 18:25
Да, это сильно заметил, поэтому мой комментарий не применим. Хм. Формально выглядит правильно. Попытаюсь воссоздать ваш набор данных с моей стороны. Является ли Type жестко запрограммированным или для этого есть метод?
 – 
WitchGod
26 Мар 2014 в 18:25
Каков ваш ожидаемый результат сейчас? Например, в C17 что должно отображаться?
 – 
WitchGod
26 Мар 2014 в 19:14

2 ответа

Лучший ответ

Ни MATCH, ни LOOKUP не найдут «последнее вхождение», как вам нужно, с несортированными данными. Попробуйте эти версии для последней строки / совпадения:

=MATCH(2,INDEX(1/($D11=$D$1:$D10),0))

=LOOKUP(2,1/($D11=$D$1:$D10),$B$1:$B10)

.... для вашего конкретного требования вы можете получить дату и время в одном LOOKUP, например

=$A11+$B11-LOOKUP(2,1/($D11=$D$1:$D10),$A$1:$A10+$B$1:$B10)

Который явно использует даты в столбце A - если у вас есть данные за каждый день, поэтому вы всегда можете предположить, что день меняется на следующий день, тогда вы можете не указывать ссылки на даты и использовать MOD вот так:

=MOD($B11-LOOKUP(2,1/($D11=$D$1:$D10),$B$1:$B10),1)

2
barry houdini 26 Мар 2014 в 19:16

Проблема здесь в том, что MATCH не запрограммирован на возврат индекса последнего совпадающего значения. Тем не менее, формула, которая дает нам это, решит проблему.

Введите следующую формулу в C2 и потяните вниз:

=MOD((B2)-INDEX(B:B,SUMPRODUCT(MAX(($D$1:$D1=D2)*ROW($D$1:$D1)))),1)

Вот что делает каждая часть в разобранном виде:

=SUMPRODUCT(MAX(($D$1:$D1=D2)*ROW($D$1:$D1))) 'Returns the row of the latest match.
=INDEX(B:B, SUMPRODUCT...) 'Returns the matching cell in Column B.
=MOD(B2 - INDEX(...),1) 'Gets the absolute difference, no need to add A and B.

Результат:

enter image description here

Сообщите нам, если это поможет.

РЕДАКТИРОВАТЬ: изменена формула согласно исправлению Барри.

3
WitchGod 26 Мар 2014 в 19:36
Это очень помогает - спасибо! Единственная проблема, которую я вижу, заключается в том, что расчеты дельты PM и AM неверны (я обновил изображение выше с некоторыми данными, которые я собрал сегодня утром) - я полагаю, что условное вычитание расчета из 1 будет работать; но я буду играть с ним.
 – 
Lee
26 Мар 2014 в 19:06
Пожалуйста, отметьте ответ как принятый, если вы нашли его полезным. Я думаю, что абсолютное значение будет вычислять его правильно, независимо от того, но в противном случае скорректируйте формулу. :)
 – 
WitchGod
26 Мар 2014 в 19:09
- см. мой ответ, который будет работать при переходе на следующий день
 – 
barry houdini
26 Мар 2014 в 19:17
Ах я вижу. В моем ответе перед редактированием я также дал ответ типа A1+B1, но вместо этого решил придерживаться ABS. Ну что ж.
 – 
WitchGod
26 Мар 2014 в 19:19
- хороший ответ! .... но ABS не работает, потому что, например. =ABS("3:00"-"22:00") дает 19:00, когда ответ должен быть 5:00 - вы можете получить это с помощью =MOD("3:00"-"22:00",1)
 – 
barry houdini
26 Мар 2014 в 19:33