
Um leitor de longa data me enviou um problema interessante na semana passada. O objetivo é terminar com uma string de texto como "MWF" para segunda, quarta e sexta-feira. O problema é que os dias da semana são inseridos como abreviações sim / não, como "NYNYNYN" para "MWF".
Desafio
Qual fórmula irá traduzir o "N" e "Y" para as abreviações dos dias da semana, conforme mostrado na captura de tela acima?
A apostila está anexada abaixo. Poste sua resposta nos comentários.
Pontos extras para estilo e elegância, mas soluções robustas também são boas :)
Suposições
- Todas as entradas têm 7 caracteres e contêm apenas "Y" ou "N"
- Os dias são mapeados de domingo a sábado, SMTWTFS.
Opções de solução - spoilers!
Opção nº 1 - concatenação de força bruta com a função MID, quebras de linha adicionadas para facilitar a leitura:
=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","")
Esta seria uma solução típica e ilustra bem como funciona a concatenação. Observação: você pode usar quebras de linha dentro da barra de fórmulas para tornar as fórmulas mais fáceis de ler.
Opção # 2 - TEXTJOIN e função MID:
=TEXTJOIN("",TRUE,IF(MID(B5,(1,2,3,4,5,6,7),1)="N","",("S","M","T","W","T","F","S")))
Esta solução usa constantes de matriz para simplificar consideravelmente a fórmula.
Nota: Jon Wittwer postou uma versão mais sofisticada desta fórmula nos comentários abaixo, girando a constante do array usando ROW e INDIRECT.
Opção # 3 - TEXTJOIN, MID e REPT:
=TEXTJOIN("",1,REPT(("S","M","T","W","T","F","S"),MID(B5,(1,2,3,4,5,6,7),1)="Y"))
Uma versão * ligeiramente * mais compacta usando REPT, aproveitando o fato de que MID retornará TRUE ou FALSE para cada valor, e TRUE será avaliado como 1 ou zero dentro de REPT.