Это довольно сложно, но:

{=COUNTA(INDIRECT(ADDRESS(ROW(),$B$1,4)&":"&ADDRESS(ROW(),$D$1,4)))-IFERROR(MAX(IF(INDIRECT(ADDRESS(CELL("row",A4),$B$1,4)&":"&ADDRESS(CELL("row",A4),$D$1,4))<>INDIRECT(ADDRESS(CELL("row",A4),$D$1,4)),COLUMN(INDIRECT(ADDRESS(CELL("row",A4),$B$1,4)&":"&ADDRESS(CELL("row",A4),$D$1,4)))-MIN(COLUMN(INDIRECT(ADDRESS(CELL("row",A4),$B$1,4)&":"&ADDRESS(CELL("row",A4),$D$1,4))))+1)),0)}
Обратите внимание, что это формула массива, и ее нужно вводить через: Ctrl Shift Enter
Небольшая разбивка (в этом примере мы будем использовать ячейку I4
):
Первый бит формулы: {=COUNTA(INDIRECT(ADDRESS(ROW(),$B$1,4)&":"&ADDRESS(ROW(),$D$1,4)))-
ROW()
используется для возврата строки текущей ячейки, например: Row()
вернет значение 4
. ADDRESS()
используется для возврата адреса ячейки, например: ADDRESS(ROW(),$B$1,4)
вернет относительный адрес;D4
.Та же логика для ADDRESS(ROW(),$D$1,4)
, которая возвращает F4
. INDIRECT()
, затем используется для объединения двух адресов в рабочий диапазон. COUNTA()
используется для подсчетааргументы в этом конкретном диапазоне, в нашем примере он вернет 3
.
Второй бит формулы: IFERROR(MAX(IF(INDIRECT(ADDRESS(CELL("row",A4),$B$1,4)&":"&ADDRESS(CELL("row",A4),$D$1,4))<>INDIRECT(ADDRESS(CELL("row",A4),$D$1,4)),COLUMN(INDIRECT(ADDRESS(CELL("row",A4),$B$1,4)&":"&ADDRESS(CELL("row",A4),$D$1,4)))-MIN(COLUMN(INDIRECT(ADDRESS(CELL("row",A4),$B$1,4)&":"&ADDRESS(CELL("row",A4),$D$1,4))))+1)),0)}
- Для некоторыхПричина, по которой
ROW()
не будет работать с INDIRECT()
при извлечении / сравнении данных, поэтому обратите внимание на использование CELL()
, в этом случае оно заменяет ROW()
, но возвращает то же значение! ADDRESS()
снова используется для объединения двух диапазонов таким же образом, как указано выше. INDIRECT()
снова используется, чтобы иметь возможность работать со значениями в этом диапазоне. IF()
используетсячтобы проверить, отличаются ли наши значения в этом диапазоне, обратите внимание на <>
, чем наше значение в столбце 6
, значение, выбранное в ячейке D1
. - В этом случае, и потому что это формула массиварезультат будет выглядеть как
{TRUE,FALSE,FALSE}
.Для тех случаев, когда это на самом деле TRUE
, он затем перейдет к выражению TRUE
нашего IF()
. - . В этом утверждении мы хотим знать
COLUMN()
минус столбец MIN()
,настолько минимальный, что вернет ({4,5,6}-{4,5,6})+1
результаты в {1,2,3}
- Этот последний результат против более раннего
{TRUE,FALSE,FALSE}
или, скорее, {1,0,0}
приведет к {1,FALSE,FALSE}
и, очевидно, MAX()
этого будет1
. IFERROR()
вернет 0
, если приведенный выше оператор возвращает ошибку (если никакое значение не отличается от значения для поиска). - Например, это приведет к
3-1=2
Для лучшего понимания вы должны изменить значения в ячейке B1
и ячейке D1
и использовать оценку, чтобы увидеть, что происходит!