Условное форматирование или фильтрация строки с несколькими условиями сразу?

Автор Mric, 11 января 2021, 21:00

0 Пользователи и 1 гость просматривают эту тему.

eeigor

Цитата: Mric от 12 января 2021, 13:58Но как мне этот селектед и автофильтр у себя сделать?
Добавить столбец, ввести в первую ячейку ту же формулу, что введена в окно УФ (добавив знак равно вначале), распространить эту формулу на все ячейки вниз по столбцу (протянуть мышкой вниз до конца столбца или: навести курсор на правый нижний угол ячейки и щёлкнуть по крестику, весь столбец будет заполнен и выделен, убедиться, что нет ошибок). Включить автофильтр (выделите весь столбец "Selected" с заголовком и выберите команду меню "Данные/Быстрый фильтр").

И вообще, в вашем примере УФ затратно, лучше использовать только автофильтр.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bigor

Цитата: eeigor от 12 января 2021, 13:47гораздо эффективнее (для новичков)
особой разницы нет, как вариант =IF(AND(ISNUMBER(FIND($C$1;A5));ISNUMBER(FIND($C$2;A5)));1;0)
регистрозависимая, если find() поменять на search() станет регистронезависимой
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

eeigor

@Bigor, согласен. Я ещё не сравнивал "особенности" формул поиска в LO Calc. Просто предложил устоявшийся у меня вариант, ещё с Excel. А в Excel не всё однообразно (значит, безобразно). Далее всё с подстановочными символами:
1) расширенный фильтр работает по принципу "начинается с";
2) функция ПОИСК() – по принципу "содержит". Ищешь "специалиста", а отбираются дополнительно "ведущие", "главные" и пр. Используется в паре с функцией ЕЧИСЛО();
3) функция СЧЁТЕСЛИ() – по принципу "точно соответствует". Используется в паре с функцией ЕСЛИ().

Вот я и использовал вариант №3 с СЧЁТЕСЛИ(), а вы предложили вариант №2 с ЕЧИСЛО(). Прим.: я копирую фрагменты, поэтому не перевожу.

А вот почему у меня не сработал такой вариант (ниже) - это вопрос?
Параметры – LibreOffice Calc – Вычисления
Общие вычисления
Условия поиска = и <> должны распространяться на всю ячейку   =   FALSE

Тогда должно работать и без ".*", но у меня что-то не вышло. А почему?
=IF(AND(COUNTIF($A4;"abc");COUNTIF($A4;"123"));1;0)

UPD:
Я активно использую расширенный фильтр (AdvancedFilter).
И из-за того, что расширенный фильтр не работает с подстановочными символами, а только с регулярными выражениями, то я и не использую больше подстановочные символы в формулах. Жаль, конечно, что AdvancedFilter с ними не работает. Но это не предусмотрено спецификацией.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Mric

Цитата: eeigor от 12 января 2021, 14:18
Цитата: Mric от 12 января 2021, 13:58Но как мне этот селектед и автофильтр у себя сделать?
Добавить столбец, ввести в первую ячейку ту же формулу, что введена в окно УФ (добавив знак равно вначале), распространить эту формулу на все ячейки вниз по столбцу (протянуть мышкой вниз до конца столбца или: навести курсор на правый нижний угол ячейки и щёлкнуть по крестику, весь столбец будет заполнен и выделен, убедиться, что нет ошибок). Включить автофильтр (выделите весь столбец "Selected" с заголовком и выберите команду меню "Данные/Быстрый фильтр").

И вообще, в вашем примере УФ затратно, лучше использовать только автофильтр.

Не очень понял как тянуть, вот оно выдало для первой ячейки ноль, что верно, но как их ко всем ячейкам применить?

eeigor

Цитата: Mric от 12 января 2021, 14:53Не очень понял как тянуть
Да просто скопируйте формулу из первой ячейки, выделите требуемый диапазон и вставьте скопированную формулу из буфера. Она относительная (если вы внимательно всё читали) и будет вставлена в каждую ячейку со ссылками на URL'ы в той же (важно!) строке, что и ячейка с формулой. Протянуть за крестик - это способ 2, а щёлкнуть по крестику - это способ 3 (в последнем случае диапазон должен быть смежным). Почитайте что-нибудь...
"Поместите курсор на маленький квадрат в правом нижнем углу выделенной ячейки. Курсор изменит форму на крестик".

