ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 函数:银行卡号验证和开户行

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-3-3 13:12 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 opiona 于 2018-3-5 14:34 编辑

修改了BUG 最新附件在7楼:

闲来无事 分享两个自定义函数:

根据搜索的算法规则,写了卡号验证函数,还是比较简单的
  1. Public Function Check_BankCard(ByVal CardId As String) As Boolean
  2.     Rem 信用卡号码都是合法的,它必须通过Luhn算法来验证通过。
  3.     Rem 测试号码:6222600810010710887 6225881414207430  5432123456788881
  4.     Rem MsgBox Check_BankCard("6222600810010710887")
  5.    
  6.     Dim BL As Boolean
  7.    
  8.     Rem 银行卡号长度必须在16到19之间
  9.     If Len(CardId) > 19 Or Len(CardId) < 16 Then
  10.         Rem MsgBox "银行卡号长度必须在16到19之间"
  11.         Check_BankCard = False
  12.         Exit Function
  13.     End If
  14.    
  15.     Rem 银行卡号必须全为数字
  16.     BL = True
  17.     For X = 1 To Len(CardId)
  18.         If Asc(Mid(CardId, X, 1)) > 57 Or Asc(Mid(CardId, X, 1)) < 48 Then
  19.             Rem MsgBox "银行卡号必须全为数字"
  20.             Check_BankCard = False
  21.             Exit Function
  22.         End If
  23.     Next
  24.    
  25.     Rem 银行卡号开头2位不符合规范
  26.     Dim ARX() As String
  27.     Dim strBin As String
  28.     strBin = "10,18,30,35,37,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,58,60,62,65,68,69,84,87,88,94,95,98,99"
  29.    
  30.     ARX = Split(strBin, ",")
  31.     BL = False
  32.     For X = 0 To UBound(ARX)
  33.         If Mid(CardId, 1, 2) = ARX(X) Then
  34.             BL = True
  35.             Exit For
  36.         End If
  37.     Next
  38.     If BL = False Then
  39.         Rem MsgBox "银行卡号开头6位不符合规范"
  40.         Check_BankCard = False
  41.         Exit Function
  42.     End If
  43.    
  44.     Rem 必须通过Luhn算法来验证通过
  45.     Dim INTJS, INTOS, INTTEMP As Integer
  46.     For X = Len(CardId) To 1 Step -2
  47.         Rem 从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
  48.         INTJS = INTJS + Val(Mid(CardId, X, 1))
  49.         Rem 从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
  50.         If X > 1 Then
  51.             INTTEMP = Val(Mid(CardId, X - 1, 1)) * 2
  52.             If INTTEMP > 9 Then INTTEMP = INTTEMP - 9
  53.             INTOS = INTOS + INTTEMP
  54.         End If
  55.     Next
  56.     Rem  将奇数位总和加上偶数位总和(有些要减去9),结果应该可以被10整除。
  57.     INTTEMP = INTJS + INTOS
  58.     Rem 可以被10整除,认定校验通过。
  59.     If INTTEMP Mod 10 = 0 Then
  60.         Check_BankCard = True
  61.     Else
  62.         Rem MsgBox "完整卡号可能是:" & CardId & INTTEMP Mod 10
  63.         Check_BankCard = False
  64.     End If
  65. End Function
复制代码




银行卡号验证和开户行.rar

