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

SAP多屏幕VBA自动化:指定条件下调用新屏幕执行FB03

SAP多屏幕VBA自动化问题:检测到特定值时切换至新屏幕执行FB03

我需要实现SAP VBA自动化的一个逻辑:当检测到session.findById("wnd[0]/usr/txtBKPF-MONAT").Text = "1"时,让脚本切换到另一个SAP屏幕执行FB03的自动化操作。以下是我的当前代码:

If Not IsObject(SAPApp) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set SAPApp = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(SAPCon) Then
   Set SAPCon = SAPApp.Children(0)
End If
If Not IsObject(session) Then
   Set session = SAPCon.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject session, "on"
   WScript.ConnectObject SAPApp, "on"
End If


    Dim rng As Range
    Dim cell As Range
    Dim cell2 As Range
    Dim rFirst As Range
    Dim rLast  As Range
    Dim rSource As Range
    Dim LastRow As Long


LastRow = ActiveWorkbook.ActiveSheet.Cells(Rows.Count, "E").End(xlUp).Row

For y = 12 To LastRow

Paymentdate = ActiveWorkbook.ActiveSheet.Range("E" & y).Value
'Period = Worksheets("Sheet1").Range("B3").Value
Paymentamt = ActiveWorkbook.ActiveSheet.Range("D" & y).Value
Assignment = ActiveWorkbook.ActiveSheet.Range("D7").Value

ActiveWorkbook.ActiveSheet.Range("H" & y).Formula = "=Trim(TRANSPOSE(TEXTSPLIT(G" & y & ",CHAR(44))))"

    Columns("H:H").Select
    Selection.Replace What:="@", Replacement:="", LookAt:=xlPart, _
        SearchOrder:=xlByColumns, MatchCase:=False, SearchFormat:=False, _
        ReplaceFormat:=False, FormulaVersion:=xlReplaceFormula2
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
        
Range("H" & y).Select

session.findById("wnd[0]/tbar[0]/okcd").Text = "/NF-28"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/sub:SAPMF05A:0103/radRF05A-XPOS1[2,0]").Select
session.findById("wnd[0]/usr/ctxtBKPF-BLDAT").Text = Paymentdate
session.findById("wnd[0]/usr/ctxtBKPF-BLART").Text = "DZ"
session.findById("wnd[0]/usr/ctxtBKPF-BUKRS").Text = "ES01"
session.findById("wnd[0]/usr/ctxtBKPF-BUDAT").Text = Paymentdate
session.findById("wnd[0]/usr/txtBKPF-MONAT").SetFocus
If session.findById("wnd[0]/usr/txtBKPF-MONAT").Text = "1" Then

'Run FB03 in new sap screen, number 2 or any active 2nd screen

Else

session.findById("wnd[0]/usr/ctxtBKPF-WAERS").Text = "EUR"
session.findById("wnd[0]/usr/ctxtRF05A-KONTO").Text = "115117"

实现方案

SAP脚本支持创建多会话并行操作,直接新建会话执行FB03即可,无需切换已有屏幕,具体修改如下:

替换原代码中的If判断块

If session.findById("wnd[0]/usr/txtBKPF-MONAT").Text = "1" Then
    ' 新建SAP会话
    Dim newSession As Object
    Set newSession = SAPCon.Children.Add
    
    ' 在新会话中执行FB03操作
    newSession.findById("wnd[0]/tbar[0]/okcd").Text = "/NFB03"
    newSession.findById("wnd[0]").sendVKey 0
    ' 这里补充FB03的具体操作逻辑,例如:
    ' newSession.findById("wnd[0]/usr/ctxtBKPF-BUKRS").Text = "ES01"
    ' newSession.findById("wnd[0]/usr/ctxtBKPF-BELNR").Text = "凭证号"
    ' newSession.findById("wnd[0]/usr/ctxtBKPF-GJAHR").Text = "年份"
    ' newSession.findById("wnd[0]").sendVKey 0
    
    ' 可选:操作完成后关闭新会话
    ' newSession.findById("wnd[0]").Close
    ' Set newSession = Nothing
    
    ' 切回原会话继续后续流程
    session.findById("wnd[0]").SetFocus
Else
    session.findById("wnd[0]/usr/ctxtBKPF-WAERS").Text = "EUR"
    session.findById("wnd[0]/usr/ctxtRF05A-KONTO").Text = "115117"
    ' 原代码后续执行逻辑...
End If

注意事项

  • 确保SAP系统允许脚本创建多会话:事务码RZ11中参数sapgui/user_scripting设为TRUE,同时开启多会话权限
  • 操作时要明确区分原会话session和新会话newSession,避免对象调用混淆
  • 如果需要复用已有空闲会话,可通过SAPCon.Children遍历查找,但新建会话的稳定性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 09:40:29