SAP VBA脚本SM37未找到作业时错误619无法跳过循环问题
SAP Scripting VBA循环中二次错误无法跳转的问题分析与修复
问题核心原因
你的代码存在三个关键问题,导致第二次遇到619错误时无法继续跳转循环:
- 错误处理被提前关闭:第一次触发错误后,
On Error GoTo 0直接关闭了全局错误捕获,第二次循环时没有重新启用错误处理,再遇到错误就会直接中断程序。 - 错误后未清理SAP界面:SM37找不到作业时SAP会弹出错误弹窗,错误触发后你没有关闭这个弹窗,后续循环的SM37操作会因为界面状态异常而失败。
- 错误后代码继续执行:错误触发后直接跳到
Handler,但后续未完成的SAP操作代码仍会被执行,导致界面状态混乱。
修复后的代码
For i = 2 To objSheet.UsedRange.Rows.Count If Trim(CStr(objSheet.Cells(i, 1).Value)) = "" Then Exit For End If ' 每次循环重新启用错误捕获 On Error GoTo Handler: ' 重置SAP到SM37初始界面,避免之前的错误残留 session.findById("wnd[0]/tbar[0]/okcd").Text = "/nsm37" session.findById("wnd[0]").sendVKey 0 session.findById("wnd[0]/usr/chkBTCH2170-PRELIM").Selected = False session.findById("wnd[0]/usr/chkBTCH2170-READY").Selected = False session.findById("wnd[0]/usr/chkBTCH2170-RUNNING").Selected = False session.findById("wnd[0]/usr/chkBTCH2170-FINISHED").Selected = False session.findById("wnd[0]/usr/chkBTCH2170-ABORTED").Selected = False session.findById("wnd[0]/usr/txtBTCH2170-JOBNAME").Text = Trim(CStr(objSheet.Cells(i, 1).Value)) session.findById("wnd[0]/usr/txtBTCH2170-USERNAME").Text = "*" session.findById("wnd[0]/usr/ctxtBTCH2170-FROM_DATE").Text = "" session.findById("wnd[0]/usr/ctxtBTCH2170-TO_DATE").Text = "" session.findById("wnd[0]").sendVKey 0 objSheet.Cells(i, 3).Value = "Not Found" session.findById("wnd[0]/tbar[1]/btn[8]").press session.findById("wnd[0]/usr/lbl[4,12]").SetFocus session.findById("wnd[0]/usr/lbl[4,12]").caretPosition = 0 session.findById("wnd[0]").sendVKey 30 session.findById("wnd[1]/usr/txtBTCH1180-JOBNAME").Text = Trim(CStr(objSheet.Cells(i, 2).Value)) session.findById("wnd[1]/usr/txtBTCH1180-JOBNAME").caretPosition = 31 session.findById("wnd[1]/tbar[0]/btn[0]").press session.findById("wnd[0]/tbar[0]/btn[3]").press session.findById("wnd[0]/usr/chkBTCH2170-PRELIM").Selected = True session.findById("wnd[0]/usr/txtBTCH2170-JOBNAME").Text = Trim(CStr(objSheet.Cells(i, 2).Value)) session.findById("wnd[0]/usr/chkBTCH2170-PRELIM").SetFocus session.findById("wnd[0]/tbar[1]/btn[8]").press objSheet.Cells(i, 3).Value = "AdHoc Released" ' 无错误时跳过Handler块 GoTo LoopEnd Handler: ' 关闭SAP错误弹窗(如果存在) If session.ActiveWindow.Name = "wnd[1]" Then session.findById("wnd[1]/tbar[0]/btn[0]").press End If ' 标记当前行错误状态 objSheet.Cells(i, 3).Value = "Error: Job Not Found" ' 跳转到循环末尾,进入下一次迭代 Resume LoopEnd LoopEnd: ' 关闭本次循环的错误捕获 On Error GoTo 0 Next
关键修改点说明
- 每次循环开头重新启用
On Error GoTo Handler,确保每次迭代都能捕获错误。 - 添加
GoTo LoopEnd,无错误时跳过Handler块,避免执行错误处理逻辑。 - Handler块中添加关闭SAP错误弹窗的逻辑,清理界面状态,保证下一次循环的SM37操作能正常执行。
- 使用
Resume LoopEnd直接跳转到循环末尾,确保错误后直接进入下一次迭代,不执行后续未完成的SAP操作。
内容的提问来源于stack exchange,提问作者Israel Jordan
相关产品推荐
相关产品推荐

