2016-11-21 5 views
0

Я пытаюсь создать сценарий, который извлекает данные из огромного отчета в SAP, выполняет некоторую очистку в Excel и затем загружает его в Access. По крайней мере, это моя конечная цель. Данные в SAP немного загрязнены, поэтому мы прибегаем к Access как месту, где очищаются данные, характерные для нашего отдела.
Я новичок в написании сценариев (спустя 20 лет, я не помню, что я знал), но я использовал встроенные макрогенераторы как в SAP, так и в Excel и получил часть пути к тому, что Я хочу. Сейчас я столкнулся с ошибкой «Microsoft Excel ожидает, что другое приложение завершит действие OLE». Это возможно, потому что мой отчет занимает очень много времени. Он останавливает процесс, и это должно быть то, что я могу установить и забыть, а также получить данные утром. Сценарий запускается как макрос в Excel, подключается к SAP и запускает там отчет. Отчет запускается, а затем использует SAP для экспорта обратно в Excel. Учитывая размер отчета, я могу запустить его всего за один или два месяца, но мне нужно получить данные за целый год. Я полагаю, что сценарий может повторяться 6 раз, 2 месяца за раз. Что-нибудь более двух месяцев, и отчет будет тайм-аут до того, как он что-нибудь произведет. Я пытался использовать «Запуск в фоновом режиме на SAP, чтобы упростить это, но на выходе генерируется настолько искажены, чтобы быть бесполезным. Вот то, что я до сих пор.Повторяющийся скрипт, который отправляется из SAP в Excel и обратно

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 

Это делает то, что я хочу, за исключением I должны нянчить через сообщение об ошибке первенствовать, и я не знаю, как получить фокус обратно в SAP

Спасибо за любую помощь или статьи вы можете направлять меня.

+0

Try: Файл-> Настройки-> Дополнительно и под General проверить _Ignore другие приложения, использующие DDE_ –

+0

Application.DisplayAlerts = False , кажется, работает, когда я создаю отдельный макрос, который запускает эту строку сначала включается основной макрос в качестве подпрограммы. –

ответ

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

0

Спасибо всем за вашу помощь!

Возможное решение этой проблемы в конечном итоге в том, чтобы разорвать был на более мелкие модули, а затем запускать их последовательно, с

application.DisplayAlerts = false 

является первой линии в общей программе. Теперь у меня есть 3 макроса в excel. Первый - это мой начальный код с последними строками внизу, пытающимися запустить удаление. Это оставляет прочное функциональное ядро. Я создал отдельный макрос сохранения, который работает отлично. Третий макрос запускает строку, которая сначала убивает предупреждения, а затем другие макросы, последовательно, с одной минутой принудительной паузы между ними, потому что время, затрачиваемое на управление взад и вперед по машине, которую я нахожу на работе, является непоследовательным, поскольку черт.

Если кто-то хочет увидеть фактический код, я его подниму, но он довольно длинный. Я просто хотел поделиться общей техникой построения кусков, а затем объединить их отдельно, как это. Он работал над многими проектами для меня, я не знаю, почему я не пробовал это в первую очередь.

Снова, Спасибо всем, и я надеюсь, что это поможет кому-то еще в будущем.

0

В SAP вы можете запустить максимум 6 сессии:

  1. создать 6 сессии

  2. разделить свой срок с 6 (например, 10 дней каждый)

  3. создать s1.vba, s2 .vbs, s3.vbs, s4.vbs, s5.vbs, s6.vbs (копировать код в этот файл)

  4. В редакторе vba для запуска всех 6 сеансов sim ultaneously

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 
+1

Код может быть ответом, но лучше, если вы добавите некоторое объяснение – DeKaNszn