重复从SAP到Excel再返回的脚本

时间:2016-11-21 15:47:59

标签: excel-vba vbscript sap vba excel

我正在尝试构建一个脚本,该数据从SAP中的大型报表中获取数据,在Excel中运行一些清理,然后将其加载到Access中。至少,这是我最终的目标。 SAP中的数据有点污染,这就是为什么我们将Access作为我们部门特定的清理数据所在的地方。 我是脚本编写的新手(20年之后,我不记得我过去常常知道的很多东西)但我一直在使用SAP和Excel中的内置宏生成器并且已经获得了部分内容到我想要的。我现在遇到的是错误" Microsoft Excel正在等待另一个应用程序完成OLE操作"。这可能是因为我的报告需要很长时间才能运行。它停止了这个过程,这应该是我可以设置和忘记的东西,并在早上有数据。 该脚本在Excel中作为宏启动,连接到SAP并在那里触发报告。该报告运行,然后使用SAP将其导出回Excel。鉴于报告的大小,我只能在一两个月的时间内运行它,但我需要获取整整一年的数据。我想我可以让剧本重复6次,每次2个月。超过2个月的任何时间,报告将在产生任何东西之前超时。我曾尝试在SAP上使用"在后台运行来简化这一过程,但所产生的输出非常混乱,无法使用。这是我到目前为止所拥有的。

Sub Experimental1()

' start the SAP portion

Dim SapGuiAuto, application, connection, session, WScript
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
'
' ***the above is key to opening a script in SAP.  SAP must be running for  this to work***
' begin ZSPWAR launch
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "zspwar"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]").sendVKey 17
session.findById("wnd[1]/usr/txtENAME-LOW").Text = ""
session.findById("wnd[1]/usr/txtENAME-LOW").SetFocus
session.findById("wnd[1]/usr/txtENAME-LOW").caretPosition = 0
session.findById("wnd[1]").sendVKey 8         session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").currentCellRow = 8
session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").selectedRows = "8"
session.findById("wnd[1]").sendVKey 2
' adjust the date
session.findById("wnd[0]/usr/ctxtS_DATE-LOW").Text = (Date)
session.findById("wnd[0]/usr/ctxtS_DATE-HIGH").Text = (Date)
session.findById("wnd[0]/usr/ctxtS_LGORT-LOW").SetFocus
session.findById("wnd[0]/usr/ctxtS_LGORT-LOW").caretPosition = 0
session.findById("wnd[0]/tbar[1]/btn[8]").press
'begins save portion of script
'ignore warning from excel and keep going through long task
'application.IgnoreRemoteRequests = True
' end caffeine like behavior
session.findById("wnd[0]").maximize
session.findById("wnd[0]/mbar/menu[0]/menu[3]/menu[1]").Select
session.findById("wnd[1]/usr/cmbG_LISTBOX").Key = "08"
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/tbar[0]/btn[0]").press
 session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[0,0]").Select
session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[0,0]").SetFocus
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/tbar[0]/btn[0]").press

'Ends Save portion

'back into Excel

  ChDir _
         "G:\Warranty\Strategy's\Special Projects\001 Process and Procedure      Documentation\Databases\Core Return Database"
     ActiveWorkbook.SaveAs Filename:= _
         "G:\Warranty\Strategy's\Special Projects\001 Process and Procedure      Documentation\Databases\Core Return Database\ZSPWAR test1.xlsx" _
    , FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False

这就是我想要的,除了我必须通过excel错误消息进行保管,我不知道如何将焦点转回SAP

感谢您提供的任何帮助或文章。

4 个答案:

答案 0 :(得分:0)

我为您提供解决问题的方法。

例如:

Sub Experimental1()

' start the SAP portion

