最近在贴吧中学习Excel,很多问题自己不能回答。只能看别人的答复。看过之后觉得看懂了,但不久之后可能就忘了,收益甚少。今天突然有了一个想法,分析别人的解答结果,记录推测解答思路。也许这样自己记忆更深刻,理解更透彻。说做就做。
问题:如何通过设置数据有效性,避免身份证录入的错误?
答案:数据-有效性-自定义
式将公式中IF的条件作为有效性检验条件:
=NOT(iSERR(--TEXT(--MID(A2,7,8),"#-00-00")))*(MID(A2,7,8)<TEXT(NOW(),"emmdd"))*(RIGHT(A2)=MID("10X98765432",MOD(SUMPRODUCT(MID(A2,ROW($1:$17),1)*MOD(2^(18-ROW($1:$17)),11)),11)+1,1))
解析1,关于数据有效性,如果条件公式结果不是0或是true,便可以正常录入数据;条件公式得到的结果为0或是false,在录入数据之后Excel会弹出非有效数据的提示,数据无法正常输入。
解析2:证个公式分为三个判断,用“*”连接,说明这三个条件必须要同时成立。
解析3第一个判断:NOT(ISERR(--TEXT(--MID(A2,7,8),“#-00-00”))),判断身份证的第7位到第15位是否为日期。
(1)--MID(A2,7,8),去除身份证号码中的日期,将其转化为数字。
(2)函数text,降数字转化为日期,及19230203,表示的是1923年2月3日,而非一九二三千万零二百零三,函数text前的“--”,将日期转化为所代表的数字既:1923年2月3日=8435,如果月份大于13,或日期大于当月最大天数,都会出现#value!
(3)iserr(),检测返回时是否是#N/A以外的错误只,是返回true(真),否则返回false(假)
所以第一部分判断身份证出生日期部分是否是一个日期,如果是返回true(参与*运算时相当于1),否则返回false(参与*运算时相当于0)。
解析4第二个判断:mid(A2,7,8)<text(now(),"emmdd")
(1)now()返回,现在时间的数值,
(2)text中,“emmdd”,是将8位日期形式文本
故第二个判断是身份证日期不得大于当天日期
解析5第三个判断:(RIGHT(A2)=MID("10X98765432",MOD(SUMPRODUCT(MID(A2,ROW($1:$17),1)*MOD(2^(18-ROW($1:$17)),11)),11)+1,1))
这是身份证验证码算法用Excel中的公式表示。