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


13

Temos cerca de 3500 documentos cujos nomes de arquivos precisam ser limpos manualmente para remover caracteres especiais como colchetes, dois pontos, ponto e vírgula, vírgulas etc.

Eu tenho um arquivo de texto que despejei no excel e estou tentando criar uma coluna que sinalize o nome do arquivo para modificação, se ele 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 ela contiver caracteres diferentes de AZ, 0-9, - ou _, independentemente do caso.

Alguém sabe de algo que pode funcionar para mim? Hesito em codificar e fazer ifdeclarações massivas , se houver algo rápido e fácil.


Existe um motivo específico para você executar esta tarefa de processamento de texto no Excel? Mesmo se limitando às ferramentas do Microsoft Office, é uma pesquisa e substituição bastante simples no Word. Tabela com duas colunas, nome do arquivo original e nome do arquivo processado.
mpez0

Essas são entradas de índice de um software de terceiros. Este software gera nomes de arquivos que incluem dois pontos, colchetes, e comercial, etc., causando exceções nos programas de conversão. Precisamos limpar os dados no software de terceiros antes da conversão; o fornecedor não fornece uma API para automatizar essa tarefa. Eu tenho uma lista de nomes de arquivos em um arquivo de texto. Estou usando o Excel para criar um sinalizador com base na presença de caracteres especiais em um nome de arquivo. O PowerShell, c # e Java retornam resultados imprecisos porque os caracteres especiais são interpretados como operadores.
dwwilson66

1
Quero ressaltar que você provavelmente está usando a ferramenta errada para isso. Posso pensar em algumas maneiras de fazer isso rapidamente no Notepad ++, por exemplo. Você pode até importar os resultados para o Excel no final e ter uma coluna de 1s e 0s.
Dane

@ Daniel Bom saber sobre NP ++. Vou ter que explorar isso. Eu tenho a ferramenta instalada, mas não tenho muita experiência com ela. Obrigado pela dica.
dwwilson66

Respostas:


19

Nenhum código? Mas é tão curto e fácil, bonito e ... :(

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

Isso é o mais próximo possível da sua pergunta original.

insira a descrição da imagem aqui

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

Você pode usá-lo como qualquer outra fórmula normal do Excel se abrir o editor VBA pela primeira vez com ALT+ F11, inserir um novo módulo (!) E colar o código abaixo.

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

Para usuários novos no RegEx, explicarei seu padrão: [^A-Za-z0-9_-]

[] 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)

O problema é que eu não quero SUBSTITUIR os caracteres, apenas sinalize-os na lista para que eu possa entregá-lo a outra pessoa. Os nomes de arquivos são criados por software de terceiros e precisam ser alterados manualmente dentro desse programa ... Eu só preciso sinalizar sim ou não. Dito isto, acho que posso modificar seu código Substituir para sinalizar a coluna. :)
dwwilson66

para implementar isso ... é apenas uma questão de recortar e colar em um novo módulo e economizar, certo? ou preciso fazer outra coisa? a fórmula =RegExReplace(cell)não é reconhecida .... e estou um pouco enferrujado ao criar novas funções.
dwwilson66

@ dwwilson66 Atualizado!
Nixda 16/10

Ênfase no hífen dentro de RegEx (Este sinal quebra seu padrão se estiver na posição errada)
The Red Pea

7

Usando algo semelhante ao código do nixda, aqui está uma função definida pelo usuário 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

As UDFs são muito fáceis de instalar e usar:

  1. ALT-F11 abre a janela VBE
  2. ALT-I ALT-M abre um novo módulo
  3. cole o material e feche a janela do VBE

Se você salvar a pasta de trabalho, o UDF será salvo com ela. Se você estiver usando uma versão do Excel posterior a 2003, salve o arquivo como .xlsm em vez de .xlsx

Para remover o UDF:

  1. abrir a janela VBE como acima
  2. limpe o código
  3. feche a janela do VBE

Para usar o UDF do Excel:

= IsSpecial (A1)

Para saber mais sobre macros em geral, consulte:

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 detalhes sobre UDFs

As macros devem estar ativadas para que isso funcione !


Por que você usou "_" como um item Ou separado? Pode ser incluído na mesma [] grupo
jstuardo

@jstuardo Apenas para deixar óbvio que o sublinhado é um caractere válido.
Gary Student

O código não deve ser atualizado para If sCh Like "[0-9a-zA-Z ]" Or sCh = "_" Thenque a macro assuma que os espaços são caracteres válidos?
Ovaryraptor 29/11

@Ovaryraptor Você está correto! Eu atualizarei isso amanhã.
Gary Student

2

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

Basta aplicar uma nova regra de formatação condicional aos seus dados que usa a fórmula (extremamente longa) abaixo, onde A1está o primeiro registro na coluna de nomes de arquivos:

=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)

Essa fórmula verifica cada caractere de cada nome de arquivo e determina se seu código ASCII está fora dos valores permitidos. Infelizmente, os códigos de caracteres permitidos não são todos contíguos; é por isso que a fórmula deve usar somas deSUMPRODUCT s. A fórmula retorna o número de caracteres incorretos que existem. Todas as células que retornam um valor maior que 0 são sinalizadas.

Exemplo: insira a descrição da imagem aqui


1

Eu usei uma abordagem diferente para encontrar caracteres especiais. Criei novas colunas para cada um dos caracteres permitidos e, em seguida, usei uma fórmula como esta para contar quantas vezes esse caractere 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 comparei-o com o comprimento total da entrada da linha.

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.