如何在Excel中查找隐藏的字符

时间:2019-03-07 18:06:26

标签: excel vba character

今天我有一个奇怪的问题。在excel中看到的文本与程序看到的文本不同。

在我的牢房中,我看到了。

  

[NOM DU GARANT],加拿大特别指挥所和社会团体(‍‍-après le«garant»)

但是当我将其加载到VBA中的变量中并在我的直接窗口中将其打印出来时,得到以下内容。

  

?sText

     

[NOM DU GARANT],加拿大特别指挥所和社会团体(?????????aprèsle«garant»)

当我在此处粘贴单元格时,这就是我得到的。

  

[NOM DU GARANT],加拿大特别指挥官和社会总指挥官(arpésle«garant»)

当我进入该单元格时,我可以删除“隐藏”字符。

我的问题是如何找到/删除/看到这些隐藏的字符?

还有一种方法可以缓解此问题。我认为这些问题来自人们从法语MS Word应用程序复制并粘贴到此Excel单元格中的情况(我没有具体的证据来支持这一点)。

2 个答案:

答案 0 :(得分:3)

问题是VBA编辑器不显示大多数UNICODE字符。具体来说,它的显示字符能力仅限于Windows代码页1252(8字节字符)上的字符。

它可以操纵较高的字符,但是它们不会在立即窗口(或消息框)中显示。

我不确定您为什么觉得需要删除这些字符,但是:

您可以通过一次显示每个字符并转换为标准字符代码和Unicode字符代码来确定错误的字符。

在Excel中,您可以这样做:

A1:  your_text_string
B2:  =MID($A$1,ROWS($1:1),1)
C2:  =CODE(B2)
D2:  =UNICODE(B2)

选择B2:D2并根据需要填写。

您可以在VBA中执行类似的操作。

您的文本字符串包含Unicode ZWJ(零宽度连接符)字符,其十进制代码为8205。因此,尽管这在您的工作表上可以正常使用,但在VBA中将其转换为?编辑器。

如果需要删除它们,可以在工作表上使用

=SUBSTITUTE(A1,UNICHAR(8205),"")

或等效的VBA代码:

replace([a1],chrw(8205),"")

如果您不熟悉,建议在Internet上搜索ZWJ,VBA ChrW函数和Excel UNICHAR函数。

如果这不是一个孤立的实例,但是您需要一个例程来删除VBA编辑器无法显示的任何字符,则可以尝试以下操作:

Option Explicit
Function removeChars(s As String)
    Dim i As Long, l As Long, sTemp As String
    Dim ch As String

For i = 1 To Len(s)
    ch = Mid(s, i, 1)
    If AscW(ch) <= 255 Then
        sTemp = sTemp & ch
    End If
Next i    

removeChars = sTemp

End Function

为了显示效果,下面是从原始文本生成的MsgBox和上面的removeChars UDF生成的文本的屏幕截图:

enter image description here

enter image description here

我不知道它会不会更快,但这是另一个使用正则表达式的UDF,它也可以执行相同的操作:

Option Explicit
Function removeChars(s As String)
    Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
With RE
    .Pattern = "[^\x00-\xFF]+"
    .Global = True
    removeChars = .Replace(s, "")
End With

End Function

可以使用早期绑定来加快最后一个UDF的速度,如果要处理的字符串很多,可以在VBA数组中进行处理。

答案 1 :(得分:1)

您可以通过比较Len(Range.Text)Len(Range.Value2)来识别具有此类文本的单元格。

您可以尝试使用StrConv(string, vbFromUnicode)StrConv(string, vbUnicode)

您可以使用WorksheetFunction.Clean()对其进行清理(仅适用于较低的ASCII码)。
如果清理不起作用,我将尝试找出不同的字符代码e。 G。 Debug.Print Asc(Mid(Range.Value2, 1, 1))来构建,而构建一个难度更高的Replace函数。


如果只想保留一组预定义的字符,这是一个简单的功能:

Private Function ReducedCharset(ByRef s As String) As String
    Dim i As Long
    Dim c As String
    Dim Temp As String
    Temp = ""
    For i = 1 To Len(s)
        c = Mid(s, i, 1)
        If c Like "[0-9A-Za-z€ÄÖÜßäöü]" Then
            Temp = Temp & c
        End If
    Next i
    ReducedCharset = Temp
End Function