-1

I have a VB code for excel here that removes the special characters. My question is why is some of the special characters are removed like for example some of the special characters in column c didn't change or got removed.

Code:

Sub Invalid()



    Dim e

    For Each e In Array("–", "€", "â", "¦", "Â", "®", "®", "—", "Ã", "ña", "±a", "¡c", "±", "'", "–", "ó", "​", "…", "®", "‹")

        If e Like "[–]" Then
            Columns("a").Replace "–", ""
            Columns("b").Replace "–", ""
            Columns("c").Replace "–", ":"
            Columns("d").Replace "–", ""
            Columns("e").Replace "–", ":"
       Else
       
        If e Like "[ó]" Then
            Columns("a").Replace "ó", ""
            Columns("b").Replace "ó", ""
            Columns("c").Replace "ó", "o"
            Columns("d").Replace "ó", ""
            Columns("e").Replace "ó", ""
       Else
       
         If e Like "[ña]" Then
            Columns("a").Replace "ña", ""
            Columns("b").Replace "ña", ""
            Columns("c").Replace "ña", ""
            Columns("d").Replace "ña", ""
            Columns("e").Replace "ña", ""
       Else
       
         If e Like "[​]" Then
            Columns("a").Replace "​", ""
            Columns("b").Replace "​", ""
            Columns("c").Replace "​", ""
            Columns("d").Replace "​", ""
            Columns("e").Replace "​", ""
       Else
       
         If e Like "[…]" Then
            Columns("a").Replace "…", ""
            Columns("b").Replace "…", ""
            Columns("c").Replace "…", ""
            Columns("d").Replace "…", ""
            Columns("e").Replace "…", ""
       Else
         If e Like "[®]" Then
            Columns("a").Replace "®", ""
            Columns("b").Replace "®", ""
            Columns("c").Replace "®", ""
            Columns("d").Replace "®", ""
            Columns("e").Replace "®", ""
      Else
      
         If e Like "[€]" Then
            Columns("a").Replace "€", ""
            Columns("b").Replace "€", ""
            Columns("c").Replace "€", ""
            Columns("d").Replace "€", ""
            Columns("e").Replace "€", ""
      Else
      
         If e Like "[â]" Then
            Columns("a").Replace "â", ""
            Columns("b").Replace "â", ""
            Columns("c").Replace "â", ""
            Columns("d").Replace "â", ""
            Columns("e").Replace "â", ""
      Else
      
         If e Like "[¦]" Then
            Columns("a").Replace "¦", ""
            Columns("b").Replace "¦", ""
            Columns("c").Replace "¦", ""
            Columns("d").Replace "¦", ""
            Columns("e").Replace "¦", ""
      Else
      
         If e Like "[Â]" Then
            Columns("a").Replace "Â", ""
            Columns("b").Replace "Â", ""
            Columns("c").Replace "Â", ""
            Columns("d").Replace "Â", ""
            Columns("e").Replace "Â", ""
      Else
      
         If e Like "[®]" Then
            Columns("a").Replace "®", ""
            Columns("b").Replace "®", ""
            Columns("c").Replace "®", ""
            Columns("d").Replace "®", ""
            Columns("e").Replace "®", ""
      Else
      
         If e Like "[®]" Then
            Columns("a").Replace "®", ""
            Columns("b").Replace "®", ""
            Columns("c").Replace "®", ""
            Columns("d").Replace "®", ""
            Columns("e").Replace "®", ""
      Else
      
         If e Like "[—]" Then
            Columns("a").Replace "—", ""
            Columns("b").Replace "—", ""
            Columns("c").Replace "—", ""
            Columns("d").Replace "—", ""
            Columns("e").Replace "—", ""
      Else
      
         If e Like "[Ã]" Then
            Columns("a").Replace "Ã", ""
            Columns("b").Replace "Ã", ""
            Columns("c").Replace "Ã", ""
            Columns("d").Replace "Ã", ""
            Columns("e").Replace "Ã", ""
      Else
      
         If e Like "[±a]" Then
            Columns("a").Replace "±a", ""
            Columns("b").Replace "±a", ""
            Columns("c").Replace "±a", ""
            Columns("d").Replace "±a", ""
            Columns("e").Replace "±a", ""
      Else
      
         If e Like "[¡c]" Then
            Columns("a").Replace "¡c", ""
            Columns("b").Replace "¡c", ""
            Columns("c").Replace "¡c", ""
            Columns("d").Replace "¡c", ""
            Columns("e").Replace "¡c", ""
      Else
      
         If e Like "[±]" Then
            Columns("a").Replace "±", ""
            Columns("b").Replace "±", ""
            Columns("c").Replace "±", ""
            Columns("d").Replace "±", ""
            Columns("e").Replace "±", ""
      Else
      
         If e Like "[']" Then
            Columns("a").Replace "'", ""
            Columns("b").Replace "'", ""
            Columns("c").Replace "'", ""
            Columns("d").Replace "'", ""
            Columns("e").Replace "'", ""
        Else
        
        If e Like "[–]" Then
            Columns("a").Replace "–", ""
            Columns("b").Replace "–", ""
            Columns("c").Replace "–", ""
            Columns("d").Replace "–", ""
            Columns("e").Replace "–", ""
        Else
        
        If e Like "[‹]" Then
            Columns("a").Replace "‹", ""
            Columns("b").Replace "‹", ""
            Columns("c").Replace "‹", ""
            Columns("d").Replace "‹", ""
            Columns("e").Replace "‹", ""

    Else
        
        If e Like "[–]" Then
            Columns("a").Replace "–", ""
            Columns("b").Replace "–", ""
            Columns("c").Replace "–", ":"
            Columns("d").Replace "–", ""
            Columns("e").Replace "–", ""
        


