2015-10-21 3 views
1

Я пытаюсь автоматизировать экспорт SAP в файл Excel, который, в свою очередь, затем используется другим файлом Excel с некоторым кодом VBA для автоматизации фильтрации и форматирования данные.Сценарий SAP GUI открывает окно Excel, и я не могу его остановить

У меня все работает, за исключением одной (казалось бы, незначительной) проблемы: SAP всегда автоматически открывает экспортированный файл Excel и, похоже, нет способа остановить это, поскольку, похоже, это происходит ПОСЛЕ того, как подпрограммы импортируют Данные в Excel VBA завершены (они содержат сценарий GUI SAP).

Если я запускаю только подпрограмму sap_export, открывается файл Excel, что просто раздражает. Но если я запустил refresh_sap(), который вызывает sap_export(), а затем refresh(), который обращается к экспортированному файлу импорта файлов Excel, я получаю подсказку о том, что файл уже используется.

Я не нашел способа остановить открытие файла сценарием SAP GUI, поскольку он, похоже, не работает во время выполнения. Я подозреваю, что именно поэтому я не смог найти способ использовать Application.Wait или DoEvents для решения этой проблемы. Как бы долго я не ждал, это не сработает, так как файл просто не открывается до тех пор, пока он не будет запущен.

Sub refresh_sap()  
    Call sap_export 
    Call refresh 
End Sub 

Sub refresh() 

    'refreshes the connection to the SAP-exported Excel-file 

    ActiveWorkbook.Connections("export").refresh 

    'deleting unwanted data 

    ActiveWorkbook.Sheets("PC-Liste komplett").Select 
    Selection.AutoFilter 
    ActiveSheet.ListObjects("Tabelle_export").Range.AutoFilter Field:=4, Criteria1:="Löschen" 
    Range("A2").Select 
    Range(Selection, Selection.End(xlDown)).Select 
    Range(Selection, Selection.End(xlToRight)).Select 
    Selection.EntireRow.Delete 
    ActiveSheet.ListObjects("Tabelle_export").Range.AutoFilter Field:=4 
    Range("A1").Select 
End Sub 

Sub sap_export() 

    Dim set0 As Integer 
    Dim set1 As String 
    Dim set2 As Boolean 

    'vbs-script recorded with the SAP-GUI 

    If Not IsObject(sapp) Then 
     Set SapGuiAuto = GetObject("SAPGUI") 
     Set sapp = SapGuiAuto.GetScriptingEngine 
    End If 
    If Not IsObject(Scon) Then 
     Set Scon = sapp.Children(0) 
    End If 
    If Not IsObject(session) Then 
     Set session = Scon.Children(0) 
    End If 
    If IsObject(WScript) Then 
     WScript.connectobject session, "on" 
     WScript.connectobject sapp, "on" 
    End If 

    session.findById("wnd[0]/tbar[0]/okcd").Text = "/n KE5X" 
    session.findById("wnd[0]").sendVKey 0 
    session.findById("wnd[0]/usr/ctxtGT_PRCTR-LOW").Text = "*" 
    session.findById("wnd[0]").sendVKey 8   
    session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell/shellcont[1]/shell").contextMenu 
    session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell/shellcont[1]/shell").selectContextMenuItem "&XXL" 

    If session.findById("wnd[1]/usr/radRB_1").Selected = True Then 
     set0 = 0 
    ElseIf session.findById("wnd[1]/usr/radRB_2").Selected = True Then 
     set0 = 1 
    ElseIf session.findById("wnd[1]/usr/radRB_OTHERS").Selected = True Then 
     set0 = 2 
    End If 

    set1 = session.findById("wnd[1]/usr/cmbG_LISTBOX").Key 
    set2 = session.findById("wnd[1]/usr/chkCB_ALWAYS").Selected   
    session.findById("wnd[1]/usr/radRB_OTHERS").Select 
    session.findById("wnd[1]/usr/cmbG_LISTBOX").Key = "10" 
    session.findById("wnd[1]/usr/chkCB_ALWAYS").Selected = False   
    session.findById("wnd[1]").sendVKey 0 
    session.findById("wnd[1]/usr/ctxtDY_PATH").Text = "S:\FIN-Alle\Kostenstellen - Innenauftragsliste\SAP" 
    session.findById("wnd[1]/tbar[0]/btn[11]").press  
    session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell/shellcont[1]/shell").contextMenu 
    session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell/shellcont[1]/shell").selectContextMenuItem "&XXL" 

    Select Case set0 
     Case 0 
     session.findById("wnd[1]/usr/radRB_1").Select 
     Case 1 
     session.findById("wnd[1]/usr/radRB_2").Select 
     Case 2 
     session.findById("wnd[1]/usr/radRB_OTHERS").Select 
    End Select 

    session.findById("wnd[1]/usr/cmbG_LISTBOX").Key = set1 
    session.findById("wnd[1]/usr/chkCB_ALWAYS").Selected = set2 
    session.findById("wnd[1]").sendVKey 12 
    session.findById("wnd[0]/tbar[0]/okcd").Text = "/n" 
    session.findById("wnd[0]").sendVKey 0 
End Sub 

Как у меня сложилось впечатление, что я не могу сделать ничего, чтобы закрыть файл в подпрограммах (как она открывается только после того, как во время выполнения) Я в настоящее время ищет способ: сказать SAP не открыть файл вообще или запретить ему доступ к Excel, или, может быть, просто закрыть SAP в целом и посмотреть, работает ли это, хотя я бы предпочел не делать этого.

+0

Я думаю, что одновременно будут выполняться две сессии (файл экспорта открывается в новом), найдите имя с данным названием рабочей книги. Закройте эту книгу/сеанс, затем снова закройте ее в текущем сеансе. – user3819867

+0

Спасибо за ответ, но не могли бы вы объяснить это мне? Я не мог закрыть книгу «export.xlsx» каким-либо образом, потому что она не открыта во время выполнения, но потом открывается. Закрывает ли «сеанс» другое? –

+0

Конечно, для того, чтобы экспортировать его, потребуется всего минуту, вы можете, конечно, подождать. Технически я бы попробовал нажать «Назад» до тех пор, пока не удастся (заблокирован, пока идет экспорт, один поток?), А затем «Подождите» еще две секунды, чтобы открыть книгу. – user3819867

ответ

0

Насколько я знаю, функции экспорта SAP SDK всегда используют фиктивный файл для обработки экспорта данных. Это происходит путем создания автоматических открываемых вызовов файлов. Вы можете попытаться разрешить это, чтобы открыть новый экспортированный файл после вызова метода refresh(). См. http://rmps.cygnaltech.net/?p=779

Смежные вопросы