身份证自检验和15位升18位问题-韩志
Access软件网QQ交流学习群(群号码198465573),欢迎您的加入!
首页 >技术文章> Access数据库-模块/函数/VBA


身份证自检验和15位升18位问题

发表时间:2014/4/20 22:28:02 评论(2) 浏览(9835)  评论 | 加入收藏 | 复制
   
摘 要:到今天才知道身份证最后一位是干什么的,希望和我一样还不知道的朋友一起学习下。
正 文:

     到今天才知道身份证最后一位是干什么的,希望和我一样还不知道的朋友一起学习下,也许就我一个人不知道了,哎。在EXCEL里弄了个函数,正好这几天在做这方面的事情。源代码如下:

Function CstIdC(cstid As String) As String
'函数功能:1.输入15位老身份证号码返回18位新号码;2.输入18位身份证号码判断是否正确;3.输入17位身份证号码(不含最后一位)返回18位号码
'函数原理:1.根据前17位数字计算出校验码,与录入的最后一位校验码比对;2.判断年月日是否合理(出生日期应在1900年以后,当前日期之前的合法日期)。
'参数,CstId: 数字组合
'来源:第7天
     Dim checkDate As String   '存储身份证生日
     CstIdC = "OK"    '假设验证都是正确的,返回"OK"
'判断身份证长度是否正确
     If Len(cstid) = 0 Then
         CstIdC = ""
     ElseIf Len(cstid) = 15 Then
         CstIdC = Mid(cstid, 1, 6) & "19" & Mid(cstid, 7, 9) & mod11(Mid(cstid, 1, 6) & "19" & Mid(cstid, 7, 9))
         CstIdC = CstIdC & checkBirthday(CstIdC)
     ElseIf Len(cstid) = 17 Then
         CstIdC = cstid & mod11(cstid) & checkBirthday(cstid & mod11(cstid))
     ElseIf Len(cstid) = 18 Then
         If mod11(Left(cstid, 17)) <> UCase(Right(cstid, 1)) Then
             CstIdC = "校验错误"
         Else
             If checkBirthday(cstid) = "" Then
                 CstIdC = "OK"
             Else
                 CstIdC = checkBirthday(cstid)
             End If
         End If
     End If
End Function
Function mod11(cst17 As String) As String
     Dim wI As Integer    '存储计算得到的每位加权因数
     Dim wSum As Long    '存储身份证每位数字与对应加权因数乘积的和
     Dim modI As Integer    '存储wsum整除11的余数
'使用循环计算wSum值
     Dim i As Integer
     For i = 18 To 2 Step -1
         If Not IsNumeric(Mid(cst17, 19 - i, 1)) Then
             mod11 = "错误"
             Exit Function
         End If
         wI = 2 ^ (i - 1) Mod 11    '计算加权因数
         wSum = wSum + CLng(Mid(cst17, 19 - i, 1)) * wI    '累加身份证数字与对应加权因数的乘积
     Next
     modI = wSum Mod 11   '计算wsum整除11的余数
    '判读校验码
     Select Case 12 - modI
     Case Is < 10
         mod11 = 12 - modI
     Case Is = 10
         mod11 = "X"
     Case Is > 10
         mod11 = 1 - modI
     End Select
End Function
Function checkBirthday(cstid As String) As String
'判断出生日期是否合理
     checkDate = Mid(cstid, 7, 4) & "-" & Mid(cstid, 11, 2) & "-" & Mid(cstid, 13, 2)
     If IsDate(checkDate) Then   '判断输入的身份证号码对应的生日组合是否为日期
         If CDate(checkDate) < "1900-1-1" or CDate(checkDate) >= Date Then    '判断生日是否在合理区间
             checkBirthday = "年龄不合理"
             Exit Function
         End If
     Else
         checkBirthday = "生日错误"
         Exit Function
     End If
     checkBirthday = ""
End Function


 附   件:
点击下载此附件


Access软件网交流QQ群(群号:198465573)
 
 相关文章
一个将15的身份证号升为18位的函数(VB)  【示知  2008/10/10】
[access查询][示例]通过身份证号码提取出生日期、性别、年龄  【gkx219  2008/10/26】
将用户输入的身份证号15位数据转化为18位。  【UMVPS整理  2009/10/27】
一个用于验证18位身份证号码有效性的通用函数  【红尘如烟  2010/8/25】
【access入门】三种方法控制输入15位与18位身份证号码的示例...  【麥田  2011/5/28】
常见问答
技术分类
相关资源
文章搜索
关于作者

韩志

文章分类

文章存档

友情链接