龙空技术网

身份证号码编码规则及校验位校验算法(六)(一)

张喳呼呐617 50

前言:

如今同学们对“验证身份证号码的算法”大体比较着重,看官们都想要分析一些“验证身份证号码的算法”的相关文章。那么小编同时在网摘上搜集了一些有关“验证身份证号码的算法””的相关资讯,希望姐妹们能喜欢,咱们快快来学习一下吧!

身份证号码编码规则及校验位校验算法(六)

六、自定义函数

(一)能运行VBA的,可以使用自定义函数。Alt+F11打开VB编辑器,插入模块1,复制以下自定义函数,粘贴到模块1。

Function sfzjy(sfzhm As String) As String

Dim he, yushu As Integer '定义乘积和、余数

If Len(sfzhm) <> 18 Then'身份证号码是否为18位

sfzjy = "检查位数"

Exit Function

End If

If IsNumeric(Left(sfzhm, 17)) = False Or Right(sfzhm, 1) = "x" Then '前17位不是数字或第18位为小写x均非法字符

sfzjy = "非法字符"

Exit Function

End If

If Left(sfzhm, 2) < 11 Or Left(sfzhm, 2) > 65 Then '省、自治区、直辖市编号是否在11至65范围内

sfzjy = "检查前2位"

Exit Function

End If

If Mid(sfzhm, 7, 4) < Val(Year(Now())) - 100 Or Mid(sfzhm, 7, 4) > Val(Year(Now())) Then '出生年份超过100岁或小于0岁,提示检查

sfzjy = "检查第7至10位"

Exit Function

End If

If Mid(sfzhm, 11, 2) = 0 Or Mid(sfzhm, 11, 2) > 12 Then '出生月份等于00或大于12,提示检查

sfzjy = "检查第11至12位"

Exit Function

End If

If Mid(sfzhm, 13, 2) = 0 Or Mid(sfzhm, 13, 2) > 31 Then '出生日等于00或大于31,提示检查

sfzjy = "检查第11至12位"

Exit Function

End If

he = Mid(sfzhm, 1, 1) * 7 + Mid(sfzhm, 2, 1) * 9 + Mid(sfzhm, 3, 1) * 10 + Mid(sfzhm, 4, 1) * 5 + Mid(sfzhm, 5, 1) * 8 + Mid(sfzhm, 6, 1) * 4 + Mid(sfzhm, 7, 1) * 2 + Mid(sfzhm, 8, 1) * 1 + Mid(sfzhm, 9, 1) * 6 + Mid(sfzhm, 10, 1) * 3 + Mid(sfzhm, 11, 1) * 7 + Mid(sfzhm, 12, 1) * 9 + Mid(sfzhm, 13, 1) * 10 + Mid(sfzhm, 14, 1) * 5 + Mid(sfzhm, 15, 1) * 8 + Mid(sfzhm, 16, 1) * 4 + Mid(sfzhm, 17, 1) * 2 '计算身份证前17位各位与权重的乘积和。

yushu = he Mod 11 '计算乘积和除以11的余数

If CStr(Choose(yushu + 1, 1, 0, "X", 9, 8, 7, 6, 5, 4, 3, 2)) <> CStr(Right(sfzhm, 1)) Then '计算出的校验码与身份证最后一位是否相符

sfzjy = "不通过"

Else

sfzjy = "通过"

End If

End Function

(二)单个身份证号码校验。在C1单元格输入身份证号码,在同一工作表除C1外的任一单元格输入自定义函数:= sfzjy(C1)。

(三)批量身份证号码校验。同嵌套函数。

标签: #验证身份证号码的算法