Эти энергонезависимые массивы формул основаны на подходе @OverflowStacker для определения Target Range
, они используют INDEX
вместо INDIRECT
:
В FormulaArrays вводятся нажатием CTRL + SHIFT + ENTER одновременно, при правильном вводе вы увидите формулу, заключенную между {
и }
.
Эта часть проверяет предоставленные даты:
=IF( Start > End, "!Err",
Это FormulaArray
, использованное для получения сложения часов согласно предоставленным Start
и End
разам:
= SUM(
INDEX( Column.End , MATCH( MIN( IF( Range.Dates >= Start, Range.Dates ) ), Column.Dates , 0 ) ) :
INDEX( Column.End , MATCH( MIN( IF( Range.Dates > End, Range.Dates ) ), Column.Dates , 0 ) - 1 ),
-INDEX( Column.Start , MATCH( MIN( IF( Range.Dates >= Start, Range.Dates ) ), Column.Dates , 0 ) ) :
INDEX( Column.Start , MATCH( MIN( IF( Range.Dates > End, Range.Dates ) ), Column.Dates , 0 ) - 1 ) ) )
Время Start
, End
и Total
может быть представлено как TimeSerial
или Double
(например, 12:30 AM
или 0.5
соответственно)
Эта таблица показывает формулу, которая будет использоваться в зависимости от требуемого формата времени:
Применение формул:
- Таблица 1 показывает время как
TimeSerial
a.Всего как TimeSerial
: введите это ArrayFormula
в I7
, затем скопируйте вниз (формат числа ячеек [hh]:mm
)
= IF( $G7 > $H7, "!Err", SUM(
INDEX($E:$E, MATCH( MIN( IF( $C$7:$C$27 >= $G7, $C$7:$C$27 ) ),$C:$C, 0 ) ) :
INDEX($E:$E, MATCH( MIN( IF( $C$7:$C$27 > $H7, $C$7:$C$27 ) ),$C:$C, 0 ) - 1 ),
- INDEX($D:$D, MATCH( MIN( IF( $C$7:$C$27 >= $G7, $C$7:$C$27 ) ),$C:$C, 0 ) ) :
INDEX($D:$D, MATCH( MIN( IF( $C$7:$C$27 > $H7, $C$7:$C$27 ) ),$C:$C, 0 ) - 1 ) ) )
b.Итого как Double
: введите ArrayFormula
в J7
, затем скопируйте вниз (формат числа ячеек 0.?? "Hrs."
)
= IF( $G7 > $H7, "!Err", 24 * SUM(
INDEX($E:$E, MATCH( MIN( IF( $C$7:$C$27 >= $G7, $C$7:$C$27 ) ),$C:$C, 0 ) ) :
INDEX($E:$E, MATCH( MIN( IF( $C$7:$C$27 > $H7, $C$7:$C$27 ) ),$C:$C, 0 ) - 1 ),
- INDEX($D:$D, MATCH( MIN( IF( $C$7:$C$27 >= $G7, $C$7:$C$27 ) ),$C:$C, 0 ) ) :
INDEX($D:$D, MATCH( MIN( IF( $C$7:$C$27 > $H7, $C$7:$C$27 ) ),$C:$C, 0 ) - 1 ) ) )
Таблица 1 показывает время как
Double
a.Всего как Double
: введите это ArrayFormula
в S7
, затем скопируйте вниз (формат числа ячеек 0.?? "Hrs."
)
= IF( $Q7 > $R7, "!Err", SUM(
INDEX($O:$O, MATCH( MIN( IF( $M$7:$M$27 >= $Q7, $M$7:$M$27 ) ),$M:$M, 0 ) ) :
INDEX($O:$O, MATCH( MIN( IF( $M$7:$M$27 > $R7, $M$7:$M$27 ) ),$M:$M, 0 ) - 1 ),
- INDEX($N:$N, MATCH( MIN( IF( $M$7:$M$27 >= $Q7, $M$7:$M$27 ) ),$M:$M, 0 ) ) :
INDEX($N:$N, MATCH( MIN( IF( $M$7:$M$27 > $R7, $M$7:$M$27 ) ),$M:$M, 0 ) - 1 ) ) )
b.Всего как TimeSerial
: введите это ArrayFormula
в T7
, затем скопируйте вниз (формат числа ячеек [hh]:mm
)
= IF( $Q7 > $R7, "!Err", 1/24 * SUM(
INDEX($O:$O, MATCH( MIN( IF( $M$7:$M$27 >= $Q7, $M$7:$M$27 ) ),$M:$M, 0 ) ) :
INDEX($O:$O, MATCH( MIN( IF( $M$7:$M$27 > $R7, $M$7:$M$27 ) ),$M:$M, 0 ) - 1 ),
- INDEX($N:$N, MATCH( MIN( IF( $M$7:$M$27 >= $Q7, $M$7:$M$27 ) ),$M:$M, 0 ) ) :
INDEX($N:$N, MATCH( MIN( IF( $M$7:$M$27 > $R7, $M$7:$M$27 ) ),$M:$M, 0 ) - 1 ) ) )