如何从Excel宏运行SAP GUI脚本

时间:2017-07-19 10:30:55

标签: excel-vba automation sapscript sap-gui vba

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

这是我的SAP gui脚本: -

private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
    listBox.SelectAll();
}

我对此几乎没有疑问:

  1. 如何在Excel宏中添加它。
  2. 我是否需要在运行之前手动打开SAP?
  3. 我是否需要使用任何广告代码从Excel宏打开SAP?
  4. 我只需点击按钮即可执行此过程。我没有动态传递任何值。

3 个答案:

答案 0 :(得分:1)

打开并手动登录到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 :(得分:1)

使用记录器吐出的连接脚本时总是遇到问题(如果使用IsObject(WScript)然后)。

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

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键查看您可以使用的所有方法和属性。

答案 2 :(得分:0)

不幸的是,由于更换了工作,我再也无法访问任何SAP应用程序,因此以下内容来自我的记忆。

  • 您可以通过复制并粘贴到Sub将其添加到Excel宏中。

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

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

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

放置脚本的位置:

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