在日常工作中,有时我们需要输入很多的身份证号码,但手工录入会出现一定的错误,如果能够根据身份证号的规律来加以限制,就会减少出错的可能性。
今天我们来做一个excel工作簿,其中包括地址码对照表,校验原理、输入校验、数据有效性录入这四张工作表。
今天,我们通过对身份证号的处理,来学习一下有关的函数(LEN,IF,VLOOKUP,OR,DETEDIF,DATE,TEXT等)、数据有效性、单元格的相对于绝对引用、单元格条件格式等等知识点
首先,我们来了解一下身份号码的规律,这是我们制作该工作簿的前提
身份证号背后的规律:
根据《中华人民共和国国家标准GB 11643-1999》中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。
当然,还有一定的身份证号没有进行更新,是15位的数字,将其转换为18位,需要在第6位与第7位数字之间插入“19”,在最后一位之后插入一个校验码
地址码(身份证地址码对照表见下面表格)和出生日期码很好理解,顺序码表示在同一地址码所标识的区域范围内,对同年同月同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
身份证最后一位校验码算法如下:
将身份证号码前17位数分别乘以不同的系数,从第1位到第17位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
将得到的17个乘积相加。
将相加后的和除以11并得到余数。
任意的数字除以11可能产生的余数在0-10平均分布余数可能为0 1 2 3 4 5 6 7 8 9 10这些个数字,其对应的身份证最后一位校验码为1 0 X 9 8 7 6 5 4 3 2。
X表示罗马数字“十”
了解了这些,我们有了以下的限定条件:
地址码能匹配到对应的区域
生日的日期存在,不能是1993年2月29日这样
校验码必须匹配
如果你还有其他信息,如年龄、性别还可以一同作为判断身份证号是否录入正确的依据
注:以下截图均在Microsoft office 2016截取
制作工作簿
“地址码对照”工作表
首先我们在网上查找身份证地址码与地址的对照表,对其进行格式化,将其分为两列,地址码在前列,地址在后列(由于使用vlookup函数,要求必须查询的值必须在所选表格位置的第一列,当然,如果使用match和index函数组合可以不用考虑两列的先后)
如果想互换两列,先选中其中一列,然后将鼠标移动到列号单元格与1行中间,当鼠标呈双向箭头时,按住【Shift】拖动到另一列即可(注意下方标线的位置)
注:需要查找比较全的对照表(有新旧两项的),即有“某某地区”,比如河北衡水地区133001的。这些是在行政区变更前的地址码,而身份证号一经确定就不会更改,因此不会自动变为当前行政单位的地址码。
接下来就需要利用我们的excel功底来制作了
“输入验证”工作表
我们新建一张“输入验证”的工作表
我们设置如下提示信息及要求:
请输入身份证号:身份证号文本输入单元格 /规定在提示输入信息后的单元格录入身份证号码,初步数据校验它的文本字符数量是否为18或15
查询后的地区/显示查询后的地区,如果未找到提示“查无该地区”
查询后的生日/显示身份证号转换后的正确日期信息,与输入的生日文本对比,如果不相同显示浅红色填充
查询后的年龄/显示出生日期距文档打开日期的年数及月数
查询后的性别/显示“男”或“女”
校验码是否正确/如果计算后的校检码与输入的校检码(只有18为身份证号码才有)相同,则显示“正确”,否则显示“错误”
接下来我们具体来看一下:
首先,我们进行单元格的格式设置为文本操作,如果不进行设置,B1单元格默认为常规,这样输入的身份证号码如果没有X就会被视作数字,而将其转换为科学计数法,这里我们要强制该单元格内容为文本
选中B1单元格,在『开始选项卡』-「数字组」~【扩展按钮】,打开如下对话框如下图,在左侧切换为“文本”
单元格格式设置好后,我们对其的输入字符位数进行限定
介绍一下用到的函数:
len(text)返回某字符串的字符个数(一个汉字为一字符)
lenb(text)返回某字符串的字节个数(一个汉字两字节)
and(logical1,logical2,...),每个条件都成立,公式成立
or(logical1,logical2,...),多个条件中任意一个成立,公式成立
选择输入身份证号码的单元格B1,在『数据选项卡』-「数据工具组」~【数据验证下拉数据验证】,打开如下对话框,在验证条件中选择“允许自定义”,公式中输入 =OR(LEN(B1)=15,LEN(B1)=18)
切换到输入信息,在这里输入你想提示的信息,如下图:
这样,当你选中B1单元格时会自动提示输入信息,如下图:
切换到出错警告,在样式中选择“停止”,在右侧输入对应的提示信息
这里解释一下样式中的“停止”、“警告”、“信息”,这里表示您对输入数值的权限依次升高,“停止”表示您必须输入正确的信息,否则输入无效,“警告”时您可以执意输入刚才的信息而忽略错误,“信息”只显示出错提示,不会影响您的输入,当然,这里我们必须使用“停止”,因为输入字符的位数直接影响接下来我们的取位、转换等操作
当我们输入错误的号码位数时,软件提示我们:
这时,我们无论点“重试”还是“取消”,数据都无法录入
最后,我们输入的身份证号码有可能是15位,这给我们的判断造成了很大的阻碍,因此我们想“如果输入为15位身份证号码,就将其转换为18位身份证号码,否则显示原输入号码(由于这里已经做了数据校验)”,这里我们在E2单元格中显示转换后的十八位号码(包括原十八位号码),而这号码的由来需要校检码+15位号码或原输入的18位号码,这里我们再开辟E1和E3单元格,分别存储“15位号码”和“15位校验码”
这里的E1单元格公式为 =IF(LEN(B1)=15,B1,"")
,如果输入的是15位,就显示15位号码,如果不是(即输入的位数为18),就显示为空;E3单元格是校验的反过程,这里先不做介绍,转换后的十八位单元格E2也需要校验位E3,之后讲解了校验过程这两个单元格的公式再来谈。
“校验原理”工作表
新建“校验”工作表
由于对身份证进行了十八位转换(单元格为输入验证!$E$2),这里使用的全是十八位字符的转化。
首先列出身份证的“第几位”
这里介绍一下如何使用单元格格式方便快捷显示出来“第几位”
- 通常,我们输入一后可以下拉填充二三等,但我们入股输入“第一位”后无法通过下拉填充自动填充“第二位”、“第三位”,这是由于我们的软件中没有这一序列,只有“一二三”序列,如果你没有这个序列,可以选中有数据的单元格,在『开始选项卡』-「编辑组」~【排序和筛选下拉自定义排序】,打开如下窗口
- 在“次序”中选择自定义序列,然后打开“自定义序列”窗口,默认已选择新序列,在右侧输入“一二三……”中间以回车键隔开,如下图:
然后点击添加即可
当然,你也可以添加其他常用序列,不过这一序列配合单元格格式配合剪贴板可以快速的实现有规律的文本输入我们在A2单元格中输入“一”,将鼠标移动到当前单元格的右下角,鼠标呈粗十字线,按住左键拖拽填充。
然后我们设置单元格格式,方法同上,在左侧点击自定义,输入如下图的字符
解释一下“@”表示你输入的文本
之后我们就可以得到从“第一位”到“第十七位”的显示效果,那么如何将这些效果固定下来成为文本呢?(当然,本示例中可不进行以下操作,这里只是展示该功能的强大)
选中所有单元格(在有数据的单元格上按【Ctrl+A】),【Ctrl+C】复制,在『开始选项卡』-「剪贴板组扩展三角」,打开剪贴板如下图:
然后单击刚才的记录,最后将单元格格式设置为常规即可。
在B2列,我们来提取输入或转化后的号码的各位上的数。
提取文本中的文字,我们需要用到文本提取函数,其中包括left、right、mid,下面介绍一下使用方法:
left(text,[number_chars]):第一个参数为字符串,第二个参数是从左向右提取几个字符,right类似
mid(text,star_number,number_chars):第一个参数为字符串,第二个参数是从第几个字符开始提取,第三个参数是提取几个字符,比如我们有=MID(“130932199802114564”,5,2)即可取到“32”
比如这里的第一位就可以用公式 =MID(输入验证!E2,1,1)
但我们拖动填充后发现,第二位的公式变为了=MID(输入验证!E3,1,1)
,首先字符串的引用位置出现了错误,这里忽略了绝对引用,
单元格的相对引用如E2,当公式向下填充时,其中的2依次增加,当公式向右填充时,其中的E依次增加; 单元格的绝对引用如$E$2,这种引用无论如何填充,都只引用E2这一单元格; 混合引用如E2和E2,前者在向左右填充时无变化,但在向下填充时2会依次增加,后者相反。
一般的工作当中只要掌握前两者即可,混合引用很少见,只用于公式既需要想右填充还需要向下填充时才用的到,比如乘法口诀表:
下面讲解一下乘法口诀表的公式
我们有外边的1-9两组乘数,需要将行和列相乘,而且可以拖动填充
我们选中B2单元格首先输入=A2*B1
,这个公式需要进行拖拽填充,用相对引用和绝对引用都不可以实现,这里有个小技巧,在拖动填充时想让谁不变,就让他为绝对引用,比如这里的A2,之后我们可能使用A3等单元格,A就不变,我们就使用【F4】键切换引用方式,直到A前出现符,而2前无符,同理,B1中,1不变,公式就变形为=$A2*B$1
,然后进行拖拽填充即可
当然,如果不是很明白,可以先填入几个公式,寻找其中的规律,然后确定哪个为绝对引用,哪个为相对引用
注:对于该例还可以使用行列函数
回到案例上来,我们需要使用绝对引用,将公式更改为 =MID(输入验证!$E$2,1,1)
但我们又发现一个问题,截取的开始位置也不对,应该依次加1,而不是绝对的数值1,这里我们可以借助row和column函数实现自增
row([refrence])和column([refrence])函数分别返回参数单元格的行数和列数,如果不填写参数,返回当前单元格的行列数,比如B3单元格row(B3)返回3,column(B3)返回2
我们在拖动的时候,单元格的行数一直在增1,我们就可以利用row函数来代替上面公式中star_number的参数,于是单元格B2中的公式就变成了 =MID(输入验证!$E$2,ROW()-1,1)
这里row函数会返回2,需要将它进行减1处理;输入公式时按【Esc】取消
这样,我们拖动就可以得到前17位的数字,然后我们根据身份证校验码的规律,需要计算他们的积的和对11的余数,然后进行对应转换
对于乘积和求和比较简单,我们直接在D2单元格中输入=B2*C2
,然后按【Enter】键后向下拖拽即可,而求和只要在D19单元格中输入=SUM(D2:D18)
即可求和,取余运算我们使用mod(number,divisor)函数,前者参数表示被取余的数,后面表示用谁取余,这里我们在C19单元格中输入公式 =MOD(D19,11)
接下来我们来分别查询输入号码提取的地区码、出生日期、顺序号、校验码,使用mid、left、right函数即可,就不介绍了
通过地区码需要查询相应的地区,我们使用vlookup(lookup_value,table_array,col_index_number,[range_lookup])函数,这里介绍一下各个参数;
vlookup函数中第一个参数表示查找的值,第二个参数表示在哪个区域进行查找(所选区域的第一列包含查找值,所选区域的其他列与第一列数据个数相同),第三参数表示返回单元格(行为查找值所在行)列为所选区域的第几列,注意这里的列数字范围在所选区域内,不是在整个工作表中,第四参数是匹配的方式,0(FLASE)表示精确匹配,1(TRUE)表示模糊(近似)匹配,工作中一般使用精确匹配,模糊(近似)匹配只有在匹配某一范围时才使用
因此我们在H2单元格中输入公式 =VLOOKUP(--$G$2,地址码对照!A:B,2,0)
,这里由于G2单元格的格式为文本,需要将其转换为数字格式才能与地址码对照表中的地址码匹配,因此可以使用G2*1或--G2转换为数字格式
在H3单元格中,我们想判断输入的日期是否合法,即不能出现1994-2-30这样的,这里我们首先通过date(year,month,day)来进行数字转日期,于是我们输入公式 =DATE(LEFT($G$3,4),MID($G$3,5,2),RIGHT($G$3,2))
,
这里说明一下date函数,如果是 =DATE(2000,4,31)
这样,会显示2000/5/1,不会出现非法日期,这样我们通过对比输入的日期和转换后的日期就可以检验输入的生日日期是否合法(在“输入校验”工作表中展示)
判定性别需要判定顺序号的奇偶性,这里我们可以使用顺序号对2取余,如果是1,即表示为奇数,如果为0即表示为偶数,因此H4单元格的公式为 =MOD($G$4,2)
在JK两列,我们录入余数与校验码的对应关系,然后在H5单元格中使用vlookup函数,查找对应的校验码,注意,这里的余数是C19单元格数值。
这部分我们基本完成了,接着跳转到“输入验证”工作表中,进行后续工作的处理:
“输入验证”后续显示
查询后的地址如果有就显示对应地址,如果没有就显示查无此地区,并作浅绿色填充。
介绍一下iferror(value,value_is_error),如果vlookup未查找到结果,会返回N/A错误,这里的iferror会接收全部的错误结果,不只N/A错误,还有除0错误等等,如果第一个参数返回某错误,就执行第二参数,如果第一个参数没有返回错误,就显示第一个参数的结果。
在B3单元格我们输入公式 =IFERROR(输入验证!校验!$H$2,"查无此地区")
即可。
浅绿色背景填充使用条件格式,在『开始选项卡』-「样式组」~【条件格式下拉突出显示单元格规则--等于】,位置如下:
在接下来的窗口中输入如下信息:
这里再后面直接输入文字查无此地区也行,Excel会自动转换
然后设置填充为浅绿色即可
查询后的生日直接引用校验表中的H3单元格( =校验!$H$3
),但这里如果与录入截取的日期不同,需要显示红色填充,且提示数据录入不合法(做在C4单元格中),这里需要对比文本和日期,而使用&""将日期转换为文本或将文本转换为数字“--数字文本”都无法做到需要进行转换,这里需要使用text(value,format_text)函数。
Excel中的日期是基于1900-1-0开始的计数,实际上也是一个数,比如输入0.5,将其显示为日期格式是1900-1-0,12:00
text函数中,第一个参数是文本;第二个参数是转换后的文本格式,就是单元格格式中自定义的一系列特殊字符组合
在该例中,我们将日期转换为8位日期格式,于是输入公式 =TEXT($B$4,"yyyymmdd")
,然后将其结果与提取出的生日日期文本进行对比,如果不相等,则日期输入不合法,否则显示为空,于是整体的公式为 =IF(TEXT($B$4,"yyyymmdd")<>校验!$G$3,"输入的生日不合法","")
,这里不等于用<>表示
在B4单元格需要设置使用公式的条件格式,在『开始选项卡』-「样式」~【条件格式下拉新建规则】,通过使用公式 =TEXT($B$4,"yyyymmdd")<>校验!$G$3
,然后设置格式为红色填充
接下来我们讲一下如何计算年龄,使用datedif(star_date,end_date,format_time)·,
DATEDIF函数在Excel 2016中没有提示,但可以使用,其中的参数提示是我自己写的,第一个和第二个参数是开始的日期和结束的日期,第三个参数是显示的形式,比如"y"、"m"、"d"、"ym"、"md"分别表示两日期相隔的年数、月数、天数,除满年后剩余的月份,除满月份剩余的天数,类似取余函数,这里举个例子,比如今天是2018-8-10日(第二参数),求距1998-2-22的各个显示形式,于是有20,245,7474,5,19,则通过拼接可以得到据今20年零5个月零19天。
判断年龄一般只要年和月即可,因此,我们在B5单元格中输入公式 =DATEDIF($B$4,TODAY(),"y")&"岁零"&DATEDIF($B$4,TODAY(),"ym")&"个月"
查询后的性别根据奇偶性判断,于是有公式=IF(校验!$H$4=1,"男","女")
,由于这里的校验!$H$4单元格只会有1和0两种结果,而在if函数中,1表示条件成立,0表示条件不成立,于是可以将公式简化为 =IF(校验!$H$4,"男","女")
接下来判断输入的文本校验码与计算的校验码是否相等,使用公式 =IF(校验!$G$5=校验!$H$5&"","正确","错误")
,这里将H5单元格与空字符连接将数字强制转换为文本,当然,你还可以添加条件格式“等于"错误"”,参见上面的“查无此地区”
解释完了校验码的形成,我们可以逆推出十五位转十八位需要增加的校验码公式为 =IFERROR(VLOOKUP(MOD(MID(E1,1,1)*7+MID(E1,2,1)*9+MID(E1,3,1)*10+MID(E1,4,1)*5+MID(E1,5,1)*8+MID(E1,6,1)*4+11+MID(E1,7,1)*6+MID(E1,8,1)*3+MID(E1,9,1)*7+MID(E1,10,1)*9+MID(E1,11,1)*10+MID(E1,12,1)*5+MID(E1,13,1)*8+MID(E1,14,1)*4+MID(E1,15,1)*2,11),校验!$J$2:$K$12,2,0),"")
这里需要考虑如果不是十五位时E1单元格为"",会出现错误,因此增加了IFERROR判定
最后,我们填写E2单元格公式 =IF(E1,LEFT(E1,6)&"19"&RIGHT(E1,9)&E3,B1)
,这样,之前对E3的引用就会生效了
“批量录入身份号码自动检测”工作表
前面讲了很多公式与原理,但我们通常不是要查询身份号码是否同本人一致,而是在大量的录入中减少错误
接下来,我们讲解一下如何使用我们的源文件进行快速检测身份证号码是否录入正确的操作
1. 首先我们要复制源工作簿文件的“批量录入时复制该表”到你想要校验的工作簿文件(以下称现文件)中
2. 然后我们复制“批量录入检测”工作表的I1:L2到现文件
3. 将你需要录入身份号码的单元格格式设置为文本
4. 根据您具体的现文件的录入区域更改公式的单元格引用,如您的第一个号码是在C2单元格,就使用【Ctrl+H】将复制的I2:L2中公式中的B2更改为C2
5. 选中I2:L2,然后向下填充公式
6. 之后设置数据有效性(详见前面)和条件格式
这里您可以仅使用数据有效性“1”中的公式或配合数据有效性“2”和条件格式“2”来进行验证
这里演示一下第二种方法来校验
这里由于之前有数据,不是新录入的数据,因此没有出错警告,但新录入的数据会有停止警告
做好了这些,有了字符位数、地区码、生日、校验码,录入出错的几率会大大降低,当然不排除故意的上交错误信息
最后总结一下我们通过该工作簿的设计制作可以学到的知识,你都学会了吗?
- 互换两列数据(非插入列)
- 单元格格式设置文本或自定义“第@位”
- 数据验证(数据有效性):字符个数为15位或18位
- 函数:IF,IFERROR,DATE,DATEDIF,LEFT,RIGHT,MID,MOD,VLOOKUP,TEXT,ROW,COLUMN,LEN,LENB,OR,AND,SUM
- 自定义序列填充
- 剪贴板固定单元格显示数据
- 单元格的相对、绝对、混合引用
- 单元格条件格式:等于、公式
- 使用源文件设置现文件条件限制
微信关注“未央暮城”公众号,获取更多精彩内容