今天我有一个奇怪的问题。在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单元格中的情况(我没有具体的证据来支持这一点)。
答案 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生成的文本的屏幕截图:
我不知道它会不会更快,但这是另一个使用正则表达式的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