亲爱的朋友,您知道身份证号码的编码规则吗?当您看到一个身份证号码,能识辨别它的真假吗?您能随机拼出一个身份证号码吗?本文专门解答这些问题。您只需会excel的简单操作就行,至于VBA,您只需知道有这么个东西,至于是什么东西别去管它。请跟我来吧!
工具/原料
excel/vba
方法/步骤1:身份证号码编码规则
1、18位身份证号码编码规则:根据〖中华人民共和国国家标准GB11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字或字符(X)校验码组成。排列顺序从左至右依次为:六位地址码,八位出生日期码,三位顺序码和一位校验码。请看示例:
2、6位地址码中,前2位表示省、直辖市、自治区:11-15京、津、冀、晋、蒙21-23辽、吉、黑31-37沪、苏、浙、皖、闽、赣、鲁41-46豫、鄂、湘、粤、桂、琼50-54渝、川、贵、云、藏61-65陕、甘、青、宁、新后4位表示市、县、区。请看示例:
3、8位出生日期码采用8位定长日期表示法:4位年、2位月、2位日。
4、3位顺序码表示同一日出生的次序和性别,奇数代表男性,偶数代表女性。
5、最后1位校验码用“0-9”和“X”表示。校验码是通过数学计算得出来的。校验码计算公式:(12-∑(Ai×Wi)(mod11))mod11i—表示身份证号码从左至右的位置序号,取值1--17;Ai—表示第i位上的数字;Wi—表示第i位上的加权因子。加权因子计算公式:Wi=2^(i-1)(mod11)校验码计算结果为“0--10”11个数字之一,其中“10”用“X”表示。
方法/步骤2:身份证号码有效性识别
1、后面的内容要用到VBA编程的一些知识。跟我一起来了解一下VBA怎么使用吧,很简单的!1.新建并打开一个excel文档2.右击工作表标签-->查看代码3.在代码窗口中输入程序4.按下F5执行程序
2、这里有一些待验证的身份证号码,接下来要编程验证其真伪,并提取所包含的信息。需要您做的是:通过下面这个链接下载“身份证号码攻略”,这是一个excel文档,里面有编好的程序,把您需要验证的身份证号码填进去,运行程序即可。下载链接:http://pan.baidu.com/s/1gd3qTbX
3、这是程序代码,里面有镰噻孕藏详细说明,这里就不赘述了。SubIDcheck()'验证身份证号码有效性并提取糁钶茏收所包含的信息Application.ScreenUpdating=FalseDimIDcodeAsString'用于存放身份证号码的变量DimEndRow1,EndRow2AsSingle'两个工作表最后一行行号的变量DimCheckCodeAsVariant'用于存放校验码的变量DimsAdrAsString'用于存放原始发证地址的变量EndRow1=Sheets(1).Range("a65535").End(xlUp).RowEndRow2=Sheets(2).Range("a65535").End(xlUp).RowIfEndRow1<2ThenExitSubFori=2ToEndRow1'遍历表中所有身份证号码'初始化IDcode=Sheets(1).Cells(i,1)Sheets(1).Range("b"&i&":e"&i)=""'在行政区划代码数据库(Sheets(2))中查找前六位地址代码是否存在,f=1表示存在。将以此为依据判断地址代码的有效性!f=0Forj=1ToEndRow2IfSheets(2).Cells(j,2)&""=Left(IDcode,6)&""Thenf=1sAdr=Sheets(2).Cells(j,3)'前六位对应的原始发证地址ExitForEndIfNextj'对身份证号码的有效性进行判别!IfLen(IDcode)<>18ThenSheets(1).Cells(i,2)="位数不正确—"&Chr(10)&"18位才对!"ElseIfNotIsNumeric(Left(IDcode,17))OrNotIsNumeric(Right(IDcode,1))AndRight(IDcode,1)<>"x"AndRight(IDcode,1)<>"X"ThenSheets(1).Cells(i,2)="格式不正确—"&Chr(10)&"前17位为数字,最后一位为数字或“x”"ElseIff=0ThenSheets(1).Cells(i,2)="地址代码不正确—"&Chr(10)&"该地区暂不适合人类居住!"ElseIfNotIsDate(Mid(IDcode,7,4)&"-"&Mid(IDcode,11,2)&"-"&Mid(IDcode,13,2))ThenSheets(1).Cells(i,2)="表示出生日期的号码不正确—"&Mid(IDcode,7,8)&Chr(10)&"疑似火星日历!"ElseIfVal(Mid(IDcode,7,4))>Year(Date)ThenSheets(1).Cells(i,2)="表示出生日期的号码不正确—"&Chr(10)&"此人尚未出生!"ElseIfYear(Date)-Val(Mid(IDcode,7,4))>120ThenSheets(1).Cells(i,2)="表示出生日期的号码不正确—"&Chr(10)&"此人已亡故!"Else'判别最后一位校验码是否正确CheckCode=0Forj=1To17CheckCode=CheckCode+Val(Mid(IDcode,j,1))*2^(19-j-1)Mod11NextjCheckCode=12-CheckCodeMod11IfCheckCode=10ThenCheckCode="X"ElseIfCheckCode>10ThenCheckCode=CheckCode-11EndIfIfCheckCode&""<>Right(IDcode,1)&""ThenSheets(1).Cells(i,2)="校验码不正确!"ElseSheets(1).Cells(i,2)="有效!"'提取身份证号码所包含的信息Sheets(1).Cells(i,3)=sAdrSheets(1).Cells(i,4)=Mid(IDcode,7,4)&"-"&Mid(IDcode,11,2)&"-"&Mid(IDcode,13,2)IfVal(Mid(IDcode,15,3))Mod2=1ThenSheets(1).Cells(i,5)="男"ElseSheets(1).Cells(i,5)="女"EndIfEndIfEndIfNextiApplication.ScreenUpdating=TrueEndSub
4、这是验证结果
方法/步骤3:随机生成一个身份证号码
1、下面是随机生成身份证号码擢爻充种的程序代码:SubIDcreat()'随机生成一个身份证号码Dim惺绅寨瞀IDcodeAsString'定义变量,用于存放18位身份证号码DimAdcoAsString'定义变量,用于存放6位地址码DimBicoAsString'定义变量,用于存放8位出生日期DimSecoAsString'定义变量,用于存放3位性别码DimChcoAsVariant'定义变量,用于存放1位校验码EndRow2=Sheets(2).Range("a65535").End(xlUp).Row'行政区划代码数据库(sheets2)最后一行行号Adco=Sheets(2).Cells(Int(Rnd*EndRow2)+1,2)'随机获取地址码Bico=Format(#1/1/1900#+Int(Rnd*(Date-#1/1/1900#+1)),"yyyymmdd")'随机生成出生日期Seco=Format(1+Int(Rnd*995),"000")'随机生成性别码IDcode=Adco&Bico&Seco'生成前17位号码'求校验码(还有更精炼的方法,此例以易读为先。)Chco=0Fori=1To17Chco=Chco+Val(Mid(IDcode,i,1))*2^(19-i-1)Mod11NextiChco=12-ChcoMod11IfChco=10ThenChco="X"ElseIfChco>10ThenChco=Chco-11EndIf'完工IDcode=IDcode&ChcoSheets(1).Cells(20,1)=IDcodeSheets(1).Range("b20:e20")=""'验证一下CallSheets(1).IDcheckEndSub
2、首先需要定义一些变量:DimIDcodeAsString'定义变量,用于存放18位身份证号码DimAdcoAsString'定义变量,用于存放6位地址码DimBicoAsString'定义变量,用于存放8位出生日期DimSecoAsString'定义变量,用于存放3位性别码DimChcoAsVariant'定义变量,用于存放1位校验码
3、以下代码生成身份证号码的前17位:EndRow2=Sheets(2)饱终柯肢.Range("a65535").End(xlUp).Row'行政区划代码数据库(s茑霁酌绡heets2)最后一行行号Adco=Sheets(2).Cells(Int(Rnd*EndRow2)+1,2)'随机获取地址码Bico=Format(#1/1/1900#+Int(Rnd*(Date-#1/1/1900#+1)),"yyyymmdd")'随机生成出生日期Seco=Format(1+Int(Rnd*995),"000")'随机生成性别码IDcode=Adco&Bico&Seco'组装前17位身份证号码
4、以下代码计算最后一位验证码:Chco=0Fori=1To咯悝滩镞17Chco=Chco+Val(Mid(IDcode,i,1))忮氽阝另*2^(19-i-1)Mod11NextiChco=12-ChcoMod11IfChco=10ThenChco="X"ElseIfChco>10ThenChco=Chco-11EndIf
5、把验证码也组装进去----完工:IDcode=IDcode&Chco