无效字符我最近继承VBA宏,需要有验证逻辑添加到它。我需要能够确定基于文本的单元格中的任何字符是否为非ASCII字符(即,具有二进制值> 0x7F)。单元格可能包含一些需要保留的运输控制值(特别是换行符)(因此CLEAN功能不适用于此验证)。我试过了IsText函数,但发现它会将UTF-8字符序列解释为有效的文本(我不想)。识别基于文本的单元格
我并不需要实际操作字符串,我只是想显示错误到运行宏来告诉他,有一个特定的细胞无效(非ASCII)字符的用户。
无效字符我最近继承VBA宏,需要有验证逻辑添加到它。我需要能够确定基于文本的单元格中的任何字符是否为非ASCII字符(即,具有二进制值> 0x7F)。单元格可能包含一些需要保留的运输控制值(特别是换行符)(因此CLEAN功能不适用于此验证)。我试过了IsText函数,但发现它会将UTF-8字符序列解释为有效的文本(我不想)。识别基于文本的单元格
我并不需要实际操作字符串,我只是想显示错误到运行宏来告诉他,有一个特定的细胞无效(非ASCII)字符的用户。
的ASC(文字)命令将一个字符转换成它的ASCII值。
十六进制(ASC(文字))将字符转换到它的十六进制值。
一旦你这样做,你可以很容易地做一些比较,以确定如果数据是坏的,如果需要折腾的错误。
如果你想要一个纯粹的技术方法,您可以尝试正则表达式。将VBA中的引用添加到Microsoft Scripting库中,然后尝试此代码。它看起来有点复杂,但是你会被正则表达式所能做的事情吓倒,并且你将会有一个有用的工具供将来使用。如果在串c任何字符不是(^)范围为0(X00)〜127(0x7F部分)
Function IsTooHigh(c As String) As Boolean
Dim RegEx As Object
Set RegEx = CreateObject("vbscript.regexp")
With RegEx
.Global = True
.MultiLine = True
.Pattern = "[^\x00-\x7F]"
End With
IsTooHigh = RegEx.Test(c)
End Function
该函数给出了TRUE。
您可以谷歌“正则表达式”,无论您需要做的,从几乎任何语言把答案,因为像SQL,正则表达式模式似乎是语言无关。
Function IsGoodAscii(aString as String) as Boolean
Dim i as Long
Dim iLim as Long
i=1
iLim=Len(aString)
While i<=iLim
If Asc(Mid(aString,i,1))>127 then
IsGoodAscii=False
Exit Function
EndIf
i=i+1
Wend
IsGoodAscii=True
End Function
谢谢`IsGoodAcii`拼写错误。但它仍然有效! – Gutzofter 2011-07-12 00:20:26
这是一个很好的答案,与我的upvoting完全当之无愧。我在过去使用过正则表达式,并发现它们是有用的,强大的,并且是一个只写代码片段的完美例子:上帝在解析第三个嵌套匹配时遇到了困难。因此,它工作,效率很高,但不要预计未来的代码维护人员会保留您的正则表达式... – jpinto3912 2011-11-09 22:44:29