Excel проблема с суммой, если формула и ее диапазон - PullRequest
1 голос
/ 22 апреля 2019

У меня есть эта настройка в моей рабочей таблице:

  A        B     C           D          E        F
1 11-apr   1pm   2pm         START      END      TOTAL
2          2pm   3pm         11-apr     14-apr   8,50 h
3          6pm   7pm         15-apr     25-apr   ....
4          7pm   8pm
5 14-apr   10am  11am
6          12am  12:30am
7          2pm   3pm
8          3pm   5pm
9 15-apr   1pm   3pm
10         6pm   7pm
...

и мне нужно сделать следующее:

Суммируйте, сколько часов тратится в день между 11 апреля и 14 апреля, принимая D2 и E2 в качестве начальной и конечной точки, и запишите общее количество в F2. Я не могу изменить свой лист и предпочитаю не создавать скрытую ячейку для ссылки на значение, так как не хочу связываться с листами Excel.

Что мне нужно, так это то, что, поскольку у меня есть несколько навыков программирования, выполните цикл for между ячейками A: A и начните со строки, где указано «11 апреля» (в данном случае A1), и спускайтесь вниз до Я нашел «14 апреля» и остановился перед следующим днем ​​ячейки (так на A8). Я предпочитаю также не делать макрос, потому что он должен быть динамичным в отношении столбцов D и E. Даты в А случайны, поэтому нет способа предоставить следующий день.

Я спрашиваю вас, возможно ли это в одной формуле в ячейке F2.

Что я сделал, так это исх. строки «11 апреля» и «14 апреля», затем в формуле массива найдите, какие ячейки не пусты (например, INT(A:A<>"")), и с этим возвращенным массивом я хочу сделать сумму от строки «11 апреля» до следующая-непустая-cell-after- "14-apr" -row минус 1 (до "15-apr" row - 1), то есть следующее не 0 (не FALSE) значение в массиве ПОСЛЕ строки "14-apr" «минус 1. Я объединил много формул с MATCH, INDEX, LARGE для получения n-го элемента, но без толку.

Надеюсь, я был достаточно ясен, заранее спасибо!

P.S. Я нахожусь на Excel для Mac, если это полезно знать!

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Эти энергонезависимые массивы формул основаны на подходе @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 соответственно)

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

enter image description here

Применение формул:

  1. Таблица 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 ) ) )  

enter image description here

2 голосов
/ 23 апреля 2019

Ну, немного решения было бы ARRAY FORMULA CTRL + SHIFT + ENTER

    =SUMPRODUCT(INDIRECT("C"&MATCH(MIN(IF($A$1:$A$12>E4,$A$1:$A$12)),A:A,0)-1&":C"&MATCH(MIN(IF($A$1:$A$12>=D4,$A$1:$A$12)),A:A,0))-INDIRECT("B"&MATCH(MIN(IF($A$1:$A$12>E4,$A$1:$A$12)),A:A,0)-1&":B"&MATCH(MIN(IF($A$1:$A$12>=D4,$A$1:$A$12)),A:A,0)))

, но он использует INDIRECT, который может быть довольно медленным на больших базах данных.Зеленая ячейка содержит формулу.

enter image description here

Я добавил дату раньше.Вы также можете ввести даты, которых нет в таблице.

Я пропустил am и pm, но если ячейки правильно отформатированы как даты, проблем не должно быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...