End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
Next


End Sub
braX
  • 11,506
  • 5
  • 20
  • 33
  • 4
    That is a fine example of the [for-if antipattern](https://devblogs.microsoft.com/oldnewthing/20111227-00/?p=8793). – GSerg Aug 10 '20 at 18:42
  • Apart from the above: VBA puts no special meaning in HTML-specific sequences such as `®` or `—`, so those are taken literally. Then you place these literal strings inside the `[]` brackets of the `Like` pattern, thus requesting an OR-match on any of the individual letters (which therefore will only match when `e` is one literal character to begin with). Finally, you [cannot have](https://stackoverflow.com/a/25260658/11683) literal Unicode characters in the VBA source code. – GSerg Aug 10 '20 at 18:47
  • What would be a better solution for this? – user14082640 Aug 10 '20 at 19:38

2 Answers2

0

Shorter:

Sub Invalid()

    Dim e

    For Each e In Array("–", "€", "â", "¦", "Â", "®", "®", "—", _
                        "Ã", "ña", "±a", "¡c", "±", "'", "–", "ó", _
                        "​", "…", "®", "‹")

        Select Case e
            Case "–"
                Range("A1:B1,D1").EntireColumn.Replace e, ""
                Range("C1,E1").EntireColumn.Replace e, ":"
            Case "ó"
                Range("A1:B1,D1:E1").EntireColumn.Replace e, ""
                Range("C1").EntireColumn.Replace e, "o"
            Case "–"
                Range("A1:B1,D1:E1").EntireColumn.Replace e, ""
                Range("C1").EntireColumn.Replace e, ":"
            Case Else
                Range("A:E").Replace e, ""
        End Select
    Next e

End Sub
Tim Williams
  • 154,628
  • 8
  • 97
  • 125
-3

Long time ago I found a function that (I think) can do what you want, in a better way:

Public Function RepLetters(txt As String) As String
 
Dim SAcentos As String
Dim SSemAcentos As String
Dim STemp As String
Dim i As Long

'All letters to be replaced
SAcentos = "àáâãäèéêëìíîïòóôõöùúûüÀÁÂÃÄÈÉÊËÌÍÎÒÓÔÕÖÙÚÛÜçÇñÑ"
  
'Letters to replace on
SSemAcentos = "aaaaaeeeeiiiiooooouuuuAAAAAEEEEIIIOOOOOUUUUcCnN"
  
'sTemp is the received string
STemp = text
  
' Loop through every letter of 'sAcentos' and replace by
' corresponding letter in 'sSemAcentos'
For i = 1 To Len(SAcentos)
    STemp = Replace(STemp, Mid$(SAcentos, i, 1), Mid$(SSemAcentos, i, 1))
Next i
  
'return new string
RepLetter = STemp
  
End Function

You will need to adapt sAcentos and sSemAcentos for your needs. This function can be called directly on spreadsheet too.