ОБНОВЛЕНИЕ ОТВЕТА :
Я неправильно понял работу 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.
Что я делаю не так?
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)
Проблема здесь в том, что 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.
Результат:
Сообщите нам, если это поможет.
РЕДАКТИРОВАТЬ: изменена формула согласно исправлению Барри.
A1+B1
, но вместо этого решил придерживаться ABS
. Ну что ж.
=ABS("3:00"-"22:00")
дает 19:00
, когда ответ должен быть 5:00
- вы можете получить это с помощью =MOD("3:00"-"22:00",1)
Похожие вопросы
Новые вопросы
excel
Только для вопросов по программированию объектов или файлов Excel или по разработке формул. Вы можете комбинировать тег Excel с тегами и вопросами VBA, VSTO, C#, VB.NET, PowerShell, OLE и другими тегами и вопросами, связанными с программированием, если это применимо. НЕ используйте с другим программным обеспечением для работы с электронными таблицами, например [google-sheets].
Type
жестко запрограммированным или для этого есть метод?