VBA自定义身份证信息处理函数

 时间:2024-10-14 09:27:57

Excel内置了几百多个函数,对于大多数问题都可以应用内置函数轻松解决,但有些问题用内置函数解决起来很复杂,甚至是无能为力。比如要验证身份证号是否正确,提取出生日期、性别及年龄,后者应用组合函数还是比较容易解决,但前者却无法解决,这时就可以利用VBA开发自定义函数。

工具/原料

Excel办公软件

一、身份证号含义及校验规则说明

1、中国居民身份证目前都已经升级到18位,其中每一位数字都有特殊的含义,说明如下:①1-2 省级行政区代码②3-4 地级行政区划分代码③5-6 县区行政区分代码④7-10 11-12 13-14 出生年、月、日⑤15-17 顺序码,同一地区同年、同月、同日出生人的编号,奇数是男性,偶数是女性⑥18 校验码,如果是0-9则用0-9表示,如果是10则用X(罗马数字10)表示因此只要能够验证身份证号的正误,我们就可以根据居民身份证编码规则提取出生日期及性别,并进一步计算出年龄,那么如何判断证件号码正误呢?第二代居民身份证拥有一套明确的校验位校验算法,第一步:获取余数,前17位号码与加权因子的乘积和除以11得出余数;第二步:用余数比照校验码对照表得出的校验码,再与身份证号最后一位比对,如一致则正确,否则证件错误。

VBA自定义身份证信息处理函数

二、自定义函数设计思路

1、自定义函数名CHECKID,包含两个参数:参数1:ID_CODE,居民身份证号;参数2:FUNCTION_NUM,返回值类型,1判断证件号码正误,2提取出生日期,3提取性别,4计算周岁年龄。算法设计:①出生日期:应用MID函数截取7-14位数字,再用text函数转换成日期;②性别:顺序码为15-17位,但为简化计算取第17位即可,然后除以2取余。余数为0,则为“女”,反之为“男”;③周岁年龄:当前年份减去出生年份得出一个值,再比较月份,如当前月份小于出生月,则年份差值再减去1为周岁年龄,反之大于,则年份差值为周岁年龄,如月份相同,则顺次再比较日。

三、自定义函数代码

1、Function CHECKID(ID_COD苇质缵爨E As Range, FUNCTION_NUM As Integer)Dim myReg As ObjectDim sum_num As Integerfactor = Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2) '身份证号加权因子Check_code = Array("1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2") '最后一位有效校验位If Len(ID_CODE.Value) = 18 Then '判断是否为18位 Set myReg = CreateObject("Vbscript.regexp") myReg.Pattern = "[A-Za-z0-9]{1}" '应用正则表达式分拆成18个1位数,此步可以应用mid函数,但正则表达式会效率会更高 myReg.Global = True Set code = myReg.Execute(ID_CODE.Value) For i = 0 To 16 sum_num = code(i) * factor(i) + sum_num Next If Check_code(sum_num Mod 11) = UCase(code(17)) Then Select Case FUNCTION_NUM Case 1 '判断证件号码是否正确 CHECKID = "正确" Case 2 '提取出生日期 CHECKID = Application.WorksheetFunction.text(Mid(ID_CODE.Value, 7, 8), "0-00-00") Case 3 '返回性别 If code(16) Mod 2 = 0 Then CHECKID = "女" Else CHECKID = "男" Case 4 '返回周岁年龄 birthdate = Application.WorksheetFunction.text(Mid(ID_CODE.Value, 7, 8), "0-00-00") If Month(birthdate) < Month(Date) Then CHECKID = DateDiff("yyyy", birthdate, Date) ElseIf Month(birthdate) > Month(Date) Then CHECKID = DateDiff("yyyy", birthdate, Date) - 1 ElseIf Day(birthdate) > Day(Date) Then CHECKID = DateDiff("yyyy", birthdate, Date) - 1 Else CHECKID = DateDiff("yyyy", birthdate, Date) End If End Select Else CHECKID = "错误"End IfElse CHECKID = "非中国居民身份证"End IfEnd Function

2、自定义函数应用效果

VBA自定义身份证信息处理函数
  • 怎么用VBA代码设置单元格为日期加24小时格式
  • 在VBA中,如何更改字典中关键字的条目?
  • Excel如何快速提取单元格中的数字
  • excel的EXACT函数与SUMPRODUCT函数汇总
  • Excel如何使用XOR函数?
  • 热门搜索
    爱国卫生月手抄报 关于防控疫情的手抄报 历史手抄报图片 有关疫情的手抄报 奥运会手抄报 春节的来历手抄报 网络安全手抄报的句子 抗病毒手抄报 防疫有我爱卫同行手抄报 端午节手抄报第一名