VBA运行时错误13类型不匹配 简化If多条件判断逻辑问询
错误原因(Run-time error '13' 类型不匹配)
你遇到报错的核心原因是:['Lab UP no 360 Chem OPP'!D2] 这种简写本质是VBA的Evaluate方法,如果目标单元格D2本身是错误值(比如#N/A、#DIV/0!等),直接用错误值和字符串做相等判断时就会触发类型不匹配,需要先判断单元格是否为错误值,再做后续比较。
代码优化方案
我们可以把所有需要判断的匹配值放到数组里,用IsError先排查单元格错误,再用Filter方法批量判断是否命中目标值,同时把重复的AutoFilter逻辑抽出来减少冗余,优化后代码如下:
Sub Only_Choose_Unders() Dim ws As Worksheet Dim targetVal As Variant Dim matchList As Variant Dim pct As String ' 定义工作表对象,避免重复写表名 Set ws = ThisWorkbook.Worksheets("Lab UP no 360 Chem OPP") ' 提前取出D2的值,避免重复读取单元格 targetVal = ws.Range("D2").Value ' 先判断单元格是否为错误值,规避类型不匹配报错 If IsError(targetVal) Then pct = "50" ' 错误值默认走原Else分支逻辑,可按需调整 Else ' 所有需要匹配的值集中放在数组中,后续新增/删除匹配项直接修改此处即可 matchList = Array("1A. Madrid", "1B. Madrid", "2A. Barcelona", "2B. Barcelona", _ "3. Valencia", "4A. Malaga", "4B. Sevilla", "5. Bilbao", _ "6. Canarias", "7. Baleares", "8. NorOeste", "(Multiple Items)") ' 用Filter判断目标值是否在匹配列表中 If UBound(Filter(matchList, targetVal, True, vbTextCompare)) > -1 Then pct = "10" Else pct = "50" End If End If ' 重复逻辑抽离,仅需写一次AutoFilter规则 With ws.Range("m24:m5000") .AutoFilter Field:=8, Criteria1:="<0" .AutoFilter Field:=9, Criteria1:="<0" .AutoFilter Field:=10, Criteria1:=pct, Operator:=xlBottom10Percent .AutoFilter Field:=11, Criteria1:=pct, Operator:=xlBottom10Percent End With End Sub
优化说明
- 新增错误值判断逻辑,从根源解决类型不匹配报错
- 所有匹配选项集中维护,无需再用Or串联判断,后续调整匹配规则仅需修改数组内容
- 抽离重复的筛选逻辑,后续调整筛选规则仅需修改一处即可
- 用变量存储单元格值和工作表对象,减少VBA重复读取单元格的开销,运行效率更高
内容的提问来源于stack exchange,提问作者EyalD
相关产品推荐
相关产品推荐

