Ну, вот что вы можете попробовать. Вы могли бы сделать это в одной формуле с формулой массива, но с 150K строками кажется намного лучше попытаться избежать формул массива и использовать вспомогательные столбцы там, где это необходимо.
Первый вспомогательный столбец просто содержит идентификатор человека, если строка содержит FALSE:
=IF(H2=FALSE,I2,"")
Второй вспомогательный столбец содержит смещение от текущей строки до следующей FALSE для того же человека:
=IFERROR(MATCH(I2,K2:K$15,0)-1,16-ROW())
Так что теперь вы можете использовать в основном ту же формулу COUNTIFS, но заменяя каждый диапазон на INDEX, который указывает, сколько строк вы должны считать:
=IF(H2=FALSE,0,COUNTIFS(I2:INDEX(I2:I$15,L2),I2,H2:INDEX(H2:H$15,L2),"GOOD",J2:INDEX(J2:J$15,L2),">="&J2,J2:INDEX(J2:J$15,L2),"<="&J2+7))+
IF(H2=FALSE,0,COUNTIFS(I2:INDEX(I2:I$15,L2),I2,H2:INDEX(H2:H$15,L2),"OK",J2:INDEX(J2:J$15,L2),">="&J2,J2:INDEX(J2:J$15,L2),"<="&J2+7))
Примечание 1
16 во втором уравнении позволяет учесть случай, когда после текущей строки больше нет строк, помеченных как FALSE, поэтому MATCH не выполняется. Это заставляет Countifs считать все от текущих строк до конца данных.
Примечание 2 - расширение до большего диапазона данных
Вы сможете заменить цифру 16 на countA (I: I), размер данных плюс заголовки.
Не должно быть проблем с использованием большего диапазона для индекса, например,
=IF(H2=FALSE,0,COUNTIFS(I2:INDEX(I2:I$150000,L2),I2,H2:INDEX(H2:H$150000,L2),"GOOD",J2:INDEX(J2:J$150000,L2),">="&J2,J2:INDEX(J2:J$150000,L2),"<="&J2+7))+
IF(H2=FALSE,0,COUNTIFS(I2:INDEX(I2:I$150000,L2),I2,H2:INDEX(H2:H$150000,L2),"OK",J2:INDEX(J2:J$150000,L2),">="&J2,J2:INDEX(J2:J$150000,L2),"<="&J2+7))
, но увеличение диапазона поиска в строках MATCH до 150K во второй формуле серьезно влияет на производительность при повторении 150K раз. Единственное решение, которое я могу придумать в данный момент, - это посмотреть, можно ли разместить максимум на расстоянии от любого вхождения имени до следующего вхождения имени с FALSE рядом с ним.