Сумма часов с момента ввода нуля - PullRequest
0 голосов
/ 03 октября 2019

Я написал код для «Всего часов за последние семь дней» - работает нормально. В столбце «Всего часов с тех пор, как« 0 »введено» я хочу, чтобы формула была сброшена и суммировалась от «0» до следующих 7 днейили до тех пор, пока не будет введен следующий «0».

Col A = дата Col B = ячейка часов C5 = общее количество часов за последние семь дней ячейка D5 = общее количество часов с момента ввода «0»

enter image description here

Мой ожидаемый результат для ячейки D5 = 32

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

Вот формулы, которые будут работать с 2010 и более поздними версиями:

Последние 7:

=SUM(INDEX(B:B,MATCH(1E+99,B:B)):INDEX(B:B,MATCH(1E+99,B:B)-6))

Последняя с момента 0:

=SUM(INDEX(B:B,MATCH(1E+99,B:B)):INDEX(B:B,AGGREGATE(14,7,ROW(B5:B22)/((B5:B22=0)*(B5:B22<>"")),1)))

enter image description here

0 голосов
/ 03 октября 2019

Я бы использовал комбинацию SUMIFS и MAXIFS.

Для расчета за последние семь дней я бы использовал:

=SUMIFS( $B$5:$B$22, 
         $A$5:$A$22, "<=" & MAXIFS($A$5:$A$22, $B$5:$B$22,"<>"),
         $A$5:$A$22, ">"  & MAXIFS($A$5:$A$22, $B$5:$B$22,"<>")-7
       )

Это сумма всех часов, в которых указана дата<последняя дата, в которой столбец часов не пуст И дата> этой даты-7.

Формула для расчета последних 7 дней ИЛИ до первых 0, в зависимости от того, что наступит раньше, очень похожа,Все, что мы делаем, это сравниваем дату-7 с самой последней датой с 0 часами и выбираем самую последнюю из двух с МАКС.:

=SUMIFS($B$5:$B$22,
        $A$5:$A$22, "<=" & MAXIFS( $A$5:$A$22, $B$5:$B$22, "<>"),
        $A$5:$A$22, ">"  & MAX( MAXIFS( $A$5:$A$22, $B$5:$B$22, "<>")-7, 
                                MAXIFS( $A$5:$A$22, $B$5:$B$22, 0)
                              )
       )

РЕДАКТИРОВАТЬ: Формулы для более старых версий Excel без SUMIFS

Расчет последних семи дней был довольно простым. Просто используйте INDEX с простым COUNT, чтобы узнать, сколько клеток Hrs было завершено. это дает использовать индекс «финиша». Затем мы можем получить минус 6 из этого числа, чтобы получить «начальный индекс». И обернуть INDEX s в SUM:

=SUM(
    INDEX($B$5:$B$22,COUNT($B$5:$B$22))
    :
    INDEX($B$5:$B$22,COUNT($B$5:$B$22)-6)
)

Введенная формула с «0» гораздо сложнее:

=SUM(
    INDEX($B$5:$B$22,COUNT($B$5:$B$22))
    :
    INDEX($B$5:$B$22, 
        MAX(
            COUNT($B$5:$B$22)-6, 
            MATCH(
                AGGREGATE(14,6,$A$5:$A$22/($B$5:$B$22&""="0"),1),
                $A$5:$A$22 ,
                0
            )
        )
    )
)

Это работает аналогично - суммируя диапазон, определенный двумя INDEX с. Индекс "финиша" также находится точно таким же образом.

Индекс "start" можно найти, взяв либо последние 7 дней (как в предыдущей формуле), либо максимальную дату, когда часы равны нулю. Что когда-либо больше. Это делается с помощью MAX.

Самая сложная часть - это найти максимальную дату, которая имеет ноль часов, но также не является пустой. Нам также необходимо учесть возможность появления нескольких нулей за последние 7 дней.

Это можно сделать с помощьюAGGREGATE чтобы найти дату. Затем с помощью Match превратить это в нужный нам индекс.

Единственный способ заставить агрегат работать (и не включать пустые ячейки в ноль), это повернутьчасы варьируются в тексте, а затем сравнить это тo текст «0»:

$B$5:$B$22&""="0"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...