ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 19252|回复: 10

[原创] 统一社会信用代码(三证合一)校验函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-2-14 10:56 | 显示全部楼层 |阅读模式
  1. '//////////////////////////////////////////////////////////
  2. '输入值:统一代码(三证合一): 如: 91340828578527976Q
  3. '函数: checkSCC(StrUniCode)
  4. '参数: StrUniCode 为输入的统一代码
  5. '返回值:
  6. '       0 = 检验位错
  7. '      -1 = 检验通过
  8. '      -2 = 验证格式错误
  9. '      -3 = 计算错误(也属于格式错误)
  10. '      -4 = 其他错误(如果出现-4,应检查还有其他没有考虑到的错误)
  11. 'Make By:~苦笑人生(QQ:42001979)   10:52 2016-02-14
  12. '如有不足之处,欢迎批评指证,VBA交流
  13. '//////////////////////////////////////////////////////////
  14. '参照标准:
  15. '附件:《GB_32100-2015_法人和其他组织统一社会信用代码编码规则.》
  16. '按照编码规则:
  17. '统一代码为18位,统一代码由十八位的数字或大写英文字母(不适用I、O、Z、S、V)组成,由五个部分组成:
  18. '第一部分(第1位)为登记管理部门代码,9表示工商部门;
  19. '第二部分(第2位)为机构类别代码,1-企业、2-个体工商户、3-农民专业合作社 9-其他
  20. '第三部分(第3-8位)为登记管理机关行政区划码;
  21. '第四部分(第9-17位)为全国组织机构代码;
  22. '第五部分(第18位)为校验码

  23. Sub test()
  24.     '//测试数据,部分来自百度图片
  25.     a = checkSCC("91350100M000100Y43")
  26.     a = checkSCC("91430382092581024J")
  27.     a = checkSCC("914103057167119596")
  28.     a = checkSCC("9A350100M000100Y47")
  29.     a = checkSCC("91340828578527976Q")
  30.     a = checkSCC("91350128M00000019A")
  31.     a = checkSCC("52100000523000026F")
  32.     a = checkSCC("91350200M000000510")
  33.     a = checkSCC("91520421MA6DJ09246")
  34.     a = checkSCC("91440300359143307G")
  35.     a = checkSCC("91340881MA2MQ0T315")
  36. End Sub

  37. Function checkSCC(StrUniCode)
  38.     Application.Volatile
  39.    
  40.     On Error GoTo ErrHand
  41.    
  42.     StrUniCode = UCase(StrUniCode)
  43.    
  44.     Dim Wf As String        '//代码字符集-代码字符
  45.     Dim Wi As Variant       '//各位置序号上的(加权因子)
  46.    
  47.     Wf = "0123456789ABCDEFGHJKLMNPQRTUWXY"
  48.     Wi = Array(1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28)

  49.     Dim RegEx
  50.     Set RegEx = New RegExp     '建立正则表达式。
  51.    
  52.     RegEx.Pattern = "^([0-9ABCDEFGHJKLMNPQRTUWXY]{2})(\d{6})([0-9ABCDEFGHJKLMNPQRTUWXY]{9})([0-9ABCDEFGHJKLMNPQRTUWXY])$"
  53.    
  54.     If Not RegEx.Test(StrUniCode) Then
  55.         Err.Raise vbObjectError + 10, 0, "验证格式错误"
  56.     End If
  57.    
  58.     Dim Total As Long           '//奇偶校验汇总(求和)
  59.     Dim LastNum As String * 1     '//输入校验位
  60.     Dim chkDigit As String * 1    '//计算校验位
  61.     Dim OrgCode As String       '//全国组织机构代码
  62.    
  63.     LastNum = Right(StrUniCode, 1)      '最后1位
  64.     OrgCode = Mid(StrUniCode, 9, 9)
  65.    
  66.     Dim i As Integer                '//循环变量
  67.     Dim iPos As Integer             '//位置变量
  68.     Dim CurrentDigit As String      '//循环每1位字符
  69.    
  70.     For i = 1 To Len(StrUniCode) - 1            '定长17位
  71.         CurrentDigit = Mid(StrUniCode, i, 1)    '取每1位字符
  72.         iPos = InStr(Wf, CurrentDigit)          '查找位置
  73.         If iPos > 0 Then
  74.             Total = Total + Wi(i - 1) * (iPos - 1)
  75.         Else
  76.             Err.Raise vbObjectError + 20, 0, "计算错误"
  77.         End If
  78.     Next

  79.     iPos = (31 - Total Mod 31)
  80.     chkDigit = Mid(Wf, iPos + 1, 1)

  81. '    If iPos < 10 Then
  82. '        chkDigit = CStr(iPos)
  83. '    Else
  84. '        chkDigit = Mid(WF, iPos + 1, 1)
  85. '    End If

  86. ErrHand:
  87.     Select Case Err.Number
  88.         Case 0
  89.             checkSCC = CInt(LastNum = chkDigit)
  90.         Case vbObjectError + 10
  91.             checkSCC = -2
  92.         Case vbObjectError + 20
  93.             checkSCC = -3
  94.         Case Else
  95.             checkSCC = -4
  96.     End Select

  97.     Debug.Print "统一代码:" & StrUniCode, "组织机构:" & OrgCode, "校验汇总:" & Total, "位置:" & iPos & "-->" & chkDigit, "结果:" & IIf(chkDigit = LastNum, "正确", "错误应为" & chkDigit)

  98. End Function

  99. '测试结果:
  100. '统一代码:91350100M000100Y43 组织机构:M000100Y4          校验汇总:1640 位置:3-->3    结果:正确
  101. '统一代码:91430382092581024J 组织机构:092581024          校验汇总:1005 位置:18-->J   结果:正确
  102. '统一代码:914103057167119596 组织机构:716711959          校验汇总:1172 位置:6-->6    结果:正确
  103. '统一代码:9A350100M000100Y47 组织机构:M000100Y4          校验汇总:1667 位置:7-->7    结果:正确
  104. '统一代码:91340828578527976Q 组织机构:578527976          校验汇总:1743 位置:24-->Q   结果:正确
  105. '统一代码:91350128M00000019A 组织机构:M00000019          校验汇总:1070 位置:15-->F   结果:错误应为F
  106. '统一代码:52100000523000026F 组织机构:523000026          校验汇总:481  位置:15-->F   结果:正确
  107. '统一代码:91350200M000000510 组织机构:M00000051          校验汇总:824  位置:13-->D   结果:错误应为D
  108. '统一代码:91520421MA6DJ09246 组织机构:MA6DJ0924          校验汇总:1699 位置:6-->6    结果:正确
  109. '统一代码:91440300359143307G 组织机构:359143307          校验汇总:1007 位置:16-->G   结果:正确
  110. '统一代码:91340881MA2MQ0T315 组织机构:MA2MQ0T31          校验汇总:2103 位置:5-->5    结果:正确
