Notifications
Clear all

VBA para remover os caracteres especiais em um intervalo

11 Posts
3 Usuários
0 Reactions
6,005 Visualizações
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Eu queria compartilhar um código.
Ontem eu precisei remover caracateres especiais de um intervalo, deixando somente as letras maiúsculas e minúsculas, os números e o ponto.

A pessoa que me pediu, disse que repete a ação todo mês, mas nem mesmo ele lembra de tudo que precisa remover e as vezes algo passa batido. O objetivo é jogar esse conteúdo de planilha num XML que será lido num sistema dele lá.

Eu criei este código que funcionou muito bem, e por isso eu quis compartilhar:
p.s.: importante criar referência ao Microsoft Scripting Runtime, ou mudar o dicionário para object e usar o CreateObject.

Sub LimparCaracteresEspeciais()
Dim dicCaracteres   As New Scripting.Dictionary
Dim rng             As Excel.Range
Dim x               As Long
    
    Set rng = ActiveSheet.Range("C:D")
    
    With dicCaracteres
'Incluindo no dicionário os itens que poderão permanecer após a substituição
        .Add 1, Chr(1)                                                          'caractere invisivel que apaga tudo
        .Add 46, Chr(46)                                                        'caractere do ponto "."
        For x = 48 To 57:  .Add x, Chr(x): Next                                 'todos os numeros (0 a 9)
        For x = 65 To 91:  .Add x, Chr(x): Next                                 'todas as letras maiusculas ("A" a "Z")
        For x = 97 To 123: .Add x, Chr(x): Next                                 'todas as letras minúsculas ("a" a "z")
        
'Varrendo a tabela ASCII para substituir todos os itens exceto os que existirem no dicionário
        For x = 0 To 255
            If Len(Trim(Chr(x))) <> 0 Then                                      'só roda se o caractere for imprimível, ou visível
                If Not dicCaracteres.Exists(x) Then                             'só roda se o caractere não existir no dicionário
                    rng.Replace What:="~" & Chr(x), Replacement:=vbNullString   'Substituir os caracteres fora do intervalo definido acima, por nulo
                    
                End If
            End If
        Next
    End With
    
    rng.Replace What:=vbNullString, Replacement:=vbNullString                   'Limpar as caixas de busca e substituição após a execução do código
    
    Set rng = Nothing
    
End Sub
 
Postado : 15/01/2015 7:45 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Faaala Fernando, blz cara?

Precisei a um tempo disso, acabei resolvendo assim:

'Remove acentos e caracteres especiais e deixa o texto em caixa alta
Public Function ArrumarTexto(ByVal Caract As Variant) As Variant
'Declaracao de Variaveis
Dim i       As Long
Dim p       As Variant
Dim codiA   As String
Dim codiB   As String

'Caracteres impeditivos
codiA = "àáâãäèéêëìíîïòóôõöùúûüÀÁÂÃÄÈÉÊËÌÍÎÒÓÔÕÖÙÚÛÜçÇñÑ-'´)([]/*-+.,!@#$%¨&§¹²³£¢¬"
'Caracteres substitutivos
codiB = "aaaaaeeeeiiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcCnN                            "
    
    'Inicia o loop em busca dos caracteres impeditivos
    For i = 1 To Len(Caract)
        p = InStr(codiA, Mid(Caract, i, 1))
        'Verifica a existencia dos caracteres no texto
        If p > 0 Then
            'Realiza a substituicao
            Mid(Caract, i, 1) = Mid(codiB, p, 1)
        End If
    Next

'Retorno do texto
ArrumarTexto = UCase(Application.WorksheetFunction.Trim(Caract))
     
End Function

E esse para remover número:

'Remove acentos e caracteres especiais e deixa o texto em caixa alta
Public Function RemoverNumero(ByVal Caract As Variant) As Variant
'Declaracao de Variaveis
Dim i           As Long

    For i = Len(Caract) To 1 Step -1
        If IsNumeric(Mid(Caract, i, 1)) Then
            Caract = Replace(Caract, Mid(Caract, i, 1), "")
        End If
    Next

'Retorno do texto
RemoverNumero = UCase(Application.WorksheetFunction.Trim(Caract))
    
End Function

Fiz função pois precisava em textbox distintos e necessidades diferentes... então segue mais uma contribuição e opção.

Acredito não ser necessário habilitar nada...

Qualquer coisa da o grito.
Abraço

 
Postado : 15/01/2015 8:23 am
(@jonascruz)
Posts: 0
New Member
 

Bernardo, boa tarde.

Se me permite uma pequena modificação para atender uma pequena necessidade que tenho onde seu código é de grande ajuda, preciso retirar os caracteres 32 e 160 apenas, que "sujam" números.
Eu preciso selecionar um intervalo de números e arrumar, retirando esses caracteres.

Por favor, poderia indicar se estou no caminho certo?

Sub LimpaDados()
'
' LimpaDados Macro
' Limpa Dados com caracteres 32 e 160

Dim cell As Object

    For Each cell In Selection
    ArrumarTexto (cell)
    Next cell

