
На прошлой неделе давний читатель прислал мне интересную задачу. Цель состоит в том, чтобы получить текстовую строку типа «MWF» для понедельника, среды, пятницы. Проблема в том, что дни недели вводятся в виде сокращений «да / нет», например «NYNYNYN» для «MWF».
Вызов
Какая формула переведет буквы "N" и "Y" в сокращения для дней недели, как показано на скриншоте выше?
Рабочая тетрадь прилагается ниже. Оставьте свой ответ в комментариях.
Дополнительные баллы за стиль и элегантность, но подойдут и рабочие лошадки :)
Предположения
- Все поля состоят из 7 символов и содержат только «Y» или «N».
- Дни отображаются с воскресенья по субботу, SMTWTFS.
Варианты решения - спойлеры!
Вариант №1 - конкатенация грубой силы с функцией MID, для удобства чтения добавлены разрывы строк:
=IF(MID(B5,1,1)="Y","S","")& IF(MID(B5,2,1)="Y","M","")& IF(MID(B5,3,1)="Y","T","")& IF(MID(B5,4,1)="Y","W","")& IF(MID(B5,5,1)="Y","T","")& IF(MID(B5,6,1)="Y","F","")& IF(MID(B5,7,1)="Y","S","")
Это будет типичное решение, которое хорошо иллюстрирует, как работает конкатенация. Примечание. Вы можете свободно использовать разрывы строк внутри строки формул, чтобы формулы было легче читать.
Вариант №2 - функция TEXTJOIN и MID:
=TEXTJOIN("",TRUE,IF(MID(B5,(1,2,3,4,5,6,7),1)="N","",("S","M","T","W","T","F","S")))
В этом решении для упрощения формулы значительно используются константы массива.
Примечание: Джон Виттвер опубликовал более сложную версию этой формулы в комментариях ниже, увеличивая константу массива с помощью ROW и INDIRECT.
Вариант № 3 - TEXTJOIN, MID и REPT:
=TEXTJOIN("",1,REPT(("S","M","T","W","T","F","S"),MID(B5,(1,2,3,4,5,6,7),1)="Y"))
* Немного * более компактная версия с использованием REPT, использующая тот факт, что MID возвращает TRUE или FALSE для каждого значения, а TRUE будет оценивать как 1 или ноль внутри REPT.