观看视频更直观

我们建立信息表时不仅要输入性别、生日和年龄等信息,往往也需要输入身份证号码,而身份证号码中包含有籍贯、性别、生日和年龄等信息,从身份证号码中提取上述信息可以减少输入工作量,提高工作效率。利用Excel中的内置函数可以完成,但略显烦琐,要用到MID 函数、TEXT函数、、IF函数、ISEVEN函数(或ISODD函数或MOD函数)、DATEDIF函数、TODAY函数,很多人难以灵活使用。

我利用VBA在Excel中自定义了一个IDinfo函数,一个函数就能完成从身份证号码中提取出性别、生日与年龄信息,还自动甄别身份证号码输入正误,特别实用。

一、插入模块并复制粘贴代码

打开Excel后新建一个工作簿,右击"sheet1工作表标签,在弹出的快捷菜单中选择"查看代码"命令,打开VBA窗口,单击"插入"菜单→"模块"命令,插入一个模块,选中其中的"模块1",将下面的代码复制到其中即可。

Public Function IDInfo(strID As String, Optional bType As Byte = 1)
Application.ScreenUpdating = False
Dim i As Byte, s As String
If Len(strID) <> 18 Then
IDInfo = "身份证号码错误"
Exit Function
'若文本长度不等于18,返回"错误"并退出函数
End If
For i = 1 To 17
If Asc(Mid(strID, i, 1)) < 48 Or Asc(Mid(strID, i, 1)) > 57 Then
IDInfo = "身份证号码有误"
Exit Function
'若1至17位不是数字,返回"错误"并退出函数
End If
Next
For i = 1 To 17
a = Val(Mid(strID, i, 1)) '从左至右依次取得各位上的数字
w = (2 ^ (18 - i)) Mod 11 '计算加权因子
k = k + a * w '累计计算加权因子与数字的乘积和
Next i
k = k Mod 11 '求除以11的余数
s = Mid("10X98765432", k + 1, 1)
If s <> Right(strID, 1) Then
IDInfo = "身份证号码错误"
Exit Function
'若身份证号码校验错误,返回"错误"并退出函数
End If
Select Case bType
Case 1 '获取性别
If Val(Mid(strID, 17, 1)) Mod 2 = 0 Then
IDInfo = "女" '偶数性别为女
Else
IDInfo = "男" '奇数性别为男
End If
Case 2 '获取生日
Dim iDate As Date
iDate = WorksheetFunction.Text(Mid(strID, 7, 8), "#-00-00")
IDInfo = Format(iDate, "Long Date")
Case 3 '获取年龄
IDInfo = Format(Now, "yyyy") - Val(Mid(strID, 7, 4))
If Val(Mid(strID, 7, 4)) = 0 Then IDInfo = ""
End Select
End Function




ExampleMatcher 取第一项 excel提取第一个数_自定义


二、IDinfo自定义函数的使用

1、函数语法:IDInfo(strID,[ bType])

strID:必需参数,代表身份证号码或对身份证号码的引用。

bType:可选参数,表示获取信息的类型,1或省略表示获取性别,2表示要获取生日,3表示要获取年龄。

2、使用范例


ExampleMatcher 取第一项 excel提取第一个数_提高工作效率_02


⑴A列存储身份证号码,其中A2为正确身份证号码,其中均为杜撰的错误身份证号码。

⑵在B2单元格内输入"=IDinfo($A2, COLUMN(A1))",拖曳B2填充柄到D2单元格,再拖曳至所需目标处,如图中D2单元格。注意:为了能正确拖曳复制公式,第1个参数要用混合引用,列锁定行相对;第2个参数使用COLUMN函数也是为了方便拖曳,COLUMN函数返回列的列标,如COLUMN(A1)就是返回1即A列的列标,公式拖曳到C2、D2时,COLUMN(A1)就相应变成了COLUMN(B1)、COLUMN(C1),它们分别返回2和3,如果你不理解COLUMN函数就直接输入参数1、2、3也行,数据较少也不麻烦。