Excel invisible question mark

拈花ヽ惹草 提交于 2020-01-03 21:11:04

问题


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?


回答1:


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.




回答2:


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

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



回答3:


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.




回答4:


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


来源:https://stackoverflow.com/questions/46724599/excel-invisible-question-mark

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!