Estou procurando uma fórmula de célula para localizar / identificar / validar se uma célula adjacente contiver caracteres no formato correto.
Se houver um caractere "|", ele deverá ser precedido ou seguido por qualquer quantidade de texto e, em seguida, outro "|" antes que o texto termine ou exista um espaço, caso contrário, a célula está incorreta.
Exemplos:
|Name| |Surname| |City| = ok
|Name| |Surname| = ok
|Name| |Surname| New York = ok
New York |Name| |Surname| = ok
|Name| |City |Surname| = wrong
N|ame |City| |Surname| = wrong
|Surname| |ZipCode| = ok
Alguma ideia?
microsoft-excel
worksheet-function
dollypartonxyz
fonte
fonte
Respostas:
Outra maneira de afirmar o problema é:
||
(consecutivos|
) não são permitidos, nem os que incluem apenas dois ou mais espaços * .| |
(um espaço no meio) no texto a ser validado, ele deve ser precedido imediatamente por qualquer quantidade de|
texto não , com um|
ou outro| |
imediatamente antes disso , e deve ser seguido imediatamente por qualquer quantidade de texto não- texto. -|
texto seguido por um|
ou outro| |
.| |
houver, deve haver não|
ou exatamente dois|
.A condição 1. é, tecnicamente, explicitamente descartada na pergunta ( "qualquer quantidade de texto" pode significar nenhum ou somente espaço é permitido), mas pode ser inferido a partir dos exemplos de que essa é a intenção do OP.
Com as condições reformuladas como acima, uma solução somente de fórmula se torna prontamente aparente, conforme aplicado na seguinte planilha:
Esta é a fórmula inserida
B2:B11
:Explicação:
A versão pré-modificada da fórmula é a seguinte:
As três condições acima podem ser refatoradas para o seguinte:
[a] Deve haver precisamente 2 a mais do
|
que os contabilizados pelos| |
s (o primeiro e o último).e
[b] Se houver
|
, deve haver pelo menos dois deles, e os dois primeiros devem ser separados por pelo menos um caractere não espacial.A fórmula para [a] é:
A fórmula para a
|
parte de validação intra- texto de [b] é:A outra parte de [b] (ou seja, que não pode haver apenas uma
|
) é tratada pelaCHOOSE()
função, que também cuida do caso em que não há|
(necessário, pois esse caso de borda causa erros na fórmula [b ] e um resultado incorreto para a fórmula [a]).O primeiro argumento da
CHOOSE()
função,mapeia as contagens possíveis de
|
s para os índices1
,2
e3
assim:[0,1,2,3,4,…]
→[1,2,3,3,3,…]
, e assim a função retornaTRUE
para uma contagem de0
,FALSE
para uma contagem de1
e o resultado daAND()
função para todas as outras contagens.* A condição que não permite dois ou mais intra-
|
espaços pode ser relaxada pelo uso daTRIM()
função.fonte
Supondo que cada um
|xyz|
esteja em uma célula individual, essa fórmula fará o trabalho para o|xyz|
emA1
:fonte
Uau, essa foi uma pergunta difícil!
Mas depois de 4 horas tropeçando no escuro, acho que obtive o padrão RegEx certo
Criei uma pequena função VBA para fornecer um novo tipo de fórmula
=RegExTest()
.A fórmula verifica se um determinado padrão corresponde à célula para verificar e retorna verdadeiro ou falso.
Primeiro, tentei pesquisar todas as células válidas. Eu falhei, o padrão era longo demais.
Então tive a ideia: por que não pesquisar as combinações de caracteres inválidos?
A ideia por trás
O padrão tem 4 condições. Se algum deles corresponder a uma sequência parcial inválida, a fórmula retornará true . Caso contrário, ele retornará false, o que significa que não há erros na célula verificada
RegEx em detalhes
\|
representa o|
personagem que deve ser escapado, porque|
sozinho é um caractere especial\w+
significa todas as letras az ou números 0-9 ou sublinhados. Como a seguinte função definida pelo usuário usa aignorecase = true
configuração, você não precisa especificar letras maiúsculas AZ^
significa o valor inicial$
da célula e o valor final da célula\s
representa um único espaço. Ignoro o fato de que também significa quebras de tabulação e linhaFonte: Linguagem de Expressão Regular - Referência Rápida no MSDN
Como usar o RegEx no Excel
Isso é o que a maioria das pessoas não sabe. Você realmente pode usar o RegEx em qualquer programa do Office.
Abra o editor VBA com ALT+ F11, adicione um novo módulo e cole o código
Agora, um novo tipo de fórmula está disponível:
=RegExTest( <cell_to_check> , <RegEx_pattern> )
que retornará true se o padrão corresponder a qualquer lugar no valor da célula marcadaCaso alguém precise, aqui está um exemplo de pasta de trabalho
fonte