复制代码

GB_32100-2015_法人和其他组织统一社会信用代码编码规则.rar

141 KB, 下载次数: 634

TA的精华主题

TA的得分主题

发表于 2016-5-7 23:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
研究一下,真心感谢

TA的精华主题

TA的得分主题

发表于 2016-5-8 00:49 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
留个记号,收藏备用

TA的精华主题

TA的得分主题

发表于 2016-5-8 23:01 | 显示全部楼层
本帖最后由 huangzhijie 于 2016-5-11 22:13 编辑

好像不好使,怎么用,有实例吗不好意思,复制下来弄了 三证合一社会信用代码校验.rar (10.47 KB, 下载次数: 264) 弄,大家分享

TA的精华主题

TA的得分主题

发表于 2016-8-22 15:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这个的东西很有用! Mark!  Mark!! 还需要转为其它编码,比如 JS。

TA的精华主题

TA的得分主题

发表于 2016-8-28 20:44 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2016-9-21 16:18 | 显示全部楼层
huangzhijie 发表于 2016-5-8 23:01
好像不好使,怎么用,有实例吗不好意思,复制下来弄了弄,大家分享

下载了你共享的统一社会信用代码校验文件,咨询下,文件里18位红色字体的样例数据是怎么实现的?不调用函数也能判断对错吗?
谢谢

TA的精华主题

TA的得分主题

发表于 2017-9-11 21:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
用的是条件格式,不是什么深奥的代码

TA的精华主题

TA的得分主题

发表于 2018-3-21 22:51 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
4楼的下载下来不能用了,再传个附件

统一社会信用代码(三证合一)校验函数.rar

12.77 KB, 下载次数: 187

TA的精华主题

TA的得分主题

发表于 2019-1-29 10:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
谢谢!感谢楼主!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-19 20:24 , Processed in 0.045707 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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