VBA使用Asc函数校验邮箱非法字符返回结果错误如何解决
问题根因
- VBA 不支持连续比较表达式
你代码中(58 < xChar < 64)、(90 < xChar < 97)这类写法不符合VBA语法规则,VBA会按从左到右顺序分步计算:
- 第一步先判断
58 < xChar,得到布尔值True(对应数值-1)或False(对应数值0) - 第二步再用第一步得到的数值和64比较,比如xChar=97(小写a,合法字符),第一步
58<97返回True=-1,第二步-1 < 64也返回True,最终整个条件判定为成立,所以第一个合法的a字符也会被误判为非法,导致始终返回1。
- 合法字符的ASCII范围判定逻辑错误
你当前的判断条件没有正确覆盖要求的合法字符(数字、字母、@、_、.),包括点.、@、下划线_都不在你设定的合法范围内,也会导致误判。
修正后代码
Function FirstNotValid(xStr As String) As Long Dim xChar As Integer Dim I As Integer ' 初始返回0代表所有字符都合法 FirstNotValid = 0 For I = 1 To Len(xStr) xChar = Asc(Mid(xStr, I, 1)) ' 拆分判断条件,明确合法范围,不在合法范围即返回当前位置 If Not ( _ (xChar >= 48 And xChar <= 57) Or _ ' 数字0-9 (xChar >= 65 And xChar <= 90) Or _ ' 大写字母A-Z (xChar >= 97 And xChar <= 122) Or _ ' 小写字母a-z xChar = 64 Or _ ' @符号 xChar = 46 Or _ ' 点符号. xChar = 95 _ ' 下划线_ ) Then FirstNotValid = I Exit For End If Next End Function Sub test() Debug.Print FirstNotValid("ab?!an@gmail.com") ' 输出3,符合预期 End Sub
内容的提问来源于stack exchange,提问作者Binnnnn5
相关产品推荐
相关产品推荐

