VBA If语句返回错误值,自定义校验位计算ChkDgt函数输出异常
问题根因
你代码里的逻辑错误核心出在Len(p)的使用上:
- 你声明了
p是数值类型,VBA中Len()作用于数值类型变量时,返回的是该类型占用的内存字节数,比如Long类型返回固定值4,永远不可能等于2,所以你的两位数判断分支永远不会触发,乘积12就会直接被累加,最终导致结果错误。 - 你想实现的是判断乘积的十进制位数是否为2,需要先把数值转为字符串再计算长度。
其他潜在问题
- VBA变量声明语法问题:
Dim n, w, p, c, cp As Long只有最后一个cp被声明为Long类型,前面的n/w/p/c都是Variant类型,容易引发隐式转换错误。 - 边界值缺失:如果总和模10的结果为0,
10 - r会得到10,此时校验位应该为0而不是10,需要额外判断。 - 累加变量未初始化:多次调用函数时
cp可能残留上一次的计算值,导致结果偏差。
修复后的完整代码
Function ChkDgt(ByVal Scanline As String) As String ' 统一明确声明变量类型 Dim i As Integer, n As Integer, w As Integer, p As Integer Dim c As Integer, cp As Long, x As Integer, y As Integer, r As Integer, chk As Integer ' 移除输入字符串中的空格 Scanline = Replace(Scanline, " ", "", 1, , vbBinaryCompare) cp = 0 ' 初始化累加变量 For i = 1 To Len(Scanline) n = CInt(Mid$(Scanline, i, 1)) ' 按奇偶位分配权重 w = IIf(i Mod 2 = 1, 2, 1) p = n * w ' 先转字符串再判断位数,正确拆分两位数 If Len(CStr(p)) = 2 Then x = CInt(Left(CStr(p), 1)) y = CInt(Right(CStr(p), 1)) c = x + y Else c = p End If cp = cp + c Next r = cp Mod 10 ' 处理余数为0的边界情况 chk = IIf(r = 0, 0, 10 - r) ChkDgt = CStr(chk) End Function
验证结果
用你提供的测试串00276933863801021调用修复后的函数,返回结果为6,和预期正确校验位一致。
内容的提问来源于stack exchange,提问作者John D
相关产品推荐
相关产品推荐

