:身份证信息查询
实例见附件
函数解释
B2单元格函数式:
=IF(ISERROR(CONCATENATE(VLOOKUP(LEFT(A2,2),$H$2:$I$6467,2,FALSE),VLOOKUP(LEFT(A2,6),$H$2:$I$6467,2,FALSE))),"",CONCATENATE(VLOOKUP(LEFT(A2,2),$H$2:$I$6467,2,FALSE),VLOOKUP(LEFT(A2,6),$H$2:$I$6467,2,FALSE)))
看起来比较复杂,像天书,但实际上是由两个完全相同的函数式组成的,第一部分用于判断单元格取值结果是否正确,如果错误,返回空值;如果正确,反回正确结果。
我们把函数拆开来分析:
LEFT(A2,2)将A2单元格的值从左边起,取2个字符,返回的结果是36。其余类推。
VLOOKUP(LEFT(A2,2),$H$2:$I$6467,2,FALSE)即是根据LEFT(A2,2)的值36,在H2至I6467的范围内的H列查找,找到
了以后返回指定范围内的第2列(即I列)对应的单元格的内容。(这里用加了$符号的绝对引用,是为了函数式下拉时,引用范围不会跟着改变。)H2:I6467是预先录好的地址及对应的代码。
CONCATENATE()函数就是把几个查找到的文本连接起来,即成了“某省某市某区”,作用跟连接符&相同。
ISERROR()函数是判断函数是否返回错误值。
IF()函数用于判断ISERROR()返回的值是不为真,真返回空值,假返回“某省某市某区”。
C2单元格函数式:
=IF(LEN(A2)=18,CONCATENATE(MID(A2,7,4),"年",MID(A2,11,2),"月",MID(A2,13,2),"日"),IF(LEN(A2)=15,CONCATENATE("19",MID(A2,7,2),"年",MID(A2,9,2),"月",MID(A2,11,2),"日"),""))
LEN(A2)返回A2单元格的字符个数。
MID(A2,7,4)从A2单元格文本中的第7位开始,取出4个字符。其余类推。
CONCATENATE()文本连接函数,同上。
这里用了两个IF()函数套叠,判断A2的文本是18个字符或15个字符,根据不同的返回值提取不同的字符。
D2单元格函数式:
=IF(C2="","",YEAR(TODAY())-YEAR(C2))
YEAR()取日期年份。
TODAY()取系统当前日期。
E2单元格函数式:
=IF(C2="","",TODAY()-C2)(同上),返回的值用日期序列数显示,即天数。
F2单元格函数式:
=IF(A2="","",IF(AND(LEN(A2)<>18,LEN(A2)<>15),"身份证位数错",IF(LEN(A2)=18,IF(MOD(MID(A2,17,1),2)=0,"女","男"),IF(MOD(RIGHT(A2,1),2)=0,"女","男"))))
根据身份证信息判断男女,18位身份证用倒数第2位判断,15位身份证用最后一位判断,奇数为男,偶数为女。
MOD(数字,2)把取得的数字被2除,取余数,余数是0是偶数,余数是1是奇数。
以下经网友改进,并精简了函数式(改进后的放在附件电子表格Sheet2中):
C2=IF(A2<>"",TEXT((LEN(A2)=15)*19&MID(A2,7,6+(LEN(A2)=18)*2),"#-00-00")+0,"")
D2=IF(C2<>"",DATEDIF(C2,TODAY(),"y"),"")
F2=IF(A2<>"",IF(AND(LEN(A2)<>18,LEN(A2)<>15),"身份证位数错",IF(MOD(RIGHT(LEFT(A2,17)),2),"男","女")),"")