以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- 请教狐狸爸爸:Excel用VBA程序开发的身份证号码校验实例,如果转换成狐表的DatacolChanging事件来实现!!! (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=19875) |
|
-- 作者:lipiti -- 发布时间:2012/5/23 21:25:00 -- 请教狐狸爸爸:Excel用VBA程序开发的身份证号码校验实例,如果转换成狐表的DatacolChanging事件来实现!!! 身份证号码校验实例
[此贴子已经被作者于2012-5-23 21:25:56编辑过]
|
|
-- 作者:lipiti -- 发布时间:2012/5/23 22:02:00 -- 第二种VBA参考方法 \'计算身份证末位验证字符
Function IdCardLastChar(num) Dim cId As String Dim nsum As Integer Dim check_number As String If Len(num) = 15 Then cId = Left(num, 6) & "19" & Right(num, 9) ElseIf Len(num) = 17 Or Len(num) = 18 Then cId = Left(num, 17) End If \'计算方法 nsum = Mid(cId, 1, 1) * 7 nsum = nsum + Mid(cId, 2, 1) * 9 nsum = nsum + Mid(cId, 3, 1) * 10 nsum = nsum + Mid(cId, 4, 1) * 5 nsum = nsum + Mid(cId, 5, 1) * 8 nsum = nsum + Mid(cId, 6, 1) * 4 nsum = nsum + Mid(cId, 7, 1) * 2 nsum = nsum + Mid(cId, 8, 1) * 1 nsum = nsum + Mid(cId, 9, 1) * 6 nsum = nsum + Mid(cId, 10, 1) * 3 nsum = nsum + Mid(cId, 11, 1) * 7 nsum = nsum + Mid(cId, 12, 1) * 9 nsum = nsum + Mid(cId, 13, 1) * 10 nsum = nsum + Mid(cId, 14, 1) * 5 nsum = nsum + Mid(cId, 15, 1) * 8 nsum = nsum + Mid(cId, 16, 1) * 4 nsum = nsum + Mid(cId, 17, 1) * 2 \'*计算校验位 check_number = 12 - nsum Mod 11 If check_number = 10 Then check_number = "X" End If If check_number = 12 Then check_number = "1" End If If check_number = 11 Then check_number = "0" End If IdCardLastChar = check_number End Function |
|
-- 作者:狐狸爸爸 -- 发布时间:2012/5/24 7:57:00 -- 参考:
|
|
-- 作者:lipiti -- 发布时间:2012/5/24 18:11:00 -- 关键是参考的两个引出出生日期和性别,已经都在使用了,最最主要的还是末位校正,希望狐狸爸爸还是能给出官方的代码 因为这个例子通用性很强,如果有官方的代码,广大用户都能受益,对狐表本身强大的功能也能得到展示。
|
|
-- 作者:擎天柱 -- 发布时间:2012/5/25 20:53:00 -- 我2年前前用表达式做了一个,15位转18位的,公式比较复杂,不妨参考一下: 用表达式提取身份证号码信息 【更新】[此贴子已经被作者于2012-5-25 20:53:56编辑过]
|
|
-- 作者:lipiti -- 发布时间:2012/5/25 21:07:00 -- 谢谢楼上!这个对我们很有用。 正在研究末尾的校正码表达式: IIF(LEN([ID])=18, IIF( ((Convert(SUBSTRING([ID],1,1),System.Int16)*7+ Convert(SUBSTRING([ID],2,1),System.Int16)*9+ Convert(SUBSTRING([ID],3,1),System.Int16)*10+ Convert(SUBSTRING([ID],4,1),System.Int16)*5+ Convert(SUBSTRING([ID],5,1),System.Int16)*8+ Convert(SUBSTRING([ID],6,1),System.Int16)*4+ Convert(SUBSTRING([ID],7,1),System.Int16)*2+ Convert(SUBSTRING([ID],8,1),System.Int16)*1+ Convert(SUBSTRING([ID],9,1),System.Int16)*6+ Convert(SUBSTRING([ID],10,1),System.Int16)*3+ Convert(SUBSTRING([ID],11,1),System.Int16)*7+ Convert(SUBSTRING([ID],12,1),System.Int16)*9+ Convert(SUBSTRING([ID],13,1),System.Int16)*10+ Convert(SUBSTRING([ID],14,1),System.Int16)*5+ Convert(SUBSTRING([ID],15,1),System.Int16)*8+ Convert(SUBSTRING([ID],16,1),System.Int16)*4+ Convert(SUBSTRING([ID],17,1),System.Int16)*2)%11)=2,\'X\', IIF( ((Convert(SUBSTRING([ID],1,1),System.Int16)*7+ Convert(SUBSTRING([ID],2,1),System.Int16)*9+ Convert(SUBSTRING([ID],3,1),System.Int16)*10+ Convert(SUBSTRING([ID],4,1),System.Int16)*5+ Convert(SUBSTRING([ID],5,1),System.Int16)*8+ Convert(SUBSTRING([ID],6,1),System.Int16)*4+ Convert(SUBSTRING([ID],7,1),System.Int16)*2+ Convert(SUBSTRING([ID],8,1),System.Int16)*1+ Convert(SUBSTRING([ID],9,1),System.Int16)*6+ Convert(SUBSTRING([ID],10,1),System.Int16)*3+ Convert(SUBSTRING([ID],11,1),System.Int16)*7+ Convert(SUBSTRING([ID],12,1),System.Int16)*9+ Convert(SUBSTRING([ID],13,1),System.Int16)*10+ Convert(SUBSTRING([ID],14,1),System.Int16)*5+ Convert(SUBSTRING([ID],15,1),System.Int16)*8+ Convert(SUBSTRING([ID],16,1),System.Int16)*4+ Convert(SUBSTRING([ID],17,1),System.Int16)*2)%11) IN (\'1\',\'0\') ,1- ((Convert(SUBSTRING([ID],1,1),System.Int16)*7+ Convert(SUBSTRING([ID],2,1),System.Int16)*9+ Convert(SUBSTRING([ID],3,1),System.Int16)*10+ Convert(SUBSTRING([ID],4,1),System.Int16)*5+ Convert(SUBSTRING([ID],5,1),System.Int16)*8+ Convert(SUBSTRING([ID],6,1),System.Int16)*4+ Convert(SUBSTRING([ID],7,1),System.Int16)*2+ Convert(SUBSTRING([ID],8,1),System.Int16)*1+ Convert(SUBSTRING([ID],9,1),System.Int16)*6+ Convert(SUBSTRING([ID],10,1),System.Int16)*3+ Convert(SUBSTRING([ID],11,1),System.Int16)*7+ Convert(SUBSTRING([ID],12,1),System.Int16)*9+ Convert(SUBSTRING([ID],13,1),System.Int16)*10+ Convert(SUBSTRING([ID],14,1),System.Int16)*5+ Convert(SUBSTRING([ID],15,1),System.Int16)*8+ Convert(SUBSTRING([ID],16,1),System.Int16)*4+ Convert(SUBSTRING([ID],17,1),System.Int16)*2)%11) ,12- ((Convert(SUBSTRING([ID],1,1),System.Int16)*7+ Convert(SUBSTRING([ID],2,1),System.Int16)*9+ Convert(SUBSTRING([ID],3,1),System.Int16)*10+ Convert(SUBSTRING([ID],4,1),System.Int16)*5+ Convert(SUBSTRING([ID],5,1),System.Int16)*8+ Convert(SUBSTRING([ID],6,1),System.Int16)*4+ Convert(SUBSTRING([ID],7,1),System.Int16)*2+ Convert(SUBSTRING([ID],8,1),System.Int16)*1+ Convert(SUBSTRING([ID],9,1),System.Int16)*6+ Convert(SUBSTRING([ID],10,1),System.Int16)*3+ Convert(SUBSTRING([ID],11,1),System.Int16)*7+ Convert(SUBSTRING([ID],12,1),System.Int16)*9+ Convert(SUBSTRING([ID],13,1),System.Int16)*10+ Convert(SUBSTRING([ID],14,1),System.Int16)*5+ Convert(SUBSTRING([ID],15,1),System.Int16)*8+ Convert(SUBSTRING([ID],16,1),System.Int16)*4+ Convert(SUBSTRING([ID],17,1),System.Int16)*2)%11) )) ,IIF(LEN([ID])=15, IIF( ((Convert(SUBSTRING([ID],1,1),System.Int16)*7+ Convert(SUBSTRING([ID],2,1),System.Int16)*9+ Convert(SUBSTRING([ID],3,1),System.Int16)*10+ Convert(SUBSTRING([ID],4,1),System.Int16)*5+ Convert(SUBSTRING([ID],5,1),System.Int16)*8+ Convert(SUBSTRING([ID],6,1),System.Int16)*4+ 2+ 9+ Convert(SUBSTRING([ID],7,1),System.Int16)*6+ Convert(SUBSTRING([ID],8,1),System.Int16)*3+ Convert(SUBSTRING([ID],9,1),System.Int16)*7+ Convert(SUBSTRING([ID],10,1),System.Int16)*9+ Convert(SUBSTRING([ID],11,1),System.Int16)*10+ Convert(SUBSTRING([ID],12,1),System.Int16)*5+ Convert(SUBSTRING([ID],13,1),System.Int16)*8+ Convert(SUBSTRING([ID],14,1),System.Int16)*4+ Convert(SUBSTRING([ID],15,1),System.Int16)*2)%11)=2,\'X\', IIF( ((Convert(SUBSTRING([ID],1,1),System.Int16)*7+ Convert(SUBSTRING([ID],2,1),System.Int16)*9+ Convert(SUBSTRING([ID],3,1),System.Int16)*10+ Convert(SUBSTRING([ID],4,1),System.Int16)*5+ Convert(SUBSTRING([ID],5,1),System.Int16)*8+ Convert(SUBSTRING([ID],6,1),System.Int16)*4+ 2+ 9+ Convert(SUBSTRING([ID],7,1),System.Int16)*6+ Convert(SUBSTRING([ID],8,1),System.Int16)*3+ Convert(SUBSTRING([ID],9,1),System.Int16)*7+ Convert(SUBSTRING([ID],10,1),System.Int16)*9+ Convert(SUBSTRING([ID],11,1),System.Int16)*10+ Convert(SUBSTRING([ID],12,1),System.Int16)*5+ Convert(SUBSTRING([ID],13,1),System.Int16)*8+ Convert(SUBSTRING([ID],14,1),System.Int16)*4+ Convert(SUBSTRING([ID],15,1),System.Int16)*2)%11) IN (\'1\',\'0\') ,1- ((Convert(SUBSTRING([ID],1,1),System.Int16)*7+ Convert(SUBSTRING([ID],2,1),System.Int16)*9+ Convert(SUBSTRING([ID],3,1),System.Int16)*10+ Convert(SUBSTRING([ID],4,1),System.Int16)*5+ Convert(SUBSTRING([ID],5,1),System.Int16)*8+ Convert(SUBSTRING([ID],6,1),System.Int16)*4+ 2+ 9+ Convert(SUBSTRING([ID],7,1),System.Int16)*6+ Convert(SUBSTRING([ID],8,1),System.Int16)*3+ Convert(SUBSTRING([ID],9,1),System.Int16)*7+ Convert(SUBSTRING([ID],10,1),System.Int16)*9+ Convert(SUBSTRING([ID],11,1),System.Int16)*10+ Convert(SUBSTRING([ID],12,1),System.Int16)*5+ Convert(SUBSTRING([ID],13,1),System.Int16)*8+ Convert(SUBSTRING([ID],14,1),System.Int16)*4+ Convert(SUBSTRING([ID],15,1),System.Int16)*2)%11) ,12- ((Convert(SUBSTRING([ID],1,1),System.Int16)*7+ Convert(SUBSTRING([ID],2,1),System.Int16)*9+ Convert(SUBSTRING([ID],3,1),System.Int16)*10+ Convert(SUBSTRING([ID],4,1),System.Int16)*5+ Convert(SUBSTRING([ID],5,1),System.Int16)*8+ Convert(SUBSTRING([ID],6,1),System.Int16)*4+ 2+ 9+ Convert(SUBSTRING([ID],7,1),System.Int16)*6+ Convert(SUBSTRING([ID],8,1),System.Int16)*3+ Convert(SUBSTRING([ID],9,1),System.Int16)*7+ Convert(SUBSTRING([ID],10,1),System.Int16)*9+ Convert(SUBSTRING([ID],11,1),System.Int16)*10+ Convert(SUBSTRING([ID],12,1),System.Int16)*5+ Convert(SUBSTRING([ID],13,1),System.Int16)*8+ Convert(SUBSTRING([ID],14,1),System.Int16)*4+ Convert(SUBSTRING([ID],15,1),System.Int16)*2)%11) )) ,\'\')) |
|
-- 作者:擎天柱 -- 发布时间:2012/5/26 10:09:00 -- 楼主不要研究这个公式,他会让你变糊涂的,直接套用即可。如过你想搞懂它,你找相关的身份证校验码的有关资料,看懂它的算法,根据这个算法,寻找规律,再根据数字规律,编写狐表的表达式公式即可。表达式有局限性,如果用代码可能会简洁些。这是2年前的东西,我未再跟进研究。工作原因,很长时间没学习狐表了。 |
|
-- 作者:lipiti -- 发布时间:2012/5/26 22:45:00 -- 嗯,非常感谢楼上,表达式已经套用了。 |