Я пытаюсь автоматизировать экспорт 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 в целом и посмотреть, работает ли это, хотя я бы предпочел не делать этого.
Я думаю, что одновременно будут выполняться две сессии (файл экспорта открывается в новом), найдите имя с данным названием рабочей книги. Закройте эту книгу/сеанс, затем снова закройте ее в текущем сеансе. – user3819867
Спасибо за ответ, но не могли бы вы объяснить это мне? Я не мог закрыть книгу «export.xlsx» каким-либо образом, потому что она не открыта во время выполнения, но потом открывается. Закрывает ли «сеанс» другое? –
Конечно, для того, чтобы экспортировать его, потребуется всего минуту, вы можете, конечно, подождать. Технически я бы попробовал нажать «Назад» до тех пор, пока не удастся (заблокирован, пока идет экспорт, один поток?), А затем «Подождите» еще две секунды, чтобы открыть книгу. – user3819867