作者:绿色风
分类:
时间:2022-08-17
浏览:146
楼主 kevinchengcw |
Q: 如何用vba代码编写16或19位银行卡号码校验自定义函数? A: 代码如下:
- Function SerialCheck(ByVal Rng As Range)
- Dim Str$, Str2$, N%, I%, T&
- Application.Volatile '定义为易失性函数
- Str = Trim(Rng.Value) '取得公式引用单元格的值
- SerialLen = Len(Str) '取得序列号长度
- If (SerialLen = 19 Or SerialLen = 16) And IsNumeric(Str) Then '如果序列号是16或19位,且全部由数字组成,则进行下述操作
- T = 0 '累加和初始化为0
- For N = 1 To SerialLen - 1 '从第一位循环提取到倒数第二位(因最后一位是校验位,与前面累加的值有关)
- Str2 = CStr(Val(Mid(Str, N, 1)) * IIf(N Mod 2 = 0 + IIf(SerialLen = 19, 0, 1), 2, 1)) '将循环到的数字依序列号长度及奇偶位不同进行相关计算
- For I = 1 To Len(Str2) '循环上一步得到的字符串中各个数字
- T = T + Val(Mid(Str2, I, 1)) '累加各位数值
- Next I
- Next N
- SerialCheck = IIf(CStr((10 - (T Mod 10)) Mod 10) = Right(Str, 1), "Good Serial", "Bad Serial") '提取累加数最后一位并取得其补数值,并与序列号最后一位进行比较,以确定序列号是否有效.
- Else '如果位数不对,直接返回无效结果
- SerialCheck = "Bad Serial"
- End If
- End Function
|
2楼 wise |
学习K哥的代码 |
免责声明
有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素,
经与ExcelTip.Net站长Apolloh商议并征得其同意,
现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示,
供有需要的人士查询使用,也慰缅曾经的论坛时代。
所示各个帖子的原作者如对版权有异议,
可与本人沟通提出,或于本站点留言,我们会尽快处理。
在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一