Excel VBA代码此前运行正常 突然触发Type Mismatch类型不匹配错误
报错根源
If ActiveCell.Value <> x Then 触发类型不匹配的核心原因是:你定义的x是String类型,当ActiveCell对应单元格内容为Excel错误值(比如#N/A、#REF!、#VALUE!等)时,错误值无法直接和字符串做比较,就会触发该错误。
你之前运行正常,后续突然报错,大概率是Master表U列后续新增了带公式计算的内容、或者录入操作生成了错误值,和你修改其他优化代码没有直接关联。另外现有代码大量依赖Activate、Select操作,不仅执行效率低,也很容易因为运行过程中用户误切换工作表/单元格引发逻辑异常。
修复方案
1. 快速修复(仅改报错逻辑)
在判断单元格值和x是否相等之前,先增加错误值判断即可,替换报错行的逻辑:
' 先判断单元格是否为错误值,避免类型不匹配 If Not IsError(ActiveCell.Value) Then If ActiveCell.Value <> x Then ' 原有业务逻辑保持不变 End If End If
2. 完整优化版代码(移除不稳定的激活、选择操作)
Sub createOrder_BTN() Dim x As String Dim found As Boolean Dim lRow As Long Dim masterWs As Worksheet, orderWs As Worksheet Dim scanCell As Range Application.ScreenUpdating = False ' 直接绑定工作表对象,无需切换激活 Set masterWs = ThisWorkbook.Worksheets("Master") Set orderWs = ThisWorkbook.Worksheets("Orders") x = "" found = False ' 从U3开始遍历扫描 Set scanCell = masterWs.Range("U3") Do Until IsEmpty(scanCell) ' 先过滤错误值,再判断业务条件 If Not IsError(scanCell.Value) Then If scanCell.Value <> x Then found = True scanCell.EntireRow.Copy ' 定位Orders表的空行 lRow = orderWs.Cells.Find(What:="", _ After:=orderWs.Range("A4"), _ LookAt:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByColumns, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row orderWs.Range("A" & lRow).PasteSpecial End If End If ' 下移一行继续扫描 Set scanCell = scanCell.Offset(1, 0) Loop Application.ScreenUpdating = True Application.CutCopyMode = False ' 清除剪贴板选中状态 orderWs.Activate End Sub
内容的提问来源于stack exchange,提问作者Joe Fisher
相关产品推荐
相关产品推荐