End Sub

'Remove acentos e caracteres especiais e deixa o texto em caixa alta
Public Function ArrumarTexto(ByVal Caract As Variant) As Variant
'Declaracao de Variaveis
Dim i       As Long
Dim p       As Variant
Dim codiA   As String
Dim codiB   As String

'Caracteres impeditivos (32 e 160)
codiA = "  " 

'Caracteres substitutivos (nenhum)
codiB = ""
    
    'Inicia o loop em busca dos caracteres impeditivos
    For i = 1 To Len(Caract)
        p = InStr(codiA, Mid(Caract, i, 1))
        'Verifica a existencia dos caracteres no texto
        If p > 0 Then
            'Realiza a substituicao
            Mid(Caract, i, 1) = Mid(codiB, p, 1)
        End If
    Next

'Retorno do texto
ArrumarTexto = Application.WorksheetFunction.Trim(Caract)
     
End Function
 
Postado : 28/04/2016 12:16 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Bom dia jonascruz,

Me desculpe a demora.

Vê se ajuda:

Option Explicit

' LimpaDados Macro
Sub LimpaDados()
'Declaracao de Variaveis
Dim cell As Object

    For Each cell In Selection
        RemoveChr (cell)
    Next cell

End Sub

'Remove os caracteres 32 e 160
Public Function RemoveChr(ByVal Caract As Variant) As Variant

Dim i           As Long

    'Inicia o loop em busca dos caracteres impeditivos
    For i = Len(Caract) To 1 Step -1
        'Verifica a existencia dos caracteres no texto
        If InStr(1, Chr(32) & Chr(160), Mid(Caract, i, 1)) > 0 Then
            'Realiza a remoção
            Caract = Replace(Caract, Mid(Caract, i, 1), "")
        End If
    Next

    'Retorno da célula
    RemoveChr = Application.WorksheetFunction.Trim(Caract)
    
End Function

Qualquer coisa da o grito.
Abraço

 
Postado : 02/05/2016 8:52 am
(@jonascruz)
Posts: 0
New Member
 

Bernardo, muitíssimo obrigado por sua ajuda. Funcionou perfeitamente para a minha necessidade.

 
Postado : 07/05/2016 8:06 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Que top!
Só no planilhando encontro esse tipo de coisa!
Era exatamente o que estava procurando (em especial a solução do Bernardo, pois também preciso usar como fórmula...)!!!
Vlw galera!!!

 
Postado : 09/08/2016 10:14 am
(@djunqueira)
Posts: 0
New Member
 

Seguindo a linha de contribuição p/ substituição de caracteres indesejados...

Para o código abaixo eu montei uma tabela chamada de 'TCorreção' com duas colunas onde eu relacionei um conjunto de caracteres a serem substituídos por uma letra acentuada por conta de importação de texto sem a codificação correta.
O texto importado varia muito e não consegui fazer com q ele mantivesse os caracteres acentuados corretamente todas as vezes q eu importava.

Sub LimparCaracteresEspeciais()

' Declaracao de Variaveis
Dim Linha As Range
Dim TxtErrado As String
Dim TxtCorreto As String
' Rotina de tratamento de erros
On Error GoTo TrataErro
Application.ScreenUpdating = False ' Interrompe atualização da tela temporariamente

' Loop através de cada linha na tabela.
For Each Linha In [TCorreção].Rows
    ' Associa as variáveis com cada célula na linha atual.
        TxtErrado = Linha.Columns(1).Value
        TxtCorreto = Linha.Columns(2).Value
       ' MsgBox TxtErrado & " substituído por " & TxtCorreto
        Columns("A:S").Select ' Demarca as colunas em que será feita a varredura
        Selection.Replace What:=TxtErrado, Replacement:=TxtCorreto, LookAt:=xlPart, _
            SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
            ReplaceFormat:=False
Next Linha

Application.ScreenUpdating = True ' Retorna com atualização da tela

TrataErro: ' Tratamento de erro.
    If Err <> 0 Then
        Dim Msg As String
        Msg = "Erro nº " & Str(Err.Number) & Chr(13) & Err.Description _
            & Chr(13) & "Certifique-se de que há uma tabela na planilha."
            MsgBox Msg, , "Error"
    End If

End Sub
 
Postado : 10/08/2016 8:47 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

DJunqueira,

Tem como disponibilizar um modelo de como fica as informações na planilha?

Att.
Bernardo maia

 
Postado : 10/08/2016 10:51 am
(@djunqueira)
Posts: 0
New Member
 

Claro, segue a planilha na qual eu usei a macro.

 
Postado : 10/08/2016 5:23 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

DJunqueira, uma vez precisei disso no trabalho e tive que fazer trocentos Crtl+U kk
.
Só um detalhe, tentei aumentar a matriz do TCorreção, mas tá bloqueado!!!

 
Postado : 11/08/2016 6:55 am
(@djunqueira)
Posts: 0
New Member
 

Testei aqui e não tive problema algum, qual sua versão do Excel?

 
Postado : 11/08/2016 8:05 pm