ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 35948|回复: 27

[分享] 身份证号码校验实例

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2011-5-31 16:18 | 显示全部楼层 |阅读模式
本帖最后由 474589791 于 2011-12-14 21:43 编辑

  身份证号码是按照一定规律编制的,是个人身份的有效证明,每个人只有一个号码,且不会重复,因而被各单位各部门广泛应用在相关名册中。在大量的身份证号码录入过程中,由于抄写或录入等原因,可能会弄错了某位数字,如果录错了任何一位数字,计算出来的校验码就不一样。根据这一特点,本函数可以对已录入的大批量身份证号码进行校验,如果校验未通过,则说明你录入的号码中必定是某位数字错了,应及时更正,以保证身份证号码正确有效,如果录入的是第一代15位身份证号码,本函数将返回18位号码,使身份证号码保持统一的位数。
  代码如下:


Function IDcheck(ID)                                                        '身份证号码校验函数
Dim s, i As Integer
Dim e, z As String
Part1: '----------------------------身份证号码合法性检查---------------------------------------
If Not (Len(ID) = 18 Or Len(ID) = 15) Then                                            '位数检验
   IDcheck = "位数错误"
   Exit Function
   Else
   If Len(ID) = 15 Then ID = Left(ID, 6) & "19" & Right(ID, 9)
   If IsNumeric(Left(ID, 17)) = False Or InStr(ID, ".") > 0 Then                      '字符检验
      IDcheck = "字符错误"
      Exit Function
   End If
   On Error Resume Next                                                               '日期检验
   If DateValue(Mid(ID, 7, 4) & "-" & Mid(ID, 11, 2) & "-" & Mid(ID, 13, 2)) < 1 Or _
      DateValue(Mid(ID, 7, 4) & "-" & Mid(ID, 11, 2) & "-" & Mid(ID, 13, 2)) > Date Then
      IDcheck = "日期错误"
      Exit Function
   End If
End If
Part2: '-----------------------------校验码的生成及检查----------------------------------------
s = 0
For i = 1 To 17
   s = s + Val(Mid(ID, 18 - i, 1)) * (2 ^ i Mod 11)
Next
e = Mid("10X98765432", (s Mod 11) + 1, 1)                                           '生成校验码
If Len(ID) = 18 Then
   z = UCase(Right(ID, 1))
   If z = e Then                                                                    '校验码对比
      IDcheck = "通过"
      Else
      IDcheck = "校验未通过"                   '如果要返回校验码,请把本行语句改为:IDcheck = e
   End If
   Else
   IDcheck = ID & e                                                         '15位身份证号码升位
End If
End Function                                                      '编写 474589791 2011年6月11日




使用方法:

一、建立函数 

1、打开excel,点击菜单的“工具→宏→录制新宏”,弹出录制新宏对话框。

  


2、在“保存在”下面选择“个人宏工作簿”,点击确定。(选择个人宏工作簿有2大好处:①使本函数可应用于当前计算机中所有的excel工作表;②不受宏安全性设置高低的影响。)




3、在弹出的录制宏工具中点击“停止录制”按钮,结束宏的录制。




4、点击菜单的“工具→宏→Visual Basic 编辑器”,打开编辑器。



5、在编辑器中可以看到刚才录制的代码“Sub macrol() ”,还有录制时间等内容。选中编辑器中的代码并删除。
     注:如果编辑器中没有出现PERSONAL.XLS - 模块1(代码),请在左边“工程资源管理器”中找到PEROSNAL.XLS下面的模块1并双击。




6、把以上代码复制到编辑器中,保存并退出编辑器。至此,你就可以使用本函数了。



 

二、函数的使用

1、打开名册,点击身份证号码后面用于存放校验结果的空白单元格,点击插入函数按钮 fx ,弹出插入函数对话框。




2、在“选择类别”中选择“用户定义”类。




3、可以看到“选择函数”下面出现了刚才保存的 PERSONAL.XLS!IDcheck 函数,选中该函数,点击确定按钮,弹出“函数参数”对话框。




4、点击工作表上对应的身份证号码单元格(下图为A2单元格),点击“确定”按钮。




5、然后向下填充,得到其他身份证号码的检验结果。


评分

5

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-6-11 23:01 | 显示全部楼层
很不错,收藏学习

TA的精华主题

TA的得分主题

发表于 2011-6-12 09:58 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

  身份证号码校验函数为我识别了假身份证号码

  前几天一居民为了提前领取老人补助,伪造了一份假身份证复印件,本人用此函数检查时显示“校验未通过”,后经当地派出所查验,该复印件的号码不存在。

[ 本帖最后由 3816996 于 2011-6-12 11:20 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-6-12 11:24 | 显示全部楼层
本人前段时间也做了一个,可以根据身份证编码规则将15位转18位,和这个类似。看楼主的好像更厉害一点,就不献丑了。您这个只能验证校验位是否正确,如果要验证提供的身份证是否属实,还需要上验证服务器同时验证姓名与身份证号是否匹配,这个VB是不能实现的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-12 21:20 | 显示全部楼层

回复 5楼 jokklx 的帖子

验证服务器?没听说过,有访问限制吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-15 08:20 | 显示全部楼层
  其实,做这个函数的主要目的并不是检验身份证号码是否属实,因为知道校验码算法的人伪造出来的身份证号码是可以通过校验的,所以本函数的校验结果选择了“通过”或“校验未通过”,而不是正确或属实等,要知道身份证号码是否属实还必须核对原件或到公安部门核实。
  本函数的使用对象主要是进行大批量身份证号码录入的工作人员,特别是非复印件或原件的录入(比如经他人抄写后的名册),本人对已录入的某地农村林权改革户主身份证号码及农村最低生活保障人员身份证号码进行过校验,错误率高达10%,对于这些错误如果能够及时更正,将减少很多日后不必要的麻烦。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-16 08:14 | 显示全部楼层
  特别提醒的是,“校验未通过”并不等于校验位错误,本人对名册中校验未通过的部分检查发现,大部分都是前面17位数字错误造成校验未通过的,这也是本函数对校验位错误返回“校验未通过”而不是像其他同类函数那样返回校验码的原因,因为我觉得返回校验码会误导使用者以为是校验位错误了,使他们随手修正校验码而带来更大的错误。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-6-17 15:14 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  现行身份证号码已经没有15位,且每个人的户口簿上都有18位身份证号码,所以,身份证号码校验函数代码可以简化为:

Function IDcheck(ID)                          '身份证号码校验函数
Dim i, s, e, z As Integer
If Len(ID) = 18 Then
   For i = 1 To 17
      s = s + Mid(ID, 18 - i, 1) * (2 ^ i Mod 11)
   Next
   e = (12 - s Mod 11) Mod 11
   If UCase(Right(ID, 1)) = "X" Then z = 10 Else z = Right(ID, 1)
   If z = e Then
      IDcheck = "通过"
      Else
      IDcheck = "校验未通过"
   End If
   Else
   IDcheck = ""
End If
End Function                        '编写 474589791 2011年6月11日


  简化后函数只对18位号码校验,不再进行错误检查(其实校验就是错误检查),返回结果有4种情况,校验码正确的返回“通过”,校验码不正确的返回“校验未通过”,非18位号码不校验,返回空值,号码中包含有非数字字符(未位X除外)返回“#VALUE!”。

[ 本帖最后由 474589791 于 2011-6-22 21:36 编辑 ]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2011-6-20 21:17 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-6-23 10:16 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
太好了,非常实用!!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-5-6 13:50 , Processed in 0.036300 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表