为何VBA在If语句不成立时无法继续循环?运行时错误13排查
解决VBA运行时错误13(类型不匹配)问题
错误原因
你的代码中,当Filter工作表BK列的单元格内容不是文本类型(比如包含错误值、数字、布尔值)时,直接和字符串"For Processing"做相等比较会触发类型不匹配错误——不同数据类型无法直接进行相等判断。
修复方案
方案1:转换为字符串后再比较
将单元格值转换为字符串类型,再和目标字符串比较,从根源避免类型不匹配:
Sub Breakdown() Dim Filter As Worksheet Set Filter = ThisWorkbook.Sheets("Filter") Dim Breakdown As Worksheet Set Breakdown = ThisWorkbook.Sheets("Breakdown") Dim counter As Integer Dim lr As Integer Dim pastecounter As Integer lr = Filter.Range("B" & Application.Rows.Count).End(xlUp).Row pastecounter = 8 For counter = 8 To lr ' 转换为字符串后再比较,兼容非文本类型单元格 If CStr(Filter.Range("BK" & counter).Value) = "For Processing" Then ' 去掉冗余的Select/Activate操作,直接通过对象引用完成复制粘贴 Filter.Range("BM" & counter & ":BN" & counter).Copy _ Destination:=Breakdown.Range("A" & pastecounter) pastecounter = pastecounter + 1 End If Next counter End Sub
方案2:加入错误处理跳过异常单元格
如果BK列存在无法转换的错误值(比如#N/A、#VALUE!),可以开启错误捕获,跳过出错的判断继续循环:
Sub Breakdown() Dim Filter As Worksheet Set Filter = ThisWorkbook.Sheets("Filter") Dim Breakdown As Worksheet Set Breakdown = ThisWorkbook.Sheets("Breakdown") Dim counter As Integer Dim lr As Integer Dim pastecounter As Integer lr = Filter.Range("B" & Application.Rows.Count).End(xlUp).Row pastecounter = 8 For counter = 8 To lr On Error Resume Next ' 临时开启错误捕获,跳过出错的判断 If Filter.Range("BK" & counter).Value = "For Processing" Then Filter.Range("BM" & counter & ":BN" & counter).Copy _ Destination:=Breakdown.Range("A" & pastecounter) pastecounter = pastecounter + 1 End If On Error GoTo 0 ' 关闭错误捕获,恢复默认错误处理逻辑 Next counter End Sub
额外优化说明
- 移除了代码中的
Select和Activate操作,直接通过工作表对象引用单元格,既提升运行效率,又避免因工作表切换导致的意外错误。 - 使用
Copy Destination:=语法直接指定粘贴目标,简化复制粘贴的代码流程。
内容的提问来源于stack exchange,提问作者Tsubaki Nara
相关产品推荐
相关产品推荐

