身份证自定义函数是什么意思(关于身份证信息的自定义函数)

各位朋友,你们好。今天和你们分享身份证信息的自定义函数。

身份证号码在生活和工作中使用非常广泛,因此在日常工作中经常会需要对身份证号码进行分析和处理。今天给大家介绍对身份证信息处理的两个自定义函数。

①、身份证号码正误检查;

②、从身份证号中提取信息。


一、身份号码正误检查

身份证号码在很多地方都需要用到,如果我们在登记身份信息时,录入了错误的身份证号码,会给我们带来很多不必要的麻烦。因此,在录入身份的时候,最好能对身份证号正误进行检查,下面就给大家说说从哪些方面对身份证号进行检查。(以下代码中【ID】作为一个字符串变量,表示身份证号码)

1、身份证号码位数检查

现在身份证号码都是18位的,如果少录入了一位,凭一双肉眼还真不一定能及时发现。我们可以用以下代码来检查身份证号码的位数:

If VBA.Len(ID) <> 18 Then CheckID = "身份证号码位数错误" Exit Function End If

2、检查非法字符

身份证号码前17位均为数字,如果不小心录入成了字母,会造成号码错误,所以需要对其做判断,代码如下:

For a = 1 To 17 If VBA.IsNumeric(VBA.Mid(ID, a, 1)) = False Then CheckID = "身份证号有非法字符" Exit Function End If Next

3、省份地址代码检查

身份证号码的前面六位是表示省市县信息的地址代码,这个代码错误必然会导致身份证号码错误,所以需要检查,代码如下:

Dim SFCode '省份代码存放数组 Set Dic = CreateObject("scripting.dictionary") SFCode = Array(11, 12, 13, 14, 15, 21, 22, 23, 31, 32, 33, 34, 35, 36, 37, 41, 42, 43, 44, 45, 46, 50, 51, 52, 53, 54, 61, 62, 63, 64, 65, 71, 81, 92, 91) For a = 1 To UBound(SFCode, 1) Dic(SFCode(a - 1)) = "" Next If Not Dic.exists(VBA.Left(ID, 2) * 1) Then CheckID = "区域代码错误" Exit Function End If

由于无法单独对市和县地址代码单独核查,市和县的地址信息必须与省份地址信息结合来做判断,这样就需要一份数据表,有条件的朋友可以收集一份完整、详细的地址代码信息表。

4、生日信息检查

身份证号码中有生日信息,这个生日信息,也可以作为检查身份证号码是否正确的一个参数,代码如下:

DimDateCode$ DateCode = Application.Text(VBA.Mid(ID, 7, 8), "0000-00-00") If VBA.IsDate(DateCode) = False Then CheckID = "生日信息错误" Exit Function End If

5、身份校验码检查

这个是身份证号码检查比较重要的一个参数,前面的位数、非法字符、生日等信息,细心点或许可以检查处理,而身份证校验码,需要通过一定的计算过程才能算出,这个校验码也是15位身份证号码升级18位身份证号码的一个关键点。

对身份证校验码的判断,需要先根据计算出校验码,然后再和所录入的校验码对比看是否一致。代码如下:

Dim ArrayCode, ArrayMod, ArrayCoef '身份证验算代码存放数组 Dim ResultProd, ValidateCode$, ArrayID(16) As Integer ArrayCode = Array(1, 0, "X", 9, 8, 7, 6, 5, 4, 3, 2) ArrayMod = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) ArrayCoef = Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2) For a = 1 To 17 ArrayID(a - 1) = VBA.Mid(ID, a, 1) Next ResultProd = Application.WorksheetFunction.SumProduct(ArrayCoef, ArrayID) ResultMod = ResultProd Mod 11 ValidateCode = Application.WorksheetFunction.Index(ArrayCode, ResultMod 1) If ValidateCode <> Right(ID, 1) Then CheckID = "身份证校验码错误" Else CheckID = "正确" End If

