Countif и ArrayFormula с несколькими уровнями - PullRequest
3 голосов
/ 03 июля 2019

У меня есть формула. Это работает - но кажется, что это можно сделать намного проще.

У меня много отделов в нескольких столбцах. В каждой строке есть элемент, который мы отслеживаем, и в каждом столбце есть текст состояния, который изменяется по мере выполнения нами работы.

'очередь' - она ​​находится в очереди, ожидая выполнения, и взвешивает среднее значение

'active' - выполняется и выдает половину значения от среднего значения

'done', 'ok'd', 'rcvd' - закончен и способствует получению среднего значения «нет» - обозначает отдел, который не выполняет эту работу и не должен учитываться в окончательном среднем.

Формула:

=iferror(((ArrayFormula(sum(countif(B3:O3,{"done","ok'd","rcvd"}))))+(countif(B3:O3,"active")/2))/(counta(B3:O3)-(countif(B3:O3,"none"))),)

Формула работает, но я смотрю, есть ли более простой способ приблизиться к ней. Будет ли лучше работать запрос или модификация массива в этом сценарии?

Что если я захочу добавить другие текстовые строки на основе синтаксиса для моего текущего приложения?

Вот ссылка на образец листа с контекстом.

https://docs.google.com/spreadsheets/d/1zPFAcSxM7tYjZmlATYde7qKsDoeH6AW_xjFooOZFOf4/edit#gid=0


EDIT:

В качестве дополнительного вопроса - как заставить одну и ту же вещь работать в столбцах?

Я провел обратный инжиниринг решения и вижу формулу, работающую в верхней части моего листа, но она дает мне ошибку:

"MMULT имеет несовместимые размеры матриц. Количество столбцов в первой матрице (13) должно равняться количеству строк во второй матрице (1)."

Вот формула, которую я добавил (она также есть в связанном листе).

=ARRAYFORMULA(IF(LEN(B4:N4), MMULT(IFERROR(( N(REGEXMATCH(B4:N9, "ok'd|done|ready|rcvd"))+ N(REGEXMATCH(B4:N9, "active"))/2)/MMULT(N(REGEXMATCH(B4:N9, "[^none]")),TRANSPOSE(ROW(B4:B9)^0)), 0), TRANSPOSE(ROW(B4:B9)^0)),))

Ответы [ 2 ]

1 голос
/ 09 июля 2019

В качестве дополнительного вопроса - как заставить одну и ту же вещь работать с колонками?

=ARRAYFORMULA(TRANSPOSE(IF(LEN(TRANSPOSE(B4:N4)), MMULT(IFERROR((
 N(REGEXMATCH(TRANSPOSE(B4:N16), "ok'd|done|ready|rcvd"))+
 N(REGEXMATCH(TRANSPOSE(B4:N16), "active"))/2)/MMULT( 
 N(REGEXMATCH(TRANSPOSE(B4:N16), "[^none]")), 
 (ROW(B4:B16)^0)), 0), 
 (ROW(B4:B16)^0)), )))

0

1 голос
/ 03 июля 2019
=ARRAYFORMULA(IF(LEN(B3:B9), MMULT(IFERROR((
 N(REGEXMATCH(B3:N9, "ok'd|done|ready|rcvd"))+
 N(REGEXMATCH(B3:N9, "active"))/2)/MMULT( 
 N(REGEXMATCH(B3:N9, "[^none]")), 
 TRANSPOSE(COLUMN(B3:N3)^0)), 0), 
 TRANSPOSE(COLUMN(B3:N3)^0)), ))

0

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