我正在尝试创建一个执行SAP GUI脚本的Excel宏。我已经创建了SAP脚本,但我不明白如何在VBA宏中使用它。
这是我的SAP gui脚本: -
private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
{
listBox.SelectAll();
}
我对此几乎没有疑问:
我只需点击按钮即可执行此过程。我没有动态传递任何值。
答案 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
。你可以,但是你需要实例化session
,connection
等。
放置脚本的位置:
Public Sub MySapScript()
' Your Sap Script here
End Sub