2008-11-04 61 views
1

无效字符我最近继承VBA宏,需要有验证逻辑添加到它。我需要能够确定基于文本的单元格中的任何字符是否为非ASCII字符(即,具有二进制值> 0x7F)。单元格可能包含一些需要保留的运输控制值(特别是换行符)(因此CLEAN功能不适用于此验证)。我试过了IsText函数,但发现它会将UTF-8字符序列解释为有效的文本(我不想)。识别基于文本的单元格

我并不需要实际操作字符串,我只是想显示错误到运行宏来告诉他,有一个特定的细胞无效(非ASCII)字符的用户。

回答

2

的ASC(文字)命令将一个字符转换成它的ASCII值。

十六进制(ASC(文字))将字符转换到它的十六进制值。

一旦你这样做,你可以很容易地做一些比较,以确定如果数据是坏的,如果需要折腾的错误。

下面是一些示例代码: http://www.freevbcode.com/ShowCode.asp?ID=4486

4

如果你想要一个纯粹的技术方法,您可以尝试正则表达式。将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,正则表达式模式似乎是语言无关。

+0

这是一个很好的答案,与我的upvoting完全当之无愧。我在过去使用过正则表达式,并发现它们是有用的,强大的,并且是一个只写代码片段的完美例子:上帝在解析第三个嵌套匹配时遇到了困难。因此,它工作,效率很高,但不要预计未来的代码维护人员会保留您的正则表达式... – jpinto3912 2011-11-09 22:44:29

0
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 
+0

谢谢`IsGoodAcii`拼写错误。但它仍然有效! – Gutzofter 2011-07-12 00:20:26