@Mric, у вас действительно (на скриншоте) в качестве разделителя параметров в формулах используется символ запятой, а не точки с запятой?
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

Mric

Цитата: eeigor от 12 января 2021, 15:01
Цитата: Mric от 12 января 2021, 14:53Не очень понял как тянуть
Да просто скопируйте формулу из первой ячейки, выделите требуемый диапазон и вставьте скопированную формулу из буфера. Она относительная (если вы внимательно всё читали) и будет вставлена в каждую ячейку со ссылками на URL'ы в той же (важно!) строке, что и ячейка с формулой. Протянуть за крестик - это способ 2, а щёлкнуть по крестику - это способ 3 (в последнем случае диапазон должен быть смежным). Почитайте что-нибудь...
"Поместите курсор на маленький квадрат в правом нижнем углу выделенной ячейки. Курсор изменит форму на крестик".

@Mric, у вас действительно (на скриншоте) в качестве разделителя параметров в формулах используется символ запятой, а не точки с запятой?

Большое спасибо, все работает! Скопировал все и отлично заработало) Да, действительно УФ было лишним.

eeigor

Замечательно!
А я, в свою очередь, попрошу участников ответить на мой вопрос в посте #17. Что-то там не так...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bigor

Цитата: eeigor от 12 января 2021, 15:44Что-то там не так...
у меня тоже сброс флажка, не влияет на расчет формул. Возможно нужна перезагрузка LO (хотя остальные флажки срабатывают сразу), на работе куча файлов висит открытыми, лень перегружать - вечером дома попробую.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

eeigor

@Bigor, сброшенный флажок, собственно, частный случай, а установленный - более общий. Надо только определиться: если есть глюк, то всегда устанавливать флажок и дополнять условия поиска символами ".*".
При этом такие "полные" условия c символами ".*" будут прекрасно работать и при сброшенном флажке, ибо эти условия захватывают всю строку. Не знаю только, какие из них "жрут" больше (greedy).
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bigor

Попробовал дома, сброс флажка и перезагрузка LO к никаким изменениям в расчетах не привели. Пробовал на countif() и vloockup(). Поставил флажок обратно. Так надежнее :)
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

eeigor

Вот тут справка по функции COUNTIF().
Читаю:
Если флажок Условия поиска = и <> должен распространяться на всю ячейку установлен, то условие "red" будет соответствовать только red; если не установлен оно будет соответствовать red, Fred, red herring.

Пробую... нет. Требуется точное соответствие, или надо всегда обрамлять строку поиска символами ".*" вне зависимости от установки вышеупомянутого флажка. Причём так работает и для регулярных выражений, и для подстановочных символов (обрамлять "*"). В смысле, не работает.
А как у других?

UPD:
Зато на работу функции REGEX() вышеупомянутый флажок никак не повлиял: ищет в любом случае (??). Зато есть параметр "g".

Но на работу стандартного и расширенного фильтров этот флажок влияет, как заявлено. Путаница, конечно.

UPD2:
Однако в справке сказано немного по другому (кнопка "Справка" в окне Параметры - Вычисления):
Когда установлен флажок Условия поиска = и <> должны распространяться на всю ячейку, поведение LibreOffice Calc полностью совпадает с поведением MS Excel при поиске ячеек в функциях базы данных.
Если флажок Условия поиска = и <> должны применяться к ячейкам целиком не установлен, шаблон поиска "win" работает подобно ".*win.*". Шаблон поиска может находиться в любом месте ячейки при поиске с помощью функций базы данных Calc.

Но это ведь не для COUNTIF()? Значит, вероятно, в описании этой функции ошибка. Флажок работает для фильтров и функций (формул) базы данных. А функции базы данных, как и расширенный фильтр, требуют ссылки на диапазон условий на листе. Могу ошибаться.

UPD3:
А вот разъяснения из Руководства по Calc 6.2 (которое переводит для нас kompilainenn):

Enable wildcards in formulas
Enable wildcards in formulas specifies that wildcards are enabled when searching and also for character string comparisons. This relates to the database functions, and to VLOOKUP, HLOOKUP, MATCH, AVERAGEIF, AVERAGEIFS, COUNTIF, COUNTIFS, SUMIF, SUMIFS, and SEARCH. Select this option for spreadsheets that need to be interoperable with Microsoft Excel.

