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

编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:17:55