У меня есть отчет о распределении проекта и ресурсов. Мне нужна помощь в создании формулы для отображения сводки в правой части отчета.
Вот характеристики моего отчета:
- Столбец A со строки 2 по строку 15 представляет собой ресурсы (людей), выделенные для каждого проекта.
- Столбец B, столбец C.... представляет собой процент ресурсов, выделенных на каждый проект в месяц.
- Каждый ресурс столбца A объединен в 2 ячейки, поскольку каждый ресурс может работать либо в 1, либо в 2 проектах в месяц.
- Ресурс, работающий над одним проектом в месяц, будет иметь обе ячейки, объединенные. Ресурс, работающий над 2 проектами, будет иметь 2 строки, представляющие проект
- Напротив каждого проекта указано число, представляющее процент ресурсов, выделенных на проект.
Вот скриншот моего отчета:
Здесь, в сводке, я представляю общее количество недель, которое каждый человек потратит на каждый проект. Чтобы упростить расчет, я предполагаю, что каждый месяц эквивалентен ровно 4 неделям. Итак,
- Если человек А работает на 100% в проекте Б в феврале. Тогда число, которое следует учитывать для подведения итогов, должно быть 4 для проекта Б.
- Аналогично, если человек А работает 50-50% над 2 проектами в январе. Тогда число, которое следует учитывать для суммирования, должно быть 2-2 недели для каждого проекта
В общем случае число, которое следует рассматривать в обобщенном виде, можно математически представить следующим образом:
4 *[Percentage from column] / 100
Вот чего я пытаюсь добиться:
- Прочитать строку из ячеек (F1 - J1)
- Выполните поиск в столбце person в двух строках (B2, C2... ) и (B3, C3...), чтобы получить ячейки, начинающиеся со строки project.
- Отфильтруйте числа из ячеек выше (из шага 2). Сложите числа, разделите на 100 и умножьте на 4 (чтобы получить количество недель).
Вот что я создал, взяв за основу ответ на аналогичный вопрос изздесь:
=IFERROR((IFERROR(SUM(--((TRIM(RIGHT(SUBSTITUTE(FILTER($B2:$C2,ISNUMBER(SEARCH(J$1,$B2:$C2)))," ",REPT(" ",99)),99))))), 0) + IFERROR(SUM(--((TRIM(RIGHT(SUBSTITUTE(FILTER($B3:$C3,ISNUMBER(SEARCH(J$1,$B3:$C3)))," ",REPT(" ",99)),99))))), 0))*4, "")
что дает мне 6 для проекта B. Есть ли способ упростить это? Я думаю, что я делаю много избыточных операций здесь. Кроме того, он возвращает 0, если проект не найден. Я предпочитаю пустую строку вместо него
Не стесняйтесь предлагать лучшие способы выполнения этого расчета.
Примечание:
- Для столбца с двумя объединенными ячейками расчет следует выполнять только один раз для данного человека.
- Расчет моего резюме основан на данных из двух строк
- Здесь я использую строки имен людей («Person A», «Person B» и т. д.) и названий проектов («Project A», «Project B» и т. д.) просто как текст-заполнитель. В реальном отчете они переходят в реальные значения со случайными алфавитами.
PS: Это похоже на мой предыдущий вопрос, где я создавал сводку по одному столбцу, где две ячейки внутри столбца можно было объединить:Excel — фильтрация строк по начальной строке, считывание чисел из отфильтрованных строк и выполнение арифметических операций для формирования сводки по столбцам.. Однако здесь я выполняю расчет по двум строкам, чтобы получить сводку. И объединенные ячейки строк нужно учитывать только один раз для расчета.
решение1
Может быть, стоит попробовать это более короткое предложение формулы.
1] В F2
формуле, скопированной по горизонтали и вертикали:
=SUMPRODUCT(4*TEXT(SUBSTITUTE($B2:$C3,F$1,""),"0%;;;\0"))
2] Ваш предыдущий вопрос также можно решить с помощью этой же формулы, я поместил ее в A19:C23.
В B19
, формула скопирована по горизонтали и по вертикали:
=SUMPRODUCT(0+TEXT(SUBSTITUTE(B$2:B$15,$A19,""),"0%;;;\0"))
И,
Редактировать
Удалить 0
1] Использование формата ячейки:
Все ячейки с формулами форматируются в >> «Учет» >> «Символ», выберите «Нет» >> «Десятичный знак»: нажмите «1»
2] Используя ЕСЛИОШИБКА(1(/1.......),"") добавляем к формуле F2 и получаем >>
=IFERROR(1/(1/SUMPRODUCT(4*TEXT(SUBSTITUTE($B2:$C3,F$1,""),"0%;;;\0"))),"")
решение2
Решение более сложное, поскольку диапазон обработки многомерен. (В вашем предыдущем вопросе речь шла только об одном измерении).
Один из способов обработки — превратить его в одномерный массив, что можно сделать с помощью TEXTJOIN
и FILTERXML
. Существует ограничение, заключающееся в том, что строка, полученная в результате TEXTJOIN
функции, не может превышать 32,767
символов. Если это будет проблемой, то решение VBA или Power Query может быть лучше.
Кроме того, FILTERXML
недоступно в версиях для Mac и в Excel Online.
Если эти ограничения не применяются, то
F2: =IFERROR(4*SUM(FILTERXML("<t><s>" & SUBSTITUTE(FILTERXML("<t><s>" &TEXTJOIN("</s><s>",TRUE,$B2:$C3) & "</s></t>","//s[starts-with(.,'" & F$1 & "')]")," ","</s><s>") & "</s></t>","//s[last()]")),"")
Заполнить справа и снизу
Сначала мы создаем
XML
(используяTEXTJOIN
) отдельный узел для каждой ячейки- наш
xPath
аргумент возвращает только те узлы,start-with
имя которых указано в строке 1. - Затем мы используем
SUBSTITUTE
для создания другого узлаXML
на основе узлов, разделенных пробелом, с помощью ,xPath
который возвращает последний узел. - Выполните математические действия.
- наш
РЕДАКТИРОВАТЬ:
Если ты это сделаешьНЕТесть FILTERXML
функция, попробуйте эту формулу(O365 Mac или Windows и Excel Online)который использует другой метод преобразования двумерного массива в одномерный массив для обработки:
=IFERROR(SUM(4*TRIM(RIGHT(
SUBSTITUTE(LET(
seq,IF(SEQUENCE(99)=1,1,(SEQUENCE(99)-1)*99),
x,TRIM(MID(TEXTJOIN(REPT(" ",99),TRUE,$B2:$C3),seq,99)),
y, FILTER(x,LEFT(x,LEN(F$1))=F$1),y),
" ",REPT(" ",99)),99))),"")
Эта формула все еще имеет ограничение в 32 767 символов. Столкнетесь ли вы с этим, будет зависеть в основном от того, сколько пробелов в названии проекта. Формула для вычисления примерно такая:
а = среднее количество символов в ячейке
b = количество пробелов в ячейке
с = количество ячеек
(a+b*99) * c
Если бы у вас были, например, 15
символы, 5
пробелы и 24
ячейки, то это составило бы около 12,000
символов.