Enable regular expressions in formulas
Enable regular expressions in formulas specifies that regular expressions instead of simple wildcards are enabled when searching and also for character string comparisons. This relates to the database functions, and to VLOOKUP, HLOOKUP, MATCH, AVERAGEIF, AVERAGEIFS, COUNTIF, COUNTIFS, SUMIF, SUMIFS and SEARCH. Do not enable regular expressions in formulas for spreadsheets that need to be interoperable with Microsoft Excel.

Информация НЕпротиворечивая. По функции COUNTIF, в частности. Но ожидаемого результата нет...

UPD4:
А вот и косяк:
Флажок Условия поиска = и <> должен распространяться на всю ячейку сброшен.
A5: Fred   <-- ищем в ячейке:
=COUNTIF($A5;"red")  'и не находим
=COUNTIF($A5;"r.d")  'и находим

А так не должно быть. "red" - это такое же выражение, как и "r.d". Но Calc не распознаёт "red" как регулярное выражение. А должен был сам пристегнуть символы ".*" с обоих сторон, как сказано в справке.
А это значит, что лучше обрамлять условие поиска символами ".*", что в решении, предложенном автору этой темы и было сделано! Поправьте меня, если я не прав...
Но расширенный фильтр с диапазоном условий РАБОТАЕТ ПРАВИЛЬНО.

UPD5:
Я немного неправ. Хотя и неожиданно. Но в руководстве по Calc 6.2 сказано (page 244):

Regular expressions will not work in simple comparisons. For example: A1="r.d" will always return FALSE if A1 contains red, even if regular expressions are enabled. It will only return TRUE if A1 contains r.d (r then a dot then d). If you wish to test using regular expressions, try the COUNTIF function: COUNTIF(A1,"r.d") will return 1 or 0, interpreted as TRUE or FALSE in formulas like =IF(COUNTIF(A1,"r.d"),"hooray","boo").

И надо, как предлагают, всегда тестировать регулярные выражения всё той же функцией COUNTIF.
Надеюсь, у всех теперь прибавилось ясности, и тему можно закрыть. Но всё-таки это косяк, и ноги растут из этих "simple comparisons" (расширенный фильтр работает, как упоминал уже, абсолютно правильно)...

Прошу прощения для столь длинный монолог. Ещё момент:
=COUNTIF($A5;"(red)")  'и находим
=COUNTIF(A5;"()red")  'тоже находим
А почему?
Активация параметра Включить регулярные выражения в формулах означает, что все вышеперечисленные функции будут требовать любые специальные символы регулярных выражений (например, круглые скобки)...

Хотя смысл фразы выше немного другой (page 244):
Activating the Enable regular expressions in formulas option means all the above functions will require any regular expression special characters (such as parentheses) used in strings within formulas, to be preceded by a backslash, despite not being part of a regular expression. These backslashes will need to be removed if the setting is later deactivated.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

Цитата: eeigor от 13 января 2021, 19:16...to be preceded by a backslash, despite not being part of a regular expression. These backslashes will need to be removed if the setting is later deactivated.
И как всю эту хрень переводит @kompilainenn? Вот вопрос...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

kompilainenn

Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

eeigor

Ну, будем иметь в виду, что Calc "хочет знать", надо ли нам обеспечить точное сравнение или найти подстроку в строке даже при явно заданной опции поиска подстроки в строке.
Excel, кстати, в расширенном фильтре, если надо обеспечить точное сравнение, требует такого синтаксиса: ="=условие". В Calc эта задача решается установкой флажка.
Однако, круглые скобки создают группу. Можно и не создавать (для примера выше):
=COUNTIF($A5;"(?:red)")  'находит подстроку "red"
Или так:
A5: Fredred  <-- Текст в ячейке
=COUNTIF($A5;"(red)\1")  'находит "redred", используя ссылку на созданную группу

В общем, скрытый смысл опции разъяснён. Однако, налицо непоследовательность поведения формул и фильтров.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

kompilainenn

Цитата: eeigor от 13 января 2021, 23:22Однако, налицо непоследовательность поведения формул и фильтров.
багрепорт пишите
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут