编写一个能够排序的函数模板。_编写一个Excel自定义函数,身份证信息提取如探囊取物...

观看视频更直观

我们建立信息表时不仅要输入性别、生日和年龄等信息,往往也需要输入身份证号码,而身份证号码中包含有籍贯、性别、生日和年龄等信息,从身份证号码中提取上述信息可以减少输入工作量,提高工作效率。利用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

0d729f51da43d575614a5021744a3b38.png

二、IDinfo自定义函数的使用

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

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

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

2、使用范例

598807999ded6cfdead59cee7c82a7ce.png

⑴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也行,数据较少也不麻烦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值