|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 opiona 于 2018-3-5 14:34 编辑
修改了BUG 最新附件在7楼:
闲来无事 分享两个自定义函数:
根据搜索的算法规则,写了卡号验证函数,还是比较简单的
- Public Function Check_BankCard(ByVal CardId As String) As Boolean
- Rem 信用卡号码都是合法的,它必须通过Luhn算法来验证通过。
- Rem 测试号码:6222600810010710887 6225881414207430 5432123456788881
- Rem MsgBox Check_BankCard("6222600810010710887")
-
- Dim BL As Boolean
-
- Rem 银行卡号长度必须在16到19之间
- If Len(CardId) > 19 Or Len(CardId) < 16 Then
- Rem MsgBox "银行卡号长度必须在16到19之间"
- Check_BankCard = False
- Exit Function
- End If
-
- Rem 银行卡号必须全为数字
- BL = True
- For X = 1 To Len(CardId)
- If Asc(Mid(CardId, X, 1)) > 57 Or Asc(Mid(CardId, X, 1)) < 48 Then
- Rem MsgBox "银行卡号必须全为数字"
- Check_BankCard = False
- Exit Function
- End If
- Next
-
- Rem 银行卡号开头2位不符合规范
- Dim ARX() As String
- Dim strBin As String
- 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"
-
- ARX = Split(strBin, ",")
- BL = False
- For X = 0 To UBound(ARX)
- If Mid(CardId, 1, 2) = ARX(X) Then
- BL = True
- Exit For
- End If
- Next
- If BL = False Then
- Rem MsgBox "银行卡号开头6位不符合规范"
- Check_BankCard = False
- Exit Function
- End If
-
- Rem 必须通过Luhn算法来验证通过
- Dim INTJS, INTOS, INTTEMP As Integer
- For X = Len(CardId) To 1 Step -2
- Rem 从卡号最后一位数字开始,逆向将奇数位(1、3、5等等)相加。
- INTJS = INTJS + Val(Mid(CardId, X, 1))
- Rem 从卡号最后一位数字开始,逆向将偶数位数字,先乘以2(如果乘积为两位数,则将其减去9),再求和。
- If X > 1 Then
- INTTEMP = Val(Mid(CardId, X - 1, 1)) * 2
- If INTTEMP > 9 Then INTTEMP = INTTEMP - 9
- INTOS = INTOS + INTTEMP
- End If
- Next
- Rem 将奇数位总和加上偶数位总和(有些要减去9),结果应该可以被10整除。
- INTTEMP = INTJS + INTOS
- Rem 可以被10整除,认定校验通过。
- If INTTEMP Mod 10 = 0 Then
- Check_BankCard = True
- Else
- Rem MsgBox "完整卡号可能是:" & CardId & INTTEMP Mod 10
- Check_BankCard = False
- End If
- End Function
复制代码
|
评分
-
1
查看全部评分
-
|