25.47 KB, 下载次数: 793

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-3-3 13:14 | 显示全部楼层
只粘出主要部分
BinBank  很长,详见楼上附件
  1. Function GetStockAllData(ByRef StockCode As String) As String
  2.     Rem 获得银行卡号的开户行  只是:总行
  3.     Rem 测试号码:6222600810010710887 6225881414207430  5432123456788881
  4.     Rem MsgBox GetStockAllData("6222600810010710887")
  5.    
  6.     Dim StrUrl, StrTemp As String
  7.     Dim I, X As Integer
  8.     Dim ARX, BRX
  9.    
  10.     Rem 已知银行代码
  11.     Dim BINBANK As String
  12.     BINBANK = ""
  13.     BINBANK = BINBANK & "SRCB|深圳农村商业银行,BGB|广西北部湾银行,SHRCB|上海农村商业银行,BJBANK|北京银行,WHCCB|威海市商业银行,BOZK|周口银行"
  14.   
  15.     BRX = Split(BINBANK, ",")
  16.    
  17.     Rem 查询卡的信息
  18.     StrUrl = "https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo="
  19.     StrUrl = StrUrl & StockCode
  20.     StrUrl = StrUrl & "&cardBinCheck=true"
  21.    
  22.     Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
  23.     With xmlhttp
  24.         .Open "get", StrUrl, False
  25.         .send
  26.         StrTemp = Replace(StrConv(.responsebody, vbUnicode, &H804), Chr(34), "")
  27.         Rem {"bank":"COMM","validated":true,"cardType":"DC","key":"6222600810010710887","messages":[],"stat":"ok"}
  28.         Rem bank      银行的名称代码
  29.         Rem validated 是否通过验证,支付宝的这个API并没有使用LUHN算法来验证银行卡是否合法
  30.     End With
  31.    
  32.     Rem 文本处理
  33.     ARX = Split(StrTemp, ",")
  34.     If UBound(ARX) > 0 Then
  35.         X = 0
  36.         If InStr(ARX(X), "bank") > 0 Then
  37.             ARX(X) = Split(ARX(X), ":")(1)
  38.             For I = 0 To UBound(BRX)
  39.                 If InStr(BRX(I), ARX(X)) > 0 Then
  40.                     GetStockAllData = Split(BRX(I), "|")(1)
  41.                     Exit Function
  42.                 End If
  43.             Next
  44.         Else
  45.            Rem MsgBox "未找到开户行信息"
  46.             GetStockAllData = "未找到开户行信息"
  47.             Exit Function
  48.         End If
  49.     Else
  50.         Rem MsgBox "未获得数据,请检查网络"
  51.         GetStockAllData = "未获得数据,请检查网络"
  52.         Exit Function
  53.     End If
  54.    
  55. End Function
复制代码

补充内容 (2018-8-29 09:31):
API免费通道以关闭,开户行用信息 函数 已经失效
需要的童鞋,可使用阿里的银行四要素API(付费的)
地址在:19 楼

TA的精华主题

TA的得分主题

发表于 2018-3-5 10:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
opiona 发表于 2018-3-3 13:14
只粘出主要部分
BinBank  很长,详见楼上附件

谢谢分享,卡号证验正确,非常好!
现时仍有不少以存折扣款的,能实现个 “存折号验证及开户行" 么?

TA的精华主题

TA的得分主题

发表于 2018-3-5 12:06 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我试一下,用你的《银行卡号验证和开户行》验证时有的银行卡号的开户行显示不正确,如本来是建行却显示为威海市商业银行。卡号验证时能不能不单独增加一行,直接用表格控件来验证,对错误的银行卡号下面用黄色底纹来表示呢?

TA的精华主题

TA的得分主题

发表于 2018-3-5 12:24 | 显示全部楼层
opiona 发表于 2018-3-3 13:14
只粘出主要部分
BinBank  很长,详见楼上附件

谢谢分享,验证正确,非常好!
现时仍有不少用存折扣款的,能实现 "存折号验证及开户行"  么?

TA的精华主题

TA的得分主题

发表于 2018-3-5 13:30 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-3-5 14:33 | 显示全部楼层
hhwq1 发表于 2018-3-5 12:06
我试一下,用你的《银行卡号验证和开户行》验证时有的银行卡号的开户行显示不正确,如本来是建行却显示为威 ...

谢谢指正,确实有此问题,已经修改
详见附件: 银行卡号验证和开户行.rar (24.82 KB, 下载次数: 895)
代码修改部分:
QQ图片20180305143038.png

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2018-3-6 11:19 来自手机 | 显示全部楼层
opiona 发表于 2018-3-5 14:33
谢谢指正,确实有此问题,已经修改
详见附件:
代码修改部分:

厉害了楼主,想请教您,这些卡号中,公对公帐号,和部分位数很长或者很短的卡号,也满意这算法吗?

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-3-6 12:33 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2018-4-27 15:36 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
opiona 发表于 2018-3-5 14:33
谢谢指正,确实有此问题,已经修改
详见附件:
代码修改部分:

谢谢老师的付出,不知能否把这两个自定义函数放在其它代码中引用,实现连动,例如某列填入卡号,然后直接就运用这两个函数进行判断了
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-20 02:42 , Processed in 0.048635 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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