В Excel Суммируйте иерархические данные, основанные на существовании подданных

469
Sir Robert

У меня есть ряд таких строк, которые отображают некоторые иерархические данные.

 A | B | C | D | E | F   1 Task | | 1 | | 2 |  2 Task | | 1 | | 2 |  3 Task | | | | 8 |  4 | Subtask | | 2 | | 4  5 | Subtask | | 2 | | 4  6 Task | | 1 | | 2 |  7 Task | | 1 | | 2 |  

Столбцы A и B - это задачи и подзадачи, столбцы C и D - входные данные, соответствующие каждой задаче / подзадаче. Столбцы E и F являются столбцами преобразований C & D (здесь они просто дублируются).

Обратите внимание, что C3 пусто, потому что задаче не присваивается значение напрямую; скорее это сумма подзадач. Соответственно, E3 = SUM (F4: F5).

В настоящее время я делаю это вручную. Я хотел бы функцию, которая будет делать что-то вроде следующего псевдокода:

IF( NOT(C3=""), C3, SUM_UNTIL(E:E,NOT(""),F:F) ) 

Таким образом, ячейка E3 будет:

  • используйте значение в C3, если C3 не пустое.
  • Если C3 пусто, SUM () ячейки в F4: F для любого количества смежных пустых ячеек в C.

Я очень хорошо очень хорошо в Excel. Кроме того, я программист, но я совсем не знаю VB (парень с Linux), поэтому я был бы счастлив с решением VB. Я свободно владею JavaScript, и это тоже сработало бы, если есть какой-нибудь плагин javascript для excel).

Я пользуюсь последней версией Excel (может быть, 2016? Той, что в последней редакции офиса).

0

1 ответ на вопрос

1
Vylix

Это может быть не самая эффективная формула, но это работает

=IF(AND(ISBLANK(B3); ISBLANK(C3)); SUM(INDIRECT("F"&ROW()+1&": F"&MATCH(TRUE; INDEX($B4:$B$16=""; 0); 0)+ROW()-1)); C3*2) 

объяснение

AND(ISBLANK(B3); ISBLANK(C3));определяет, когда начинать формулу суммы. Это требует, чтобы и ячейка, B3и C3была пустой (если вы используете только C3, то C4и C5также вызовет формулу суммы, вместо того, чтобы удваивать их значение)

INDIRECT( ... ) образует диапазон, который будет использоваться в SUM

"F"&ROW()+1&":диапазон начинается Fс текущей строки и ниже (в этом примере F4)

F"&MATCH(TRUE; INDEX($B4:$B$16=""; 0); 0)+ROW())и заканчивается Fстрокой в ​​следующей пустой ячейке столбцаB

Примечание: пожалуйста, помните, что диапазон начинается и заканчивается на одну строку ниже текущей строки. Также обратите внимание на положение абсолютных знаков ( $ )


Дальнейшее объяснениеMATCH(TRUE; INDEX($B4:$B$16=""; 0); 0)+ROW()-1 я нашел формулу здесь

Во- первых, INDEX($B4:$B$16=""; 0)создает массив ли B4 = ""и B5 = ""так далее. Вы можете увидеть этот массив, помещая формулу в строке 1 на любой колонке, и изменить 0к ROW()-1и перетащить формулу вниз.

FALSE FALSE FALSE TRUE and so on... 

Затем MATCH(TRUE; ... ; 0)найдем первую TRUE, то есть первую следующую пустую строку после этой строки (возвращая индекс 3 )

Тем не менее, результатом является индекс массива 3, а не номер строки . Таким образом, мы добавляем индекс с текущей строкой, 3 + 3 и вуаля! У нас есть номер следующей пустой строки. Просто добавьте, -1чтобы убедиться, что мы суммируем правильный диапазон F4:F5, а не F4:F6.

Спасибо! Это сработало очень хорошо. Для тех, кто считает это полезным: важно помнить, что часть INDIRECT ("F" & ROW () + 1 ": F" ... не будет перетаскиваться по горизонтали ("F" необходимо изменять вручную каждый раз, когда вы изменить строки). Sir Robert 6 лет назад 0

Похожие вопросы