6、合并成一个自定义函数

最后,将以上的代码全部合并起来,就可以得到一个完整的身份证号码信息检查的自定义函数;

身份证自定义函数是什么意思(关于身份证信息的自定义函数)(1)

Function CheckID(ID As String) '检验身份证号码是否正确的自定义函数 Dim SFCode '省份代码存放数组 Dim ArrayCode, ArrayMod, ArrayCoef '身份证验算代码存放数组 Dim ResultProd, ValidateCode$, DateCode$, ArrayID(16) As Integer Dim Dic Dim a As Byte Set Dic = CreateObject("scripting.dictionary") SFCode = Array(11, 12, 13, 14, 15, 21, 22, 23, 31, 32, 33, 34, 35, 36, 37, 41, 42, 43, 44, 45, 46, 50, 51, 52, 53, 54, 61, 62, 63, 64, 65, 71, 81, 92, 91) ArrayCode = Array(1, 0, "X", 9, 8, 7, 6, 5, 4, 3, 2) ArrayMod = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) ArrayCoef = Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2) '身份证位数检查 If VBA.Len(ID) <> 18 Then CheckID = "身份证号码位数错误" Exit Function End If '前17位只能是数字 For a = 1 To 17 If VBA.IsNumeric(VBA.Mid(ID, a, 1)) = False Then CheckID = "身份证号有非法字符" Exit Function End If Next '省市代码检查 For a = 1 To UBound(SFCode, 1) Dic(SFCode(a - 1)) = "" Next If Not Dic.exists(VBA.Left(ID, 2) * 1) Then CheckID = "区域代码错误" Exit Function End If '生日信息检查 DateCode = Application.Text(VBA.Mid(ID, 7, 8), "0000-00-00") If VBA.IsDate(DateCode) = False Then CheckID = "生日信息错误" Exit Function End If '身份证校验码验证 For a = 1 To 17 ArrayID(a - 1) = VBA.Mid(ID, a, 1) Next ResultProd = Application.WorksheetFunction.SumProduct(ArrayCoef, ArrayID) ResultMod = ResultProd Mod 11 ValidateCode = Application.WorksheetFunction.Index(ArrayCode, ResultMod 1) If ValidateCode <> Right(ID, 1) Then CheckID = "身份证校验码错误" Else CheckID = "正确" End If End Function


二、从身份证号码中提取信息

身份证自定义函数是什么意思(关于身份证信息的自定义函数)(2)

从身份证号码中,我们可以提取生日、性别,然后可以利用生日计算出年龄

当然还可以利用生日信息计算星座、农历生日。但是每年的星座日期都不是完全固定的,会出现一定概率的错误;对农历生日的计算,还需要其他的自定义函数,超出了本次知识点的范围了;省市县地址代码的信息,也和身份证上的地址信息不会完全一致,除了计算籍贯,其他用处不太大。所以本次机仅考虑提取生日、性别、年龄这三个信息。

下面是自定义函数的代码,这个自定义函数有两个参数,一个是身份证号码,一个是提取类型参数。提取类型为1,可以得到性别;提取类型为2,可以得到年龄;提取类型为3,可以得到年龄。

Public Function GetID(ID As String, LookupType As Byte) '从身份证号码中提取信息的自定义函数 Dim a%, Tmp$ '申明变量 Application.Volatile Tmp = Trim(ID) Select Case LookupType Case 1 'Sex Dim SexValue As Byte SexValue = VBA.Mid(Tmp, 17, 1) If SexValue Mod 2 = 1 Then GetID = "男" Else GetID = "女" End If Case 2 'Birthday GetID = Application.Text(VBA.Mid(Tmp, 7, 8), "0000-00-00") Case 3 'Age Dim DateCode As String DateCode = Application.Text(VBA.Mid(Tmp, 7, 8), "0000-00-00") GetID = DateDiff("yyyy", DateCode, Now) End Select End Function

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页