为何VBA错误中断仅触发一次?控制码处理异常排查
问题根源:错误处理状态未重置
VBA有个关键规则:当错误被捕获并进入处理块后,必须用Resume系列语句重置错误处理状态,否则后续再遇到错误时,On Error GoTo的跳转逻辑会失效。
你的代码第一次遇到i=37(对应字符%)触发错误时,能正常跳转到OnKeyFailed处理,但处理完后直接走到Nexti进入下一轮循环——此时错误处理的“激活状态”没有被复位,处于“已处理过错误”的锁定状态。当第二次遇到i=40(对应字符()触发错误时,VBA不会再执行On Error GoTo OnKeyFailed的跳转,直接抛出未处理的运行时错误。
修复方案
在错误处理块的末尾添加Resume Nexti,强制重置错误处理状态,让后续循环中的错误能被正常捕获:
OnKeyFailed: KeyPressed = "{" & KeyPressed & "}" Range("G" & i) = i Range("H" & i) = Chr(i) Range("I" & i) = "Not Accepted: " Application.OnKey KeyPressed, "IgnorThisPress" Resume Nexti ' 关键:重置错误处理状态,回到循环标签继续执行
补充说明:你对特殊字符用大括号包裹的处理逻辑是正确的,Application.OnKey要求控制码、特殊字符必须用这种格式注册,只是遗漏了错误状态重置这一关键步骤。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

