我正在尝试构建一个脚本,该数据从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
感谢您提供的任何帮助或文章。
答案 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个会话:
创建6个会话
将您的持续时间分为6(每个示例10天)
创建s1.vba,s2.vbs,s3.vbs,s4.vbs,s5.vbs,s6.vbs(将您的代码复制到此文件中)
使用以下命令同时运行所有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