Warm tip: This article is reproduced from serverfault.com, please click

其他-如何从 Excel 或 Visual Studio 中的 VBA 执行 SAP GUI 宏?

(其他 - How to execute SAP GUI Macro from VBA in Excel or Visual Studio?)

发布于 2018-04-23 10:35:10

我想从 Excel 中的 VBA 编辑器或 Windows 窗体应用程序编辑和启动 SAP 宏。

当脚本在编译器中使用时,我无法让我的代码“连接”到当前的 SAP 会话。它唯一有效的时间是当我打开宏记录器创建的原始 VBScript 时。

SAP 在我的系统上设置的方式我们会自动登录到 SAP Logon 并通过 Web 门户 saplogon.com/irj/portal 启动一个新的 sap GUI 窗口,在与图形用户界面。

当我逐字复制宏脚本时,出现运行时错误:

If Not IsObject(application) Then
   Set SapGuiAuto  = GetObject("SAPGUI")
   Set application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(connection) Then
   Set connection = application.Children(0)
End If
If Not IsObject(session) Then
   Set session    = connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject session,     "on"
   WScript.ConnectObject application, "on"
End If
session.findById("wnd[0]").maximize
session.findById("wnd[0]/usr/subSA_0100_1:SAPMZCX_CSDSLSBM5001_OFS_OTS:2410/subSA_2410_1:SAPMZCX_CSDSLSBM5001_OFS_OTS:2510/ctxtKUWEV-KUNNR").text = "I033"
session.findById("wnd[0]/usr/subSA_0100_1:SAPMZCX_CSDSLSBM5001_OFS_OTS:2410/subSA_2410_1:SAPMZCX_CSDSLSBM5001_OFS_OTS:2510/ctxtKUWEV-KUNNR").caretPosition = 4
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[1]/usr/lbl[12,3]").setFocus
session.findById("wnd[1]/usr/lbl[12,3]").caretPosition = 16
session.findById("wnd[1]").sendVKey 2
session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell").setCurrentCell 1,"MAKTX2"
session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell").doubleClickCurrentCell
session.findById("wnd[1]/tbar[0]/btn[0]").press`

我一直想解决这个问题的方法是将 sapfewselib 引用添加到项目中,然后声明 SAP GUI 对象。

我能找到的所有示例都是关于如何登录到新的 SAP 会话的。我不明白为什么代码会在记事本保存为 VBScript 文件时执行,但在附加到 Windows 窗体应用程序或 Excel 电子表格中的按钮时不会执行,即使我已经添加了引用。

Questioner
Logan9Fingers
Viewed
11
Logan9Fingers 2018-04-24 14:18:49

所以我仍然无法在 c# 中找到一个不包括登录的示例,但对于 Excel 中的 VBA 编辑器,以下工作是有效的,但请注意 Visual Studio 中的“set”和“let”关键字已停用。以防万一其他人有同样的问题,这就是你需要分配给按钮的内容:

    Sub Button1_Click()

    Dim SapGuiAuto
    Dim SetApp
    Dim Connection
    Dim Session

    Set SapGuiAuto = GetObject("SAPGUI")
    Set SetApp = SapGuiAuto.GetScriptingEngine
    Set Connection = SetApp.Children(0)
    Set Session = Connection.Children(0)

    Session.findById("wnd[0]").maximize

//Then your script to control gui below this://
    Session.findById("wnd[0]/usr/subSA_0100_1:SAPMZCX_CSDSLSBM5001_OFS_OTS:2410/subSA_2410_1:SAPMZCX_CSDSLSBM5001_OFS_OTS:2510/ctxtKUWEV-KUNNR").Text = "I033"
    Session.findById("wnd[0]/usr/subSA_0100_1:SAPMZCX_CSDSLSBM5001_OFS_OTS:2410/subSA_2410_1:SAPMZCX_CSDSLSBM5001_OFS_OTS:2510/ctxtKUWEV-KUNNR").caretPosition = 4
    Session.findById("wnd[0]").sendVKey 0
    Session.findById("wnd[1]/usr/lbl[12,3]").SetFocus
    Session.findById("wnd[1]/usr/lbl[12,3]").caretPosition = 16
    Session.findById("wnd[1]").sendVKey 2
    Session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell").setCurrentCell 1, "MAKTX2"
    Session.findById("wnd[0]/shellcont/shell/shellcont[1]/shell").doubleClickCurrentCell
    Session.findById("wnd[1]/tbar[0]/btn[0]").press

    End Sub