Условное форматирование для расширенного диапазона

#excel #excel-formula

Вопрос:

(* Это может быть дублированный вопрос, но было бы удивительно, если бы у нас еще не было этой функции. *)

У меня есть таблица Table5 в столбце C, высота которой может измениться. в столбце E у меня есть формула, например, для извлечения уникальных значений, таким образом, результирующий разлитый диапазон имеет динамическую высоту.

Я хотел бы выполнить условное форматирование для результирующего разлитого диапазона, например, выделить значение, которое больше 5.

Но я не нашел, как определить правило условного форматирования для разлитого диапазона (например, с помощью # ). Я не хочу применять правило условного форматирования ко всему столбцу.

Кто-нибудь знает, как этого добиться?

введите описание изображения здесь

Комментарии:

1. Вы можете поместить что-то подобное =E4# в диапазон «Применяется к», но оно изменится на жестко заданный эквивалент, например $E$4:$E$7 . Пока не уверен, что это функция.

2. Короче говоря, вы не можете. Точно так же, как вы не можете ссылаться на структурированную ссылку, необходимо использовать фактический диапазон в applies to . Поскольку структурированные ссылки существуют уже давно и не добавляются, я не вижу, чтобы они добавляли эту возможность.

3. Действительно, существует обходной путь для структурированных ссылок. Я попробовал, это сработало до сих пор: superuser.com/a/1517828/86126

4. @SoftTimur это работает для формулы, но не applies to: для . Он Applies to: изменит его на фактический диапазон независимо от того, как он введен. И этот диапазон останется фиксированным независимо от того, увеличивается или уменьшается размер таблицы.

5. Я провел быстрый тест с таблицей и структурированной ссылкой. Я выбрал таблицу и установил правила =INDIRECT("Table1[@col1]")... , казалось, что она работает динамически, независимо от изменения размера таблицы.

Ответ №1:

Единственный способ, о котором я мог подумать, был:

 =AND(ROW($E1)>=4,ROW($E1)<=COUNTA(UNIQUE(INDIRECT("Table5[Coefficient]"))) 4,$E1>5)
 

Используйте приведенную выше формулу в качестве правила условного форматирования для всего столбца E: E.

Комментарии:

1. Я использую UNIQUE(INDIRECT("Table5[Coefficient]")) в качестве примера, реальная формула сложнее. Я бы предпочел использовать напрямую E4# где-нибудь.

Ответ №2:

Вы можете установить правило условного форматирования для всего столбца, но используйте некоторую дополнительную логику, чтобы убедиться, что оно применяется только к нужному вам диапазону, т.Е.:

 =AND(ROW(E1)>=4, ROW(E1)<=4 COUNT(UNIQUE(INDIRECT("Table5[Coefficient]"))), [your condition here])
 

Примените правило к E:E , и оно будет вычисляться только True для строк в нужном вам диапазоне.

Обновить

Indirect Ссылка может использовать диапазон разлива, поэтому вы могли бы использовать:

 =AND(ROW(E1)>=4, ROW(E1)<=4 COUNT(INDIRECT("E4#")), [your condition here])
 

Обратите внимание, что Unique это больше не требуется. Кроме того, предполагается, что значения в вашей таблице являются только числами.

Комментарии:

1. Это серьезно пугает. В ту минуту, когда я отредактировал свой вопрос, вы опубликовали то же самое!

2. Казалось, именно сюда вел след из комментариев. Также лучший обходной путь, который я мог придумать, чтобы «не» применять его ко всему столбцу.

3. Я использую UNIQUE(INDIRECT("Table5[Coefficient]")) в качестве примера, реальная формула сложнее. Я бы предпочел использовать напрямую E4# где-нибудь.

4. Добавлено улучшение, которое использует E4# . Правило по-прежнему применяется ко всему столбцу, но должно оцениваться за FALSE пределами расширенного диапазона и не применять форматирование там.

Ответ №3:

Альтернативным обходным путем является использование именованного диапазона, который будет принимать # назначение разлитого диапазона.

Назначьте именованный диапазон «CF_1» как:

 =OFFSET($E$4,0,0,COUNTA($E$4#))
 

Условное форматирование, которое будет применено к E: E, может быть:

 =AND(ROW(E1)=MEDIAN(ROW(E1),MIN(ROW(CF_1)),MAX(ROW(CF_1))),E1>5)
 

По сути, это не слишком отличается от ответов JvdV и профессора Пантлесса, поскольку это сводится к одному и тому же, но у него есть бонус, заключающийся в том, что он будет применяться только к строкам разлитого диапазона (ячейки E1-E3 еще не были приняты во вниманиедля других ответов на сегодняшний день).

Обновить

И на самом деле, вам вообще не нужно использовать именованный диапазон, поскольку этот код также будет принимать # (все еще не могу понять, как применить только к диапазону разлива)

 =AND(ROW(E1)=MEDIAN(ROW(E1),MIN(ROW(E$4#)),MAX(ROW(E$4#))),E1>5)
 

Комментарии:

1. Вы уверены =AND(ROW(E1)=MEDIAN(ROW(E1),MIN(ROW(E$4#)),MAX(ROW(E$4#))),E1>5) , что работает? Мне не удалось воспроизвести это.

2. Подход заимствования имени, принимающего расширенный диапазон, работает.

3. Да, подход без имени работает (или, по крайней мере, для меня). Однако, если вы обновите Applies to диапазон до E: E после ввода формулы, Excel может автоматически изменить формулу, поэтому просто убедитесь, что это то, что вы действительно ожидаете…

Ответ №4:

Я использовал несколько разных условных форматов, применяемых ко всему столбцу или группе столбцов. Таблица выглядит следующим образом:

Пример таблицы

Следующие формулы представляют собой условное форматирование, применяемое ко всей строке / строкам, а не к отдельным ячейкам:

Заголовок:

 =AND(OR(ISERR(OFFSET(A1,-1,0)),ISBLANK(OFFSET(A1,-1,0)))=TRUE,ISBLANK(A1)=FALSE)
 

Диапазон:

 =AND(CELL("row",A1)=EVEN(CELL("row",A1)),ISBLANK(A1)=FALSE)
 

Последняя строка (или общая строка):

 =AND(ISBLANK(A1)=FALSE,ISBLANK(A2)=TRUE)
 

Со следующим форматированием:

Форматирование


Если вы не хотите, чтобы это форматирование применялось к ячейкам без разлива, вы можете определить, была ли ячейка разлитой или непосредственно введена. Вы можете сделать это с помощью формулы или написать UDF.

Используя формулу, вам нужно подделать ее. Вы можете использовать ISFORMULA , чтобы найти, где была введена формула разлива, и NOT(ISBLANK()) идентифицировать разлитые строки. Тогда вам придется предположить, что формула, за которой следуют непустые ячейки, не содержащие формул, является разлитой формулой. Могут быть полезны вспомогательные столбцы.

Используя UDF, вы можете напрямую определить, является ли ячейка разлитой. Ниже приведен простой пример. При желании вы можете добавить дополнительные проверки, чтобы определить, действительно ли формула разлилась.

 Public Function isFormulaOrSpill(ByVal rRange As Range) As Boolean
    Dim this_bIsSpill As Boolean
    Dim this_bIsFormula As Boolean
    
    this_bIsSpill = rRange.HasSpill
    this_bIsFormula = rRange.HasFormula
    
    isFormulaOrSpill = (this_bIsSpill Or this_bIsFormula)
End Function
 

Недавно я создавал целые таблицы в виде разлитых диапазонов (включая строки заголовка и всего). Вот пример тех, кто хочет попробовать:

 =LET(
    Column_Key, Table_Status[System],
    Column_FtEstimated, Table_Status[Estimated],
    Column_FtModeled, IF(Table_Status[Modeled]>Table_Status[Estimated],Table_Status[Estimated],Table_Status[Modeled]),

    Categories, SORT(UNIQUE(Column_Key)),
    Array_BoolKey, (TRANSPOSE(Column_Key)=Categories) 0,
    Mask1, TRANSPOSE(ISNUMBER(XMATCH(Column_Filter1,List_Filter1))),
    Mask2, TRANSPOSE(ISNUMBER(XMATCH(Column_Filter2,List_Filter2))),

    Array_BoolMasked, Array_BoolKey,
    Masked_FtModeled, IFERROR(Array_BoolMasked*TRANSPOSE(Column_FtModeled),0),
    Masked_FtEstimated, IFERROR(Array_BoolMasked*TRANSPOSE(Column_FtEstimated),0),
    Array_Ones, SEQUENCE(COLUMNS(Array_BoolMasked),1,1,0),

    Body_Count_Lines, MMULT(Array_BoolKey, Array_Ones),
    Body_Sum_FtModeled, MMULT(Masked_FtModeled, Array_Ones),
    Body_Sum_FtEstimated, MMULT(Masked_FtEstimated, Array_Ones),
    Body_Percent_FtModeled, IFERROR(Body_Sum_FtModeled/Body_Sum_FtEstimated,"-"),

    Total_Count_Lines, IFERROR(SUM(Body_Count_Lines),"-"),
    Total_Sum_FtModeled, IFERROR(SUM(Body_Sum_FtModeled),"-"),
    Total_Sum_FtEstimated, IFERROR(SUM(Body_Sum_FtEstimated),"-"),
    Total_Percent_FtModeled, IFERROR(Total_Sum_FtModeled/Total_Sum_FtEstimated,"-"),

    Array_Seq, {1,2,3,4,5},
    Array_Header, CHOOSE( Array_Seq,  "System", "Lines",  "Modeled Feet", "Estimated Feet", "Percent Modeled"),
    Array_Body, CHOOSE( Array_Seq,  Categories,  Body_Count_Lines,  Body_Sum_FtModeled, Body_Sum_FtEstimated,  Body_Percent_FtModeled),
    Array_Total, CHOOSE( Array_Seq,  "Total",        Total_Count_Lines,  Total_Sum_FtModeled, Total_Sum_FtEstimated,  Total_Percent_FtModeled),

    Range1,Array_Header,
    Range2,Array_Body,
    Range3,Array_Total,
    Rows1,ROWS(Range1), Rows2,ROWS(Range2), Rows3,ROWS(Range3), Cols1,COLUMNS(Range1),
    RowIndex, SEQUENCE(Rows1   Rows2   Rows3), ColIndex,SEQUENCE(1, Cols1),
    RangeTable,IF(
        RowIndex<=Rows1,
        INDEX(Range1,RowIndex,ColIndex),
        IF(RowIndex<=Rows1 Rows2,
            INDEX(Range2,RowIndex-Rows1,ColIndex),
            INDEX(Range3,RowIndex-Rows1-Rows2,ColIndex)
    )),

    Return, RangeTable,
    Return
)