Como encontrar o formato específico da sintaxe de texto em uma célula com uma função do Excel?

2

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?

dollypartonxyz
fonte
1
Todos esses dados estão em uma única célula? Você pode nos dizer o que você já tentou fazer com que isso funcionasse?
precisa

Respostas:

1

Outra maneira de afirmar o problema é:

  1. ||(consecutivos |) não são permitidos, nem os que incluem apenas dois ou mais espaços * .
  2. Se existir um | |(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 | |.
  3. Se não | |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:

Captura de tela da planilha

Esta é a fórmula inserida B2:B11:

=IF(CHOOSE(MIN(3,1+LEN(A1)-LEN(SUBSTITUTE(A1,"|",""))),TRUE,FALSE,AND(LEN(A1)-LEN(SUBSTITUTE(A1,"|",""))-(LEN(A1)-LEN(SUBSTITUTE(A1,"| |","")))/3*2=2,LEN(TRIM(MID(A1,FIND("|",A1)+1,FIND("|",A1,FIND("|",A1)+1)-FIND("|",A1)-1)))>0)),"ok","wrong")

Explicação:

A versão pré-modificada da fórmula é a seguinte:

=
IF(
  CHOOSE(
    MIN(3,1+LEN(A1)-LEN(SUBSTITUTE(A1,"|",""))),
    TRUE,
    FALSE,
    AND(
      LEN(A1)-LEN(SUBSTITUTE(A1,"|",""))-(LEN(A1)-LEN(SUBSTITUTE(A1,"| |","")))/3*2=2,
      LEN(TRIM(MID(A1,FIND("|",A1)+1,FIND("|",A1,FIND("|",A1)+1)-FIND("|",A1)-1)))>0
    )
  ),
  "ok",
  "wrong"
)

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] é:

LEN(A1)-LEN(SUBSTITUTE(A1,"|",""))-(LEN(A1)-LEN(SUBSTITUTE(A1,"| |","")))/3*2=2

A fórmula para a |parte de validação intra- texto de [b] é:

LEN(TRIM(MID(A1,FIND("|",A1)+1,FIND("|",A1,FIND("|",A1)+1)-FIND("|",A1)-1)))>0

A outra parte de [b] (ou seja, que não pode haver apenas uma |) é tratada pela CHOOSE()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,

MIN(3,1+LEN(A1)-LEN(SUBSTITUTE(A1,"|","")))

mapeia as contagens possíveis de |s para os índices 1, 2e 3assim: [0,1,2,3,4,…][1,2,3,3,3,…], e assim a função retorna TRUEpara uma contagem de 0, FALSEpara uma contagem de 1e o resultado da AND()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 da TRIM()função.

robinCTS
fonte
0

Supondo que cada um |xyz|esteja em uma célula individual, essa fórmula fará o trabalho para o |xyz|em A1:

=IFERROR(IF(LEFT(A1,1)="|",IF(FIND("|",A1,2)=LEN(A1),"ok","not ok"),"not ok"),"not ok")
Hauke ​​P.
fonte
0

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?

(\w+\|\w+|(^|\s)\w+\||\|\w+($|\s)|\|\|)

insira a descrição da imagem aqui

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

CONDITION#1    or    CONDITION#2   or   CONDITION#3    or    CONDITION#4 
\w+ \| \w+          (^|\s) \w+ \|       \| \w+ ($|\s)          \| \|
"abc|abc"         "^abc|" or " abc|"   "|abc " or "|abc$"       "||"

RegEx em detalhes

  1. Um padrão como (xxx | yyy | zzz) é um grupo com 3 condições e uma condição deve ser verdadeira
  2. A combinação \|representa o |personagem que deve ser escapado, porque |sozinho é um caractere especial
  3. \w+significa todas as letras az ou números 0-9 ou sublinhados. Como a seguinte função definida pelo usuário usa a ignorecase = trueconfiguração, você não precisa especificar letras maiúsculas AZ
  4. ^significa o valor inicial $da célula e o valor final da célula
  5. \srepresenta um único espaço. Ignoro o fato de que também significa quebras de tabulação e linha

Fonte: 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

Function RegExTest(rngCell As Range, strPattern As String) As Boolean        
    Dim objRegEx As Object
    Set objRegEx = CreateObject("VBScript.RegExp")        
    objRegEx.Global = True
    objRegEx.IgnoreCase = True
    objRegEx.Pattern = strPattern        
    RegExTest = objRegEx.Test(rngCell.Value)        
End Function

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 marcada

Caso alguém precise, aqui está um exemplo de pasta de trabalho

nixda
fonte