You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 12:25:19