10年前写的,身份证号码验证VBA代码

这是一个用于验证18位身份证号码有效性的VBA函数,检查包括格式、出生日期和校验码等,适用于Excel单元格数据校验。通过插入模块并调用函数CheckID即可进行身份证号码的验证。

工作中经常与身份证号码打交道,现在各类信息系统都把身份证号码作为识别定义人员的关键字段,下面这段代码,在我的工作中发挥了极其重要的作用!分享出来,希望能帮助到更多的人!

10年前写的,if套if,格式不规范,也不够简练,但用起来还是挺好用的!不再改了!

函数入参就1个,已经在代码里面注明了。

函数返回结果共7种,分别是:

身份证号码格式问题:

  1. Err01_身份证号码格式错误;
  2. Err05_身份证号码末位须为半角数字或字母X;
  3. Err06_身份证号码前17位须为半角数字;
  4. Err07_身份证号码必须是18位;

身份证号码出生年月日(第7位至第14位)错误:

  1. Err02_身份证号码错误;
  2. Err03_身份证号码错误;

身份证号码校验错误:

  1. Err04_身份证号码校验错误;

使用方法很简单,按Alt+F11,【插入】—【模块】,粘贴下面代码。在单元格中输入:

=CheckID(单元格地址)

即可校验指定单元格内身份证号码有效性。

'=====================================
'函数名称:CheckID
'
'函数作用:验证身份证号码是否有效
'
'参    数:cid,身份证号码,String类型
'
'返 回 值:错误信息,String类型
'
'作    者:w2kexp@csdn
'
'编写日期:2013-11-13
'=====================================
Function CheckID(ByVal cid As String)
 Dim rn As Boolean '闰年标志
 Dim DaysFebruary As Integer  '2月份天数
 Dim DaysPerMonth       	  '每月天数
	Select Case Len(cid)
    Case 18                                                                                                                              '当身份证号码为18位时
    If IsNumeric(Left(cid, 17)) Then
        If IsNumeric(Right(cid, 1)) Or Right(cid, 1) = "X" Then                                                                          '如果最后一位是数字或"X"时,判断是否为闰年
                 If Int(Mid(cid, 7, 2)) < 18 Or Int(Mid(cid, 7, 2)) > 20 Or Int(Mid(cid, 11, 2)) < 1 Or Int(Mid(cid, 11, 2)) > 12 Then
                    CheckID = "Err01_身份证号码格式错误;"
                    Exit Function

                 Else

                  '如果年、月格式正确,开始判断每月天数
                        If Mid(cid, 8, 3) = "000" And Int(Mid(cid, 7, 4)) Mod 400 = 0 Then            '如果是世纪年,且能被400整除,为闰年
                             rn = True
                        Else
                           If Int(Mid(cid, 7, 4)) Mod 4 = 0 And Int(Mid(cid, 7, 4)) Mod 100 <> 0 Then      '如果是能被4整除,且不能被100整除,为闰年
                             rn = True
                           Else
                             rn = False
                           End If
                        End If
                        '取得rn结果
					   If Int(Mid(cid, 11, 2)) = 2 Then                                        '如果是2月,判断天数
						 If rn = True Then   '闰年2月29天
							DaysFebruary = 29
							Else             '否则2月28天
							DaysFebruary = 28
						 End If
						 If Int(Mid(cid, 13, 2)) > DaysFebruary Then         '2月份天数大于DaysFebruary就报错
							CheckID = "Err02_身份证号码错误;"
							Exit Function
						 End If
					   Else                                                                   '如果是其它月份,判断天数
							If Int(Mid(cid, 11, 2)) = 4 Or Int(Mid(cid, 11, 2)) = 6 Or Int(Mid(cid, 11, 2)) = 9 Or Int(Mid(cid, 11, 2)) = 11 Then
							   DaysPerMonth = 30
							Else
							   DaysPerMonth = 31
							End If
						  If Int(Mid(cid, 13, 2)) > DaysPerMonth Then
							CheckID = "Err03_身份证号码错误;"
							Exit Function
						  End If
					  End If

                 '验证检验码
                     Dim cidws
                     Dim s As Long
                     s = 0
                     cidws = Split("7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2", " ")
                     For a = 1 To 17
                     s = s + Mid(cid, a, 1) * cidws(a - 1)
                     Next
                     ys = s Mod 11
                     Dim ysdy, bcid
                     ysdy = Split("1 0 X 9 8 7 6 5 4 3 2", " ")
                     bcid = Left(cid, 17) & ysdy(ys)
                     If bcid <> cid Then
                        CheckID = "Err04_身份证号码校验错误;"
                        Exit Function
                        Else
                        CheckID = ""
                     End If
                End If
        Else
            CheckID = "Err05_身份证号码末位须为半角数字或字母X;"
            Exit Function
        End If
	Else
			CheckID = "Err06_身份证号码前17位须为半角数字;"
			Exit Function
	End If

	Case Else
        CheckID = "Err07_身份证号码必须是18位;"
        Exit Function
    End Select
End Function
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值