Dim SapGuiAuto, application, connection, session, WScript
Set SapGuiAuto = GetObject("SAPGUI")
Set SAPapplication = SapGuiAuto.GetScriptingEngine
Set connection = SAPapplication.Children(0)
Set session = connection.Children(0)
'
' ***the above is key to opening a script in SAP.  SAP must be running for  this to work***
' begin ZSPWAR launch
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "zspwar"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]").sendVKey 17
session.findById("wnd[1]/usr/txtENAME-LOW").Text = ""
session.findById("wnd[1]/usr/txtENAME-LOW").SetFocus
session.findById("wnd[1]/usr/txtENAME-LOW").caretPosition = 0
session.findById("wnd[1]").sendVKey 8
session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").currentCellRow = 8
session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").selectedRows = "8"
session.findById("wnd[1]").sendVKey 2
' adjust the date
session.findById("wnd[0]/usr/ctxtS_DATE-LOW").Text = (Date)
session.findById("wnd[0]/usr/ctxtS_DATE-HIGH").Text = (Date)
session.findById("wnd[0]/usr/ctxtS_LGORT-LOW").SetFocus
session.findById("wnd[0]/usr/ctxtS_LGORT-LOW").caretPosition = 0
session.findById("wnd[0]/tbar[1]/btn[8]").press
'begins save portion of script
'ignore warning from excel and keep going through long task
'application.IgnoreRemoteRequests = True
' end caffeine like behavior
session.findById("wnd[0]").maximize
session.findById("wnd[0]/mbar/menu[0]/menu[3]/menu[1]").Select
session.findById("wnd[1]/usr/cmbG_LISTBOX").Key = "08"
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/tbar[0]/btn[0]").press
 session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[0,0]").Select
session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[0,0]").SetFocus
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/tbar[0]/btn[0]").press

'Ends Save Portion

'for the SAP German version
'SAP_Workbook = "Tabelle von Basis (1)"

'for the SAP English version (?)
SAP_Workbook = "Worksheet in ALVXXL01 (1)"
EXCEL_Path = "G:\Warranty\Strategy's\Special Projects\001 Process and Procedure Documentation\Databases\Core Return Database"
myWorkbook = "ZSPWAR test1.xlsx"


On Error Resume Next
Do
Err.Clear
Set xclapp = GetObject(, "Excel.Application")
If Err.Number = 0 Then Exit Do
'msgbox "Wait for Excel session"
wscript.sleep 2000
Loop


Do
Err.Clear
Set xclwbk = xclapp.Workbooks.Item(SAP_Workbook)
If Err.Number = 0 Then Exit Do
'msgbox "Wait for SAP workbook"
wscript.sleep 2000
Loop


On Error GoTo 0


Set xclsheet = xclwbk.Worksheets(1)

xclapp.Visible = True
xclapp.DisplayAlerts = False

xclapp.ActiveWorkbook.SaveAs EXCEL_Path & "\" & myWorkbook
xclapp.ActiveWorkbook.Close


Set xclwbk = Nothing
Set xclsheet = Nothing
'xclapp.Quit
Set xclapp = Nothing

'only if an information on the display
session.findById("wnd[1]/tbar[0]/btn[0]").press

此致 ScriptMan

答案 1 :(得分:0)

感谢大家的帮助!

问题的最终解决方案最终是将脚本分解为更小的模块,然后依次运行它们

application.DisplayAlerts = false

是整个计划的第一线。 现在我在excel中共有3个宏。第一个是我的初始代码,底部的最后一行试图开始删除保存。这留下了坚实,有效的核心。我创建了一个单独的保存宏,工作正常。第三个宏运行首先杀死警报的行,然后按顺序执行其他宏,其间有一个1分钟的强制暂停,因为在我工作的机器上来回传递控制所花费的时间不一致赫克。

如果有人想看到实际代码,我会提出来,但它已经很长了。我只想分享构建块的一般技术,然后像这样分别将它们串在一起。它为我做了许多项目,我不知道为什么我没有先尝试。

再次感谢大家,我希望将来能帮助别人。

答案 2 :(得分:0)

在SAP中,您可以运行最多6个会话:

  1. 创建6个会话

  2. 将您的持续时间分为6(每个示例10天)

  3. 创建s1.vba,s2.vbs,s3.vbs,s4.vbs,s5.vbs,s6.vbs(将您的代码复制到此文件中)

  4. vba编辑器中的
  5. 使用以下命令同时运行所有6个会话

答案 3 :(得分:0)

sub test
    Dim wsh
    Set wsh = VBA.CreateObject("WScript.Shell")
    wsh.Run ("cscript ""C:\your path\s1.vbs""")
    wsh.Run ("cscript ""C:\your path\s2.vbs""")
    wsh.Run ("cscript ""C:\your path\s3.vbs""")
    wsh.Run ("cscript ""C:\your path\s4.vbs""")
    wsh.Run ("cscript ""C:\your path\s5.vbs""")
    wsh.Run ("cscript ""C:\your path\s6.vbs""")
end sub