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
相关产品推荐
相关产品推荐

