如何让VBScript忽略错误并继续处理Excel下一行(SAP场景)
处理SAP交货单仓库代码修改脚本的错误捕获需求
我用VBScript在SAP环境中批量处理重复性工作——修改交货单行项目的仓库代码。逻辑是:从Excel第1列取值填入SAP事务界面打开交货单;打开指定对话框,输入Excel第2列的值确认选中目标行项目;在指定字段输入仓库代码8039后保存。
但当8039是无效仓库代码(交货单对应货物在该仓库无库存)时,脚本会报错中断。我需要实现:脚本忽略该错误,执行session.findById("wnd[0]/tbar[0]/btn[12]").press回退到初始界面,然后继续处理Excel下一行直至最后一行数据。以下是我的原脚本:
If Not IsObject(application) Then Set SapGuiAuto = GetObject("SAPGUI") Set application = SapGuiAuto.GetScriptingEngine End If If Not IsObject(connection) Then Set connection = application.Children(0) End If If Not IsObject(session) Then Set session = connection.Children(0) End If If IsObject(WScript) Then WScript.ConnectObject session, "on" WScript.ConnectObject application, "on" End If REM ADDED BY EXCEL **************tekst tussen lijnen laten staan *********************** Dim objExcel Dim objSheet, intRow, i Set objExcel = GetObject(,,"Excel.Application") Set objSheet = objExcel.ActiveWorkbook.ActiveSheet For i = InputBox("Voer uw excel regelnummer in") to objSheet.UsedRange.Rows.Count COL1 = Trim(CStr(objSheet.Cells(i, 1).Value)) COL2 = Trim(CStr(objSheet.Cells(i, 2).Value)) COL3 = Trim(CStr(objSheet.Cells(i, 3).Value)) COL4 = Trim(CStr(objSheet.Cells(i, 4).Value)) COL5 = Trim(CStr(objSheet.Cells(i, 5).Value)) COL6 = Trim(CStr(objSheet.Cells(i, 6).Value)) COL7 = Trim(CStr(objSheet.Cells(i, 7).Value)) COL8 = Trim(CStr(objSheet.Cells(i, 8).Value)) COL9 = Trim(CStr(objSheet.Cells(i, 9).Value)) COL10 = Trim(CStr(objSheet.Cells(i, 10).Value)) COL11 = Trim(CStr(objSheet.Cells(i, 11).Value)) COL12 = Trim(CStr(objSheet.Cells(i, 12).Value)) COL13 = Trim(CStr(objSheet.Cells(i, 13).Value)) COL14 = Trim(CStr(objSheet.Cells(i, 14).Value)) COL15 = Trim(CStr(objSheet.Cells(i, 15).Value)) COL16 = Trim(CStr(objSheet.Cells(i, 16).Value)) COL17 = Trim(CStr(objSheet.Cells(i, 17).Value)) COL18 = Trim(CStr(objSheet.Cells(i, 18).Value)) COL19 = Trim(CStr(objSheet.Cells(i, 19).Value)) COL20 = Trim(CStr(objSheet.Cells(i, 20).Value)) COL21 = Trim(CStr(objSheet.Cells(i, 21).Value)) COL22 = Trim(CStr(objSheet.Cells(i, 22).Value)) COL23 = Trim(CStr(objSheet.Cells(i, 23).Value)) COL24 = Trim(CStr(objSheet.Cells(i, 24).Value)) COL25 = Trim(CStr(objSheet.Cells(i, 25).Value)) REM ADDED BY EXCEL ***************tekst tussen lijnen laten staan ********************** session.findById("wnd[0]").maximize session.findById("wnd[0]/usr/ctxtLIKP-VBELN").text = col1 session.findById("wnd[0]/usr/ctxtLIKP-VBELN").caretPosition = 8 session.findById("wnd[0]").sendVKey 0 session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\01/ssubSUBSCREEN_BODY:SAPMV50A:1102/subSUBSCREEN_ICONBAR:SAPMV50A:1708/btnBT_POPO_T").press session.findById("wnd[1]/usr/txtRV50A-POSNR").text = col2 session.findById("wnd[1]/usr/txtRV50A-POSNR").caretPosition = 2 session.findById("wnd[1]/tbar[0]/btn[0]").press session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\01/ssubSUBSCREEN_BODY:SAPMV50A:1102/tblSAPMV50ATC_LIPS_OVER/ctxtLIPS-LGORT[33,0]").text = "8039" session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\01/ssubSUBSCREEN_BODY:SAPMV50A:1102/tblSAPMV50ATC_LIPS_OVER/txtLIPS-KDMAT[35,0]").setFocus session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\01/ssubSUBSCREEN_BODY:SAPMV50A:1102/tblSAPMV50ATC_LIPS_OVER/txtLIPS-KDMAT[35,0]").caretPosition = 0 session.findById("wnd[0]/tbar[0]/btn[11]").press REM FINALIZATION CONTROL CHECK ************************ Next msgbox "Script afgerond" REM FINALIZATION CONTROL CHECK ************************
修改后的完整脚本
If Not IsObject(application) Then Set SapGuiAuto = GetObject("SAPGUI") Set application = SapGuiAuto.GetScriptingEngine End If If Not IsObject(connection) Then Set connection = application.Children(0) End If If Not IsObject(session) Then Set session = connection.Children(0) End If If IsObject(WScript) Then WScript.ConnectObject session, "on" WScript.ConnectObject application, "on" End If REM ADDED BY EXCEL **************tekst tussen lijnen laten staan *********************** Dim objExcel Dim objSheet, intRow, i Set objExcel = GetObject(,,"Excel.Application") Set objSheet = objExcel.ActiveWorkbook.ActiveSheet For i = InputBox("Voer uw excel regelnummer in") to objSheet.UsedRange.Rows.Count COL1 = Trim(CStr(objSheet.Cells(i, 1).Value)) COL2 = Trim(CStr(objSheet.Cells(i, 2).Value)) COL3 = Trim(CStr(objSheet.Cells(i, 3).Value)) COL4 = Trim(CStr(objSheet.Cells(i, 4).Value)) COL5 = Trim(CStr(objSheet.Cells(i, 5).Value)) COL6 = Trim(CStr(objSheet.Cells(i, 6).Value)) COL7 = Trim(CStr(objSheet.Cells(i, 7).Value)) COL8 = Trim(CStr(objSheet.Cells(i, 8).Value)) COL9 = Trim(CStr(objSheet.Cells(i, 9).Value)) COL10 = Trim(CStr(objSheet.Cells(i, 10).Value)) COL11 = Trim(CStr(objSheet.Cells(i, 11).Value)) COL12 = Trim(CStr(objSheet.Cells(i, 12).Value)) COL13 = Trim(CStr(objSheet.Cells(i, 13).Value)) COL14 = Trim(CStr(objSheet.Cells(i, 14).Value)) COL15 = Trim(CStr(objSheet.Cells(i, 15).Value)) COL16 = Trim(CStr(objSheet.Cells(i, 16).Value)) COL17 = Trim(CStr(objSheet.Cells(i, 17).Value)) COL18 = Trim(CStr(objSheet.Cells(i, 18).Value)) COL19 = Trim(CStr(objSheet.Cells(i, 19).Value)) COL20 = Trim(CStr(objSheet.Cells(i, 20).Value)) COL21 = Trim(CStr(objSheet.Cells(i, 21).Value)) COL22 = Trim(CStr(objSheet.Cells(i, 22).Value)) COL23 = Trim(CStr(objSheet.Cells(i, 23).Value)) COL24 = Trim(CStr(objSheet.Cells(i, 24).Value)) COL25 = Trim(CStr(objSheet.Cells(i, 25).Value)) REM ADDED BY EXCEL ***************tekst tussen lijnen laten staan ********************** ' 开启错误捕获,遇到错误不中断脚本 On Error Resume Next session.findById("wnd[0]").maximize session.findById("wnd[0]/usr/ctxtLIKP-VBELN").text = col1 session.findById("wnd[0]/usr/ctxtLIKP-VBELN").caretPosition = 8 session.findById("wnd[0]").sendVKey 0 session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\01/ssubSUBSCREEN_BODY:SAPMV50A:1102/subSUBSCREEN_ICONBAR:SAPMV50A:1708/btnBT_POPO_T").press session.findById("wnd[1]/usr/txtRV50A-POSNR").text = col2 session.findById("wnd[1]/usr/txtRV50A-POSNR").caretPosition = 2 session.findById("wnd[1]/tbar[0]/btn[0]").press session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\01/ssubSUBSCREEN_BODY:SAPMV50A:1102/tblSAPMV50ATC_LIPS_OVER/ctxtLIPS-LGORT[33,0]").text = "8039" session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\01/ssubSUBSCREEN_BODY:SAPMV50A:1102/tblSAPMV50ATC_LIPS_OVER/txtLIPS-KDMAT[35,0]").setFocus session.findById("wnd[0]/usr/tabsTAXI_TABSTRIP_OVERVIEW/tabpT\01/ssubSUBSCREEN_BODY:SAPMV50A:1102/tblSAPMV50ATC_LIPS_OVER/txtLIPS-KDMAT[35,0]").caretPosition = 0 session.findById("wnd[0]/tbar[0]/btn[11]").press ' 检查是否触发错误 If Err.Number <> 0 Then ' 关闭SAP弹出的错误提示框(如果存在) If session.ActiveWindow.Name = "wnd[1]" Then session.findById("wnd[1]/tbar[0]/btn[0]").press End If ' 回退到初始界面 session.findById("wnd[0]/tbar[0]/btn[12]").press ' 清除错误状态,避免影响下一行数据处理 Err.Clear End If ' 关闭错误捕获,恢复默认错误处理逻辑 On Error GoTo 0 REM FINALIZATION CONTROL CHECK ************************ Next msgbox "Script afgerond" REM FINALIZATION CONTROL CHECK ************************
关键添加的代码说明
- 错误捕获开关:在单条数据处理代码块前加
On Error Resume Next,让脚本遇到错误时继续执行;处理完单条数据后用On Error GoTo 0恢复默认错误处理。 - 错误处理逻辑:保存操作后判断
Err.Number <> 0,如果有错误:- 先关闭SAP弹出的错误提示窗口(如果存在)
- 执行回退操作回到初始界面
- 用
Err.Clear清除错误状态,确保下一行数据处理不受影响
内容的提问来源于stack exchange,提问作者wesley schipper
相关产品推荐
相关产品推荐

