2013-10-16 13:34:39 +0000 2013-10-16 13:34:39 +0000
13
13

Existe uma fórmula Excel para identificar caracteres especiais numa célula?

Temos cerca de 3500 documentos cujos nomes de arquivo precisam de ser esfregados manualmente para remover caracteres especiais como parênteses, colónes, ponto e vírgula, etc.

Tenho um ficheiro de texto que atirei para o Excel, e estou a tentar criar uma coluna que sinalize o nome do ficheiro para modificação, se incluir caracteres especiais. A fórmula do pseudocódigo seria

=IF (cellname contains [^a-zA-z_-0-9], then "1", else "0")

para sinalizar a linha se esta contiver outros caracteres além de A-Z, 0-9, - ou _, independentemente do caso.

Alguém sabe de algo que possa funcionar para mim? Estou hesitante em codificar e declarar if em massa se houver algo rápido e fácil.

Respostas (4)

19
19
19
2013-10-16 14:26:04 +0000

Sem código? Mas é tão curto e fácil e bonito e… :(

O seu padrão RegEx [^A-Za-z0-9_-] é usado para remover todos os caracteres especiais em todas as células.

Sub RegExReplace()

    Dim RegEx As Object
    Set RegEx = CreateObject("VBScript.RegExp")
    RegEx.Global = True

    RegEx.Pattern = "[^A-Za-z0-9_-]"
    For Each objCell In ActiveSheet.UsedRange.Cells
        objCell.Value = RegEx.Replace(objCell.Value, "")
    Next

End Sub

Editar

Isto é o mais próximo que consigo chegar da sua pergunta original.

Function RegExCheck(objCell As Range, strPattern As String)

    Dim RegEx As Object
    Set RegEx = CreateObject("VBScript.RegExp")
    RegEx.Global = True
    RegEx.Pattern = strPattern

    If RegEx.Replace(objCell.Value, "") = objCell.Value Then
        RegExCheck = 0
    Else
        RegExCheck = 1
    End If

End Function

O segundo código é uma função definida pelo utilizador =RegExCheck(A1,"[^A-Za-z0-9_-]") com 2 argumentos. O primeiro é a célula a verificar. O segundo é o padrão RegEx a verificar. Se o padrão corresponder a qualquer um dos caracteres da sua célula, ele retornará 1 caso contrário 0.

Pode utilizá-lo como qualquer outra fórmula normal do Excel se primeiro abrir o editor VBA com ALT+F11, inserir um novo módulo (!) e colar o código abaixo.

[] stands for a group of expressions
^ is a logical NOT
[^] Combine them to get a group of signs which should not be included
A-Z matches every character from A to Z (upper case)
a-z matches every character from a to z (lower case)
0-9 matches every digit
_ matches a _
- matches a - (This sign breaks your pattern if it's at the wrong position)

Para utilizadores novos no RegEx explicarei o seu padrão: [^A-Za-z0-9_-]

7
7
7
2013-10-16 15:31:19 +0000

Usando algo semelhante ao código do nixda, aqui está uma função definida pelo utilizador que retornará 1 se a célula tiver caracteres especiais.

Public Function IsSpecial(s As String) As Long
    Dim L As Long, LL As Long
    Dim sCh As String
    IsSpecial = 0
    For L = 1 To Len(s)
        sCh = Mid(s, L, 1)
        If sCh Like "[0-9a-zA-Z]" Or sCh = "_" Then
        Else
            IsSpecial = 1
            Exit Function
        End If
    Next L
End Function

Funções definidas pelo utilizador (UDFs) são muito fáceis de instalar e utilizar:

  1. ALT-F11 faz subir a janela VBE
  2. ALT-I ALT-M abre um módulo novo
  3. cola o material e fecha a janela do VBE

Se guardar a pasta de trabalho, o UDF será guardado com ela. Se estiver a utilizar uma versão do Excel mais tarde então 2003, deverá guardar o ficheiro como .xlsm em vez de .xlsx

Para remover o UDF:

  1. trazer a janela VBE como acima
  2. limpar o código
  3. fechar a janela VBE

Para utilizar o UDF do Excel:

=Ispecial(A1)

Para saber mais sobre macros em geral, ver: http://www.mvps.org/dmcritchie/excel/getstarted.htm

e http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

e http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

para especificações em UDFs

Macros têm de estar activados para que isto funcione*!

2
2
2
2013-10-16 21:05:57 +0000

Aqui está uma solução de formatação condicional que assinalará os registos com caracteres especiais.

Basta aplicar uma nova regra de formatação condicional aos seus dados que utiliza a fórmula (extremamente longa) abaixo, onde A1 é o primeiro registo na coluna de nomes de ficheiro:

=SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<48)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<>45))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>57)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<65))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>90)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<97)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<>95))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>122)*1)

Esta fórmula verifica cada caractere de cada nome de ficheiro e determina se o seu código ASCII está fora dos valores admissíveis de caracteres. Infelizmente, os códigos de caracteres admissíveis não são todos contíguos, pelo que a fórmula tem de utilizar somas de SUMPRODUCTs. A fórmula devolve o número de maus caracteres que existem. Quaisquer células que devolvam um valor superior a 0 são assinaladas.

Exemplo:

1
1
1
2016-06-20 21:36:00 +0000

Utilizei uma abordagem diferente para encontrar caracteres especiais. Criei novas colunas para cada um dos caracteres permitidos, e depois utilizei uma fórmula como esta para contar quantas vezes esse carácter permitido estava em cada entrada de linha (Z2):

AA2=LEN($Z2)-LEN(SUBSTITUTE($Z2,AA$1,""))
AB2=LEN($Z2)-LEN(SUBSTITUTE($Z2,AB$1,""))
...

Depois somei o número de caracteres permitidos em cada linha, e depois comparei-o com o comprimento total da entrada da linha.

BE2=LEN(Z2)
BF2=SUM(AA2:BC2)-BE2

E finalmente, ordenei na última coluna (BF2) para encontrar valores negativos, o que me levou às colunas que precisavam de correcção.