VBA代码触发运行时错误'13'类型不匹配,求修复方案
问题分析与修复方案
错误原因
Run-time error '13' 类型不匹配,根源是serialnumber + 1执行时,serialnumber并非有效数值类型。此前正常运行一年突然报错,大概率是R01ReceivingFormToday表中新增了格式异常的LotNumber记录(比如最后两位不是数字、LotNumber格式不符合日期-序号规则),导致Right(DMax(...),2)返回的不是可转换为数值的字符串。
修复步骤
1. 排查并清理异常数据
打开R01ReceivingFormToday表,检查所有LotNumber字段值:
- 确认是否存在最后两位不是数字的记录
- 确认是否存在格式不符合
[6位日期]-[2位序号]的记录(比如缺失连字符、包含特殊字符) - 清理或修正这些异常记录
2. 增强代码容错性
修改原VBA代码,增加数值转换的容错处理,避免非数字字符串导致的类型不匹配:
Private Sub Form_BeforeInsert(Cancel As Integer) Me!Clear.Visible = False Me!SearchPurchaseOrderNumber = Null Me!SearchLotNumber = Null Dim serialnumber As Variant Dim lastLotNumber As Variant lastLotNumber = DMax("LotNumber", "R01ReceivingFormToday") If DCount("LotNumber", "R01ReceivingFormToday") = 0 Then Me!LotNumber = Me!Today & "-01" Else ' 先判断lastLotNumber是否符合格式,再提取序号并转数值 If Not IsNull(lastLotNumber) And InStr(lastLotNumber, "-") > 0 Then serialnumber = Split(lastLotNumber, "-")(1) ' 用Val函数强制转换为数值,非数字会返回0 serialnumber = Val(serialnumber) + 1 Me!LotNumber = Format(Me!Today, "000000") & "-" & Format(serialnumber, "00") Else ' 异常情况 fallback,手动指定起始序号 Me!LotNumber = Format(Me!Today, "000000") & "-01" MsgBox "检测到异常LotNumber记录,已自动使用起始序号", vbExclamation End If End If End Sub
代码优化说明
- 直接通过
Split分割LotNumber获取序号部分,比Right更可靠(避免日期位数变化或格式调整导致的错误) - 使用
Val函数强制转换数值,即使序号部分有非数字字符也能返回0,避免类型不匹配 - 增加异常分支处理,当检测到格式异常的LotNumber时,自动使用起始序号并提示用户
内容的提问来源于stack exchange,提问作者datagirl
相关产品推荐
相关产品推荐

