设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 4144|回复: 5
打印 上一主题 下一主题

[人事] VBA对身份证位数的判断(国内 香港 台湾身份证)

[复制链接]

点击这里给我发消息

跳转到指定楼层
1#
发表于 2018-10-30 17:32:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近有个客户的人力资源系统(人事 考勤 工资)要修改
主要增加录入香港同事 及台湾同事的身份证号
之前主要是针对国内的15位及18位身份证号的判断(自动提取出生日期 性别等)
但限制了身份证号的长度,所以台湾及香港的身份证就无法输入了
所以研究了一下台湾身份证及香港身份证

1.香港身份证
   香港的身份证是由8位数字或者字母组成的,首位一定是字母,中间的一定是数字的,至于()内的就一般是数字或者字母的,其实很多人都不知道,()内的这个字母或者数字,其实是效验前面的字母或者数字有没有写错,是用首7位的字母跟数字,用一种加权计算的方法出()内的数字或者字母,所以最后一位一般称为"效验数",是用来效验身份证的前面7位的准确性

2.台湾身份证
   台湾人的身份证号码共十码
第1码是英文字母,不同的县巿用不同的字母。
每个字母代表两个数字
第2码代表性别(1是男生; 2是女生)
第3码~第9码是顺序码(基本上是越早出生的号码越前面)
第10码是判别码(判别是否为合法的身份证号码)
把前9码所代表的数字列出来,再乘以他的加权数(我记得是10~1)
接下来全部加起来,然后总和以10去除,取余数之后
以10来减那个余数之后得到的那个数字再以10去除取余数之后那个数字就是最后一个判别码
所以最简单的方法是前面9个码依规则乱编,最后一码从0试到9,一定有一个会是对的


3.国内身份证
  国内新的二代身份证主要是18位的。旧的是15位的。这里就不详细介绍了。大家搜索一下


对身份证号的判断


Private Sub FIdenCardNo_BeforeUpdate(cancel As Integer)
    Dim strPara As String
    Dim j As Integer
    Dim rs As DAO.Recordset
   
' 之前是强制 判断是15 或18 位,后来将 这个长度 设置为一个参数保存在参数表中 ,参数值为:  15,18,10  
'    If Len(Nz(FIdenCardNo)) <> 18 And Len(Nz(FIdenCardNo)) <> 15 Then
'       gt_MessageBox "身份证号码必须为18位为15位"
'       cancel = True
'       Exit Sub
'
'
'    End If


    If Nz(FIdenCardNo) <> "" And (Nz(FIdenCardNo.OldValue) <> Nz(FIdenCardNo.Value)) Then
        Set rs = CurrentDb.OpenRecordset("Select * from tblHrmEmp where FIdenCardNo='" & Me.FIdenCardNo & "' and FEmpStatusId<>'4'")
        If rs.RecordCount > 0 Then
             gt_MessageBox "此员的身份证号码与在职的另一个员工:" & rs("FEmpCode") & " " & rs("FEmpName") & "重复!" & vbCrLf & "请重新输入!"
            cancel = True
        End If
        rs.Close
        Set rs = CurrentDb.OpenRecordset("Select * from tblHrmEmpHist where FIdenCardNo='" & Me.FIdenCardNo & "'")
        If rs.RecordCount > 0 Then
           If gt_MessageBox("身份证号码与离职库中另一个员工:" & rs("FEmpCode") & " " & rs("FEmpName") & " 有重复 ,是否继续?", 2) = vbNo Then
            cancel = True
            Exit Sub
           End If
        End If
        rs.Close
    End If
   
    If Nz(DLookup("FIdenCardNo", "tblHrmBlacklist", "FIdenCardNo='" & Me.FIdenCardNo & "'")) <> "" Then
          MsgBox "此身份证[" & Me.FIdenCardNo.Value & "]与黑名单中一致,不能保存!", vbInformation, "提示"
          cancel = True
          Exit Sub
    End If
   ' If Nz(Me.FIdenType) = "身份证" Then
        strPara = gt_GetSysPara("AllowMaxIdenLen")
        'strPara = DLookup("FSysParaValue", "tblZstmParameter", "FSysParaName='AllowMaxIdenLen'")
        Dim varPara As Variant
        Dim intLen As Integer
        Dim blnOk As Boolean
        varPara = Split(strPara, ",")   ' 取参数值,参数值为:  15,18,10  
        intLen = Len(FIdenCardNo.Value)
        For j = 0 To UBound(varPara)
            If intLen = Val(varPara(j)) Then
                blnOk = True
                Exit For
            End If
        Next
        If blnOk = False Then
            gt_MessageBox "身份证号码长度不对"
            cancel = True
        End If

  '  End If
End Sub




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅
2#
发表于 2018-10-30 17:36:55 | 只看该作者
赞一个。
回复

使用道具 举报

3#
发表于 2018-10-30 17:45:57 | 只看该作者
谢谢分享
回复

使用道具 举报

点击这里给我发消息

4#
发表于 2018-10-30 18:02:10 | 只看该作者
谢谢分享,赞一个。。
5#
发表于 2018-10-30 18:39:35 | 只看该作者
谢谢分享,赞一个。。
6#
发表于 2018-11-16 23:51:42 | 只看该作者
谢谢分享!收藏了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-12-1 17:32 , Processed in 0.092108 second(s), 30 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表