【问题标题】:How to run SAP GUI script from Excel Macro如何从 Excel 宏运行 SAP GUI 脚本
【发布时间】:2017-12-24 13:38:33
【问题描述】:

我正在尝试创建一个执行 SAP GUI 脚本的 Excel 宏。我已经创建了脚本,但我不明白如何在 VBA 宏中使用它。

这是我的 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]/tbar[0]/okcd").text = "ZL"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/chkP_DBAGG").selected = true
session.findById("wnd[0]/usr/ctxtP_DTA").text = "DB"
session.findById("wnd[0]/usr/chkP_DBAGG").setFocus
session.findById("wnd[0]/tbar[1]/btn[8]").press
session.findById("wnd[0]/tbar[1]/btn[25]").press
session.findById("wnd[0]/tbar[1]/btn[26]").press
session.findById("wnd[0]/usr/chkS005").selected = true
session.findById("wnd[0]/usr/chkS017").selected = true
session.findById("wnd[0]/usr/chkS018").selected = true
session.findById("wnd[0]/usr/chkS020").selected = true
session.findById("wnd[0]/usr/chkS025").selected = true
session.findById("wnd[0]/usr/chkS030").selected = true
session.findById("wnd[0]/usr/chkS031").selected = true
session.findById("wnd[0]/usr/chkS055").selected = true
session.findById("wnd[0]/usr/chkS057").selected = true
session.findById("wnd[0]/usr/chkS057").setFocus
session.findById("wnd[0]/tbar[1]/btn[8]").press
session.findById("wnd[0]/usr/ctxtC025-LOW").setFocus
session.findById("wnd[0]/usr/ctxtC025-LOW").caretPosition = 0
session.findById("wnd[0]").sendVKey 4
session.findById("wnd[1]/usr/cntlCONTAINER/shellcont/shell").selectionInterval = "20170717,20170717"
session.findById("wnd[0]/usr/ctxtC025-HIGH").setFocus
session.findById("wnd[0]/usr/ctxtC025-HIGH").caretPosition = 0
session.findById("wnd[0]").sendVKey 4
session.findById("wnd[1]/usr/cntlCONTAINER/shellcont/shell").focusDate = "20170724"
session.findById("wnd[1]/usr/cntlCONTAINER/shellcont/shell").selectionInterval = "20170724,20170724"
session.findById("wnd[0]/usr/txtL_MX").text = "9999999"
session.findById("wnd[0]/usr/txtL_MX").setFocus
session.findById("wnd[0]/usr/txtL_MX").caretPosition = 11
session.findById("wnd[0]/tbar[1]/btn[8]").press
session.findById("wnd[0]/mbar/menu[0]/menu[3]/menu[1]").select
session.findById("wnd[1]/usr/ctxtDY_PATH").setFocus
session.findById("wnd[1]/usr/ctxtDY_PATH").caretPosition = 0
session.findById("wnd[1]").sendVKey 4
session.findById("wnd[2]/usr/ctxtDY_PATH").setFocus
session.findById("wnd[2]/usr/ctxtDY_PATH").caretPosition = 0
session.findById("wnd[2]").sendVKey 4
session.findById("wnd[3]/usr/ctxtDY_PATH").setFocus
session.findById("wnd[3]/usr/ctxtDY_PATH").caretPosition = 0
session.findById("wnd[3]").sendVKey 4
session.findById("wnd[4]/usr/ctxtDY_PATH").text = "G:\PROFILES\AP\Desktop"
session.findById("wnd[4]/usr/ctxtDY_FILENAME").text = "report.xlsx"
session.findById("wnd[4]/usr/ctxtDY_FILENAME").caretPosition = 11
session.findById("wnd[4]/tbar[0]/btn[11]").press
session.findById("wnd[3]/tbar[0]/btn[11]").press
session.findById("wnd[2]/tbar[0]/btn[0]").press
session.findById("wnd[1]/tbar[0]/btn[11]").press

我对此毫无疑问:

  1. 如何在 Excel 宏中添加它。
  2. 在运行 SAP GUI 应用程序之前是否需要手动打开它?
  3. 是否有任何附加代码可以从 Excel 宏打开 SAP GUI 应用程序?

我只需要单击按钮来执行该过程。我没有动态传递任何值。

【问题讨论】:

标签: excel vba automation sap-gui


【解决方案1】:

不幸的是,由于换工作,我不再能够访问任何 SAP 应用程序,所以以下是我记得的。

  • 您可以将其添加到 Excel 宏中,方法是复制并粘贴到 Sub 中。

  • 您需要手动打开 SAP 并保持计算机解锁,否则您的宏会崩溃。可能可以通过宏打开 SAP,我在上一份工作中做过,并使用硬编码密码登录,但我没有要共享的代码。

  • 在粘贴的脚本中,将application 的每个实例替换为其他内容,例如guiApplication,否则Excel 会与自己的Excel.Application 成员混淆。

  • 不需要其他代码,但您需要调用Subroutine 并确保您没有设置option explicit。你可以,但你需要实例化sessionconnection等。

脚本的放置位置:

 Public Sub MySapScript()
     ' Your Sap Script here
 End Sub

【讨论】:

    【解决方案2】:

    手动打开并登录 SAP。

    打开 Excel,确保开发人员选项卡可见。如果没有则选择;

    文件/选项/自定义功能区。确保勾选“开发者”。

    在 Excel 中选择“开发人员”选项卡,然后选择“插入”。来自“Active X”集 控件(不是'FORM'控件')选择命令按钮控件并将其绘制在工作表上。右键单击该按钮并选择“属性”,查找“标题”并将其删除或将其更改为更合适的内容。之后,再次右键单击命令按钮并选择“查看代码”。将以下代码粘贴到 vba 编辑器中。

    在 VBA 编辑器菜单上选择;调试/编译 VBA 项目。希望没有错误,您现在可以关闭 VBA 编辑器。

    现在,单击您的按钮,代码将运行您的 SAP 事务。如果按钮无法点击,请确保未在“开发人员”选项卡中选择“设计模式”。

    别忘了保存您的电子表格 :)

    Private Sub CommandButton1_Click()
    
    On Error GoTo Err_NoSAP
    
    If Not IsObject(SAPGuiApp) Then
       Set SapGuiAuto = GetObject("SAPGUI")
       Set SAPGuiApp = SapGuiAuto.GetScriptingEngine
    End If
    If Not IsObject(Connection) Then
       Set Connection = SAPGuiApp.Children(0)
    End If
    If Not IsObject(SAP_session) Then
       Set SAP_session = Connection.Children(0)
    End If
    If IsObject(WScript) Then
       WScript.ConnectObject SAP_session, "on"
       WScript.ConnectObject SAPGuiApp, "on"
    End If
    
    If (Connection.Children.Count > 1) Then GoTo Err_TooManySAP
    
    Set aw = SAP_session.ActiveWindow()
    aw.findById("wnd[0]").Maximize
    
    On Error GoTo Err_Description
    SAP_session.findById("wnd[0]").Maximize
    SAP_session.findById("wnd[0]/tbar[0]/okcd").Text = "ZL"
    SAP_session.findById("wnd[0]").sendVKey 0
    SAP_session.findById("wnd[0]/usr/chkP_DBAGG").Selected = True
    SAP_session.findById("wnd[0]/usr/ctxtP_DTA").Text = "DB"
    SAP_session.findById("wnd[0]/usr/chkP_DBAGG").SetFocus
    SAP_session.findById("wnd[0]/tbar[1]/btn[8]").press
    SAP_session.findById("wnd[0]/tbar[1]/btn[25]").press
    SAP_session.findById("wnd[0]/tbar[1]/btn[26]").press
    SAP_session.findById("wnd[0]/usr/chkS005").Selected = True
    SAP_session.findById("wnd[0]/usr/chkS017").Selected = True
    SAP_session.findById("wnd[0]/usr/chkS018").Selected = True
    SAP_session.findById("wnd[0]/usr/chkS020").Selected = True
    SAP_session.findById("wnd[0]/usr/chkS025").Selected = True
    SAP_session.findById("wnd[0]/usr/chkS030").Selected = True
    SAP_session.findById("wnd[0]/usr/chkS031").Selected = True
    SAP_session.findById("wnd[0]/usr/chkS055").Selected = True
    SAP_session.findById("wnd[0]/usr/chkS057").Selected = True
    SAP_session.findById("wnd[0]/usr/chkS057").SetFocus
    SAP_session.findById("wnd[0]/tbar[1]/btn[8]").press
    SAP_session.findById("wnd[0]/usr/ctxtC025-LOW").SetFocus
    SAP_session.findById("wnd[0]/usr/ctxtC025-LOW").caretPosition = 0
    SAP_session.findById("wnd[0]").sendVKey 4
    SAP_session.findById("wnd[1]/usr/cntlCONTAINER/shellcont/shell").selectionInterval = "20170717,20170717"
    SAP_session.findById("wnd[0]/usr/ctxtC025-HIGH").SetFocus
    SAP_session.findById("wnd[0]/usr/ctxtC025-HIGH").caretPosition = 0
    SAP_session.findById("wnd[0]").sendVKey 4
    SAP_session.findById("wnd[1]/usr/cntlCONTAINER/shellcont/shell").focusDate = "20170724"
    SAP_session.findById("wnd[1]/usr/cntlCONTAINER/shellcont/shell").selectionInterval = "20170724,20170724"
    SAP_session.findById("wnd[0]/usr/txtL_MX").Text = "9999999"
    SAP_session.findById("wnd[0]/usr/txtL_MX").SetFocus
    SAP_session.findById("wnd[0]/usr/txtL_MX").caretPosition = 11
    SAP_session.findById("wnd[0]/tbar[1]/btn[8]").press
    SAP_session.findById("wnd[0]/mbar/menu[0]/menu[3]/menu[1]").Select
    SAP_session.findById("wnd[1]/usr/ctxtDY_PATH").SetFocus
    SAP_session.findById("wnd[1]/usr/ctxtDY_PATH").caretPosition = 0
    SAP_session.findById("wnd[1]").sendVKey 4
    SAP_session.findById("wnd[2]/usr/ctxtDY_PATH").SetFocus
    SAP_session.findById("wnd[2]/usr/ctxtDY_PATH").caretPosition = 0
    SAP_session.findById("wnd[2]").sendVKey 4
    SAP_session.findById("wnd[3]/usr/ctxtDY_PATH").SetFocus
    SAP_session.findById("wnd[3]/usr/ctxtDY_PATH").caretPosition = 0
    SAP_session.findById("wnd[3]").sendVKey 4
    SAP_session.findById("wnd[4]/usr/ctxtDY_PATH").Text = "G:\PROFILES\AP\Desktop"
    SAP_session.findById("wnd[4]/usr/ctxtDY_FILENAME").Text = "report.xlsx"
    SAP_session.findById("wnd[4]/usr/ctxtDY_FILENAME").caretPosition = 11
    SAP_session.findById("wnd[4]/tbar[0]/btn[11]").press
    SAP_session.findById("wnd[3]/tbar[0]/btn[11]").press
    SAP_session.findById("wnd[2]/tbar[0]/btn[0]").press
    SAP_session.findById("wnd[1]/tbar[0]/btn[11]").press
    
    Exit Sub
    
    Err_Description:
        MsgBox ("The program has generated an error;" & Chr(13) & _
        "the reason for this error is unknown."), VbInformation, _
        "For Information..."
            Exit Sub
    
    Err_NoSAP:
    MsgBox ("You don't have SAP open or " & Chr(13) & _
    "scripting has been disabled."), VbInformation, _
    "For Information..."
            Exit Sub
    
    Err_TooManySAP:
    MsgBox ("You must only have one SAP session open. " & Chr(13) & _
            "Please close all other open SAP sessions."), VbInformation, _
            "For Information..."
             Exit Sub
    
    End Sub
    

    【讨论】:

    • 这个答案很准确,谢谢。在尝试为我的应用程序拼凑起来后,我需要纠正两件事:1)在 SAP 脚本而不是“结束子”之后“退出子”和 2)将 Excel 世界中保留的“应用程序”重命名为“SAPGuiApp”。
    【解决方案3】:

    我在使用记录器吐出的连接脚本时总是遇到问题(If IsObject(WScript) Then)。

    这是我一直使用的。在代码模块中插入以下内容。

    Sub Connect_To_SAP()
    
        Dim SapGuiAuto As Object
        Dim SAPApp As Object
        Dim SAPCon As Object
        Dim session As Object
    
        Set SapGuiAuto = GetObject("SAPGUI")
        Set SAPApp = SapGuiAuto.GetScriptingEngine
        Set SAPCon = SAPApp.Children(0)
        Set session = SAPCon.Children.ElementAt(0) ' <--- Assumes you are using the first session open. '
    
    'Your script here
    
    End Sub
    

    您可以随时将您录制的脚本放在这里,但是当您想要更上一层楼时,您应该尝试添加 SAP GUI 脚本 API。在您的程序文件的 SAP 文件夹深处,有一个类库,您可以使用它来使您的 SAP 自动化完美无瑕。尝试搜索此文件“sapfewse.ocx”。获取文件路径。

    然后,在 IDE 中选择工具 > 参考,然后单击浏览并选择该文件。将其添加到 VBA 项目后,按 F2 以查看您可以使用的所有方法和属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 2015-03-26
      • 1970-01-01
      相关资源
      最近更新 更多