Erika
Erika

Reputation: 290

Excel invisible question mark

I have an extracted information from a system into an Excel file. The names "Leone" seem the same but Excel recognize it differently.

Leone

​Leone

The length of the string is not the same, and if I check the value with VBA an invisible ? is the first character.

Could you help me how to get rid of the invisible characters?

enter image description here

Upvotes: 3

Views: 4734

Answers (4)

Imran Malek
Imran Malek

Reputation: 1719

To remove multiple occurrences of non-ascii characters from all cells of your range you can use this.

Option Explicit

Sub test()
    Dim regEx As Object
    Dim temparray() As String
    Dim myrange As Range
    Dim lrow As Long
    Dim lcol As Long
    Dim counter As Long
    Dim i As Long
    Dim j As Long

    Set regEx = CreateObject("vbscript.regexp")

    With regEx
        .Pattern = "[^\u0000-\u007F]"
        .MultiLine = False
        .Global = True
        .IgnoreCase = False
    End With
    'set your last row and column
    lrow = 5
    lcol = 5

    ReDim temparray(1 To lrow, 1 To lcol)
    Set myrange = Sheets("Sheet1").Range(Cells(1, 1), Cells(lrow, lcol))

    Application.ScreenUpdating = False

    counter = 0

    For i = 1 To lrow
        For j = 1 To lcol
            temparray(i, j) = regEx.Replace(myrange.Cells(i, j).Value, "")
          counter = counter + 1
        Next j
    Next i

    myrange.Value = temparray

    Application.ScreenUpdating = True
End Sub

Upvotes: 0

Mrig
Mrig

Reputation: 11702

To get rid of all invisible ? you may try this.

Sub CleanUnicode()
    Dim n As Long, strClean As String, strChr As String
    Dim ws As Worksheet

    Set ws = ThisWorkbook.Sheets("Sheet3")  'change Sheet3 to data sheet
    For Each cel In ws.Range("A1:A10")      'change A1:A10 to working range
        strClean = cel.Value
        For n = Len(strClean) To 1 Step -1
            strChr = Mid(strClean, n, 1)
            If AscW(strChr) = 8203 Then     '? is unicode character 8203
                strClean = Replace(strClean, strChr, "")
            End If
        Next
        cel.Value = WorksheetFunction.Trim(strClean)
    Next cel
End Sub

Instead of If AscW(strChr) = 8203 Then you can also use If AscW(strChr) > 255 Then.

EDIT 1 : As per the suggestion of @YowE3K. Assuming you only have Unicode 8203 in cells to be replaced.

Sub CleanUnicode()
    Dim n As Long, strClean As String, strChr As String
    Dim ws As Worksheet

    Set ws = ThisWorkbook.Sheets("Sheet3")  'change Sheet3 to data sheet
    For Each cel In ws.Range("A1:A10")      'change A1:A10 to working range
        cel.Value = Replace(cel.Value, ChrW(8203), "")
    Next cel
End Sub

Got this from here.

Upvotes: 2

Vityata
Vityata

Reputation: 43595

In general this is strange - this is how chrome renders the HTML from the question:

enter image description here

This is a workaround, that checks the characters of the string and builds a new one if one of them is equal to 63. Pretty much like a simple replace function:

Public Function removeInvisible(rngRange As Range) As String

    Dim cnt As Long

    For cnt = 1 To Len(rngRange)
        If AscW(Mid(rngRange, cnt, 1)) <> 8203 Then
            removeInvisible = removeInvisible & Mid(rngRange, cnt, 1)
        End If
    Next cnt

End Function

Upvotes: 1

Spangen
Spangen

Reputation: 4730

If the text has come from a copy/paste it might have taken in some other non printable characters. These might be displayed in the VBA editor as ? which is often the way that unicode characters are rendered when the font does not support them.

I would try the formula =CODE(LEFT(A3,1)) in one of the cells to see what the Unicode code point of the invisible character was.

If it turns out to be a non ascii chat then you could write a macro to strip out the characters that are problematic based on their code values.

Upvotes: 0

Related Questions