You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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,如果有错误:
    1. 先关闭SAP弹出的错误提示窗口(如果存在)
    2. 执行回退操作回到初始界面
    3. 用Err.Clear清除错误状态,确保下一行数据处理不受影响

内容的提问来源于stack exchange,提问作者wesley schipper

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 17:27:33