Для моей собственной практики я хотел посмотреть, можно ли / как это сделать в своем первоначальном намерении. Как и следовало ожидать, это ужасный беспорядок
=AND(NOT(ISBLANK($B2)),SUMPRODUCT(--($C2:INDIRECT("$C"&MIN(IF(NOT(ISBLANK($B3:INDIRECT("$B"&ROW()+50))),ROW($B3:INDIRECT("$B"&ROW()+50))-1)))<>""))>1)
Я разобью его по частям.
Для каждого значения в столбце B мы хотим смотреть вниз, пока не найдем другое значение. Используя приведенный выше пример, если мы смотрим на B2, мы смотрим дальше вниз, пока не увидим следующее значение на B5. Я не могу найти функцию Excel, чтобы «продолжать поиск, пока он что-то не найдет», поэтому мы всегда будем смотреть на 50 строк вниз.
Мы можем сгенерировать этот диапазон по формуле:
=$B2:INDIRECT("$B"&ROW()+50)
Примечание: этот диапазон не имеет смысла, если вводить непосредственно в одну ячейку.
INDIRECT генерирует ссылку на ячейку из предоставленного текста.
Чтобы найти следующую заполненную (не пустую) ячейку, нам нужно работать с массивами. Чтобы сэкономить место, я пока жестко закодирую диапазон. Я использовал пример кода с этой страницы:
=MIN(IF(NOT(ISBLANK(B2:B52))), ROW(B2:B52))
Обратите внимание, что при вводе формул, содержащих массивы, в ячейки таблицы необходимо использовать сочетание клавиш CTRL - SHIFT - ENTER (необязательно для ввода формулы условного форматирования). Нормальный ENTER даст разные результаты и приведет к тому, что вы вырвете волосы Поверь мне на слово.
Поэтому найдите все ячейки в указанном диапазоне и убедитесь, что они не пустые. Если они не являются пустыми, вернуть минимальный номер строки этого элемента. За исключением того, что это будет включать B5
, и мы действительно хотим просмотреть 1 ячейку назад, поэтому ROW - 1
:
=MIN(IF(NOT(ISBLANK(B2:B52))), ROW(B2:B52) - 1)
За исключением, конечно, наша настоящая формула сейчас:
=MIN(IF(NOT(ISBLANK(B2:INDIRECT("$B"&ROW()+50)))), ROW(B2:INDIRECT("$B"&ROW()+50)) - 1)
Затем нам нужно проверить, есть ли в столбце C более одного значения в диапазоне от C2
до C4
. Этот умный код проверяет, все ли ячейки в диапазоне пустые:
=SUMPRODUCT(--(range<>""))=0
range<>""
проверяет, не равна ли каждая ячейка в диапазоне ""
(пусто). Это вернет массив логических значений, таких как:
{TRUE,FALSE,TRUE}
Двойной дефис затем преобразует значения TRUE FALSE в единицу и нули:
{1,0,1}
Где 1
в этом массиве соответствуют ячейкам, которые не являются пустыми или пустыми. SUMPRODUCT добавляет (суммирует) все элементы в массиве. Если ваш конечный результат не равен нулю, то были заполненные ячейки.
Конечно, мы ожидаем одно значение в C2
которое соответствует записи в B2
, поэтому мы ожидаем 1 значение. Мы изменим это на это:
=SUMPRODUCT(--(range<>""))>1
Связав все это вместе, мы получим:
=SUMPRODUCT(--($C2:INDIRECT("$C"&MIN(IF(NOT(ISBLANK($B3:INDIRECT("$B"&ROW()+50))),ROW($B3:INDIRECT("$B"&ROW()+50))-1)))<>""))>1
ЗА ИСКЛЮЧЕНИЕМ это вернет true не только для строк, содержащих имя / идентификатор. Поэтому нам нужно обернуть его в некоторые дополнительные проверки:
=AND(NOT(ISBLANK($B2)), the rest)
И это ваша окончательная формула, дающая ИСТИНА или ЛОЖЬ, как и ожидалось:
=AND(NOT(ISBLANK($B2)),SUMPRODUCT(--($C2:INDIRECT("$C"&MIN(IF(NOT(ISBLANK($B3:INDIRECT("$B"&ROW()+50))),ROW($B3:INDIRECT("$B"&ROW()+50))-1)))<>""))>1)
ЗА ИСКЛЮЧЕНИЕМ ОБЩЕГО ФОРМАТИРОВАНИЯ НЕ ПРИНИМАЕТЕ ЕГО
Мне пришлось добавить еще один столбец (который можно скрыть), чтобы сохранить результат, и на этом основывать условное форматирование.
Рекомендации:
КОСВЕННЫЕ
СТРОКА
MIN
ЕСЛИ
НЕ
ISBLANK
SUMPRODUCT