如何识别VBA编写的SAP GUI Scripting未成功进入事务的情况
识别SAP GUI事务跳转失败的VBA解决方案
针对执行/ncs15后无法进入目标事务的问题,可通过以下几种方式识别异常情况:
1. 检查当前事务代码是否匹配
执行跳转指令后,直接读取SAP窗口的当前事务代码,判断是否为CS15:
' 跳转至目标事务 session.findById("wnd[0]/tbar[0]/okcd").Text = "/ncs15" session.findById("wnd[0]").sendVKey 0 ' 检查当前事务 Dim currentTCode As String currentTCode = session.findById("wnd[0]/tbar[0]/txt[0]").Text If Trim(currentTCode) <> "CS15" Then ' 事务跳转失败,执行异常处理逻辑 MsgBox "无法进入CS15事务,当前事务为:" & currentTCode Exit Sub ' 或其他自定义处理 End If
2. 捕获SAP错误弹窗
如果跳转失败时SAP弹出错误提示窗口(通常为wnd[1]),可检查该窗口是否存在并读取错误信息:
session.findById("wnd[0]/tbar[0]/okcd").Text = "/ncs15" session.findById("wnd[0]").sendVKey 0 ' 检查是否有错误弹窗 On Error Resume Next Dim errorWnd As Object Set errorWnd = session.findById("wnd[1]") On Error GoTo 0 If Not errorWnd Is Nothing Then Dim errorMsg As String errorMsg = errorWnd.findById("usr/txtMESSTXT1").Text MsgBox "跳转失败,错误信息:" & errorMsg ' 关闭错误窗口 errorWnd.sendVKey 0 Exit Sub End If
3. 验证目标元素是否存在
尝试访问事务专属的UI元素(比如你代码中的RC29L-DATUV输入框),如果访问失败则说明未进入目标事务:
session.findById("wnd[0]/tbar[0]/okcd").Text = "/ncs15" session.findById("wnd[0]").sendVKey 0 ' 检查目标字段是否存在 On Error Resume Next Dim targetField As Object Set targetField = session.findById("wnd[0]/usr/ctxtRC29L-DATUV") On Error GoTo 0 If targetField Is Nothing Then MsgBox "未进入CS15事务,目标元素不存在" Exit Sub End If ' 继续后续操作 targetField.SetFocus targetField.Text = "" ' ... 你的后续代码
整合后的完整代码示例
把上述检查逻辑整合到原有代码中:
'Getting the winding code session.findById("wnd[0]").maximize ' 跳转至CS15事务并检查 session.findById("wnd[0]/tbar[0]/okcd").Text = "/ncs15" session.findById("wnd[0]").sendVKey 0 ' 检查1:当前事务是否正确 If Trim(session.findById("wnd[0]/tbar[0]/txt[0]").Text) <> "CS15" Then MsgBox "无法进入CS15事务" Exit Sub End If ' 检查2:目标元素是否存在 On Error Resume Next Dim datuvField As Object Set datuvField = session.findById("wnd[0]/usr/ctxtRC29L-DATUV") On Error GoTo 0 If datuvField Is Nothing Then MsgBox "未找到CS15事务的目标字段" Exit Sub End If ' 继续原有操作 datuvField.SetFocus datuvField.Text = "" session.findById("wnd[0]/usr/chkRC29L-DIRKT").Selected = True session.findById("wnd[0]/usr/ctxtRC29L-MATNR").Text = Worksheets("Barramentos").Range("C" & j) session.findById("wnd[0]/usr/chkRC29L-DIRKT").SetFocus session.findById("wnd[0]/tbar[1]/btn[5]").press session.findById("wnd[0]/usr/ctxtRC29L-WERKS").Text = Worksheets("Barramentos").Range("I" & j) session.findById("wnd[0]/usr/ctxtRC29L-WERKS").SetFocus session.findById("wnd[0]/usr/ctxtRC29L-WERKS").caretPosition = 4 session.findById("wnd[0]/tbar[1]/btn[8]").press
内容的提问来源于stack exchange,提问作者Pietro
相关产品推荐
相关产品推荐

