编写SAP事务码ZN_BSEG的VBA脚本时遇619错误求助
问题描述
我正在编写用于运行SAP事务码ZN_BSEG的VBA脚本,需求如下:
- 公司代码(Company Code):从当前工作簿Sheet1的A2单元格取值
- 凭证编号(Document Number):点击字段的「多重选择」,复制Sheet1中C2到C列最后一个有数据的单元格内容,通过「从剪贴板上传」粘贴
- 布局(Layout):使用
/1130020N - 最大命中数(Maximum no. of hits):留空
- 执行后导出文件到路径
C:\Users\nitemit\Desktop\SDM Folder\1130020\ZN_BSEG.xlsx
但执行设置公司代码的语句session.findById("wnd[0]/usr/ctxtS_BUKRS-LOW").Text = companyCode时,出现错误码619,完整代码如下:
Option Explicit Public SapGuiAuto, WScript Public objGui As GuiApplication Public objConn As GuiConnection Public session As GuiSession Sub RunSAPTransaction() Dim companyCode As String Dim documentNumbers As String ' Get the company code from Sheet1, Cell A2 in the same workbook companyCode = ThisWorkbook.Sheets("Sheet1").Range("A2").Value ' Get the document numbers from Sheet1, starting from Cell C2 to the last cell with data in Column C documentNumbers = Join(Application.Transpose(ThisWorkbook.Sheets("Sheet1").Range("C2:C" & ThisWorkbook.Sheets("Sheet1").Cells(Rows.Count, "C").End(xlUp).Row).Value), ",") ' Connect to SAP Set SapGuiAuto = GetObject("SAPGUI") Set objGui = SapGuiAuto.GetScriptingEngine Set objConn = objGui.Children(0) Set session = objConn.Children(0) ' Maximize the SAP window session.findById("wnd[0]").Maximize ' Run transaction ZN_BSEG session.findById("wnd[0]/tbar[0]/okcd").Text = "/nZN_BSEG" session.findById("wnd[0]").sendVKey 0 ' Wait for the SAP session to be ready Do While session.ActiveWindow.Name = "" Application.Wait Now + TimeValue("0:00:01") Loop ' Enter the company code session.findById("wnd[0]/usr/ctxtS_BUKRS-LOW").Text = companyCode ' Click on "Multiple Selection by Field" for document numbers session.findById("wnd[0]/usr/txtS_BELNR-LOW").SetFocus session.findById("wnd[0]/usr/txtS_BELNR-LOW").caretPosition = 10 session.findById("wnd[0]").sendVKey 2 ' Paste document numbers from clipboard session.findById("wnd[1]/tbar[0]/btn[24]").press session.findById("wnd[1]/tbar[0]/btn[30]").press ' Wait for the SAP session to be ready Do While session.ActiveWindow.Name = "" Application.Wait Now + TimeValue("0:00:01") Loop ' Choose layout /1130020N session.findById("wnd[0]/usr/ctxtS_LAYOUT").Text = "/1130020N" ' Leave Maximum no. of hits blank ' Execute the transaction session.findById("wnd[0]").sendVKey 8 ' Wait for the SAP session to be ready Do While session.ActiveWindow.Name = "" Application.Wait Now + TimeValue("0:00:01") Loop ' Export the file to the specified location session.findById("wnd[0]/usr/cntlRESULT_LIST/shellcont/shell").PressToolbarButton "&MB_VARIANT" session.findById("wnd[0]/usr/cntlRESULT_LIST/shellcont/shell").selectContextMenuItem "&LOAD" session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").CurrentCellColumn = "TEXT" session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").selectedRows = "0" session.findById("wnd[1]/usr/ssubD0500_SUBSCREEN:SAPLSLVC_DIALOG:0501/cntlG51_CONTAINER/shellcont/shell").ClickCurrentCell session.findById("wnd[0]/usr/cntlRESULT_LIST/shellcont/shell").setCurrentCell 1, "BSCHL" session.findById("wnd[0]/usr/cntlRESULT_LIST/shellcont/shell").contextMenu session.findById("wnd[0]/usr/cntlRESULT_LIST/shellcont/shell").selectContextMenuItem "&XXL" ' Save the file session.findById("wnd[1]/tbar[0]/btn[11]").press session.findById("wnd[1]/usr/ctxtDY_PATH").Text = "C:\Users\nitemit\Desktop\SDM Folder\1130020" session.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "ZN_BSEG.xlsx" session.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 11 session.findById("wnd[1]/tbar[0]/btn[0]").press ' Close SAP session.findById("wnd[0]/tbar[0]/btn[15]").press End Sub
错误码619的排查与修复方案
错误码619在SAP GUI脚本中通常表示无法找到指定的GUI对象,或对象未加载完成就被调用。针对你的代码,可按以下步骤修复:
1. 优化会话等待逻辑
原有的窗口就绪判断不够可靠,替换为直接检查目标对象是否存在:
' 替换原等待窗口代码,改为等待公司代码输入框加载完成 Do While True On Error Resume Next Dim objBukrs As Object Set objBukrs = session.findById("wnd[0]/usr/ctxtS_BUKRS-LOW") On Error GoTo 0 If Not objBukrs Is Nothing Then Exit Do Application.Wait Now + TimeValue("0:00:01") Loop
2. 验证SAP对象路径准确性
手动打开ZN_BSEG事务码,通过SAP GUI脚本录制功能重新获取公司代码输入框的路径,确认是否与代码中的wnd[0]/usr/ctxtS_BUKRS-LOW一致——部分事务码会因屏幕布局、权限或系统配置不同,对象路径产生差异。
3. 增加输入有效性校验
确保A2单元格的公司代码不为空且是SAP系统有效值:
companyCode = Trim(ThisWorkbook.Sheets("Sheet1").Range("A2").Value) If companyCode = "" Then MsgBox "公司代码不能为空", vbExclamation Exit Sub End If
4. 完整修改后的代码
整合以上优化点,修正后的代码如下:
Option Explicit Public SapGuiAuto, WScript Public objGui As GuiApplication Public objConn As GuiConnection Public session As GuiSession Sub RunSAPTransaction() Dim companyCode As String Dim lastRow As Long ' 获取并验证公司代码 companyCode = Trim(ThisWorkbook.Sheets("Sheet1").Range("A2").Value) If companyCode = "" Then MsgBox "公司代码不能为空", vbExclamation Exit Sub End If ' 复制凭证编号到剪贴板 lastRow = ThisWorkbook.Sheets("Sheet1").Cells(Rows.Count, "C").End(xlUp).Row ThisWorkbook.Sheets("Sheet1").Range("C2:C" & lastRow).Copy ' 连接SAP Set SapGuiAuto = GetObject("SAPGUI") Set objGui = SapGuiAuto.GetScriptingEngine Set objConn = objGui.Children(0) Set session = objConn.Children(0) ' 最大化SAP窗口 session.findById("wnd[0]").Maximize ' 执行事务码 session.findById("wnd[0]/tbar[0]/okcd").Text = "/nZN_BSEG" session.findById("wnd[0]").sendVKey 0 ' 等待公司代码输入框加载 Do While True On Error Resume Next Dim objBukrs As Object Set objBukrs = session.findById("wnd[0]/usr/ctxtS_BUKRS-LOW") On Error GoTo 0 If Not objBukrs Is Nothing Then Exit Do Application.Wait Now + TimeValue("0:00:01") Loop ' 输入公司代码 objBukrs.Text = companyCode ' 打开凭证编号多重选择 session.findById("wnd[0]/usr/txtS_BELNR-LOW").SetFocus session.findById("wnd[0]").sendVKey 2 ' 从剪贴板上传凭证编号 session.findById("wnd[1]/tbar[0]/btn[24]").press session.findById("wnd[1]/tbar[0]/btn[30]").press ' 等待返回主窗口 Do While session.ActiveWindow.Name = "wnd[1]" Application.Wait Now + TimeValue("0:00:01") Loop ' 设置布局 session.findById("wnd[0]/usr/ctxtS_LAYOUT").Text = "/1130020N" ' 执行查询 session.findById("wnd[0]").sendVKey 8 ' 等待结果列表加载 Do While True On Error Resume Next Dim objResultShell As Object Set objResultShell = session.findById("wnd[0]/usr/cntlRESULT_LIST/shellcont/shell") On Error GoTo 0 If Not objResultShell Is Nothing Then Exit Do Application.Wait Now + TimeValue("0:00:01") Loop ' 导出XXL格式 objResultShell.setCurrentCell 1, "BSCHL" objResultShell.contextMenu objResultShell.selectContextMenuItem "&XXL" ' 保存文件 session.findById("wnd[1]/tbar[0]/btn[11]").press session.findById("wnd[1]/usr/ctxtDY_PATH").Text = "C:\Users\nitemit\Desktop\SDM Folder\1130020" session.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "ZN_BSEG.xlsx" session.findById("wnd[1]/tbar[0]/btn[0]").press ' 关闭事务窗口 session.findById("wnd[0]/tbar[0]/btn[15]").press End Sub
额外说明
- 移除了未实际使用的
documentNumbers变量,改为直接复制单元格区域到剪贴板,更贴合需求中的「从剪贴板上传」操作 - 所有等待逻辑改为检查目标对象存在性,避免窗口名称判断不准导致的问题
- 增加了公司代码空值校验,提前拦截无效输入
内容的提问来源于stack exchange,提问作者Nitz
相关产品推荐
相关产品推荐

