SAP GUI脚本打开一个Excel窗口,我无法阻止它

我试图将SAP导出为一个Excel文件,然后由另一个带有VBA代码的Excel文件来自动化过滤和格式化数据。

我已经得到了所有的运行,除了一个(看似微不足道)的问题:SAP总是自动打开导出的Excel文件,似乎没有办法阻止这个,因为它似乎发生后,子程序导入Excel中的数据VBA已经完成(它们包含SAP GUI脚本)。

如果我只运行sap_export子例程,则会打开Excel文件,这很烦人。 但是,如果我运行调用sap_export() refresh_sap() ,然后执行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 

由于我的印象是,我无法closures子例程内的文件(因为它只在运行时间后打开),我目前正在寻找一种方法:告诉SAP根本不打开文件或禁止它能够访问Excel,或者完全closuresSAP,看看是否可行 – 尽pipe我不希望这样做。

据我所知,SAP SDK导出函数总是使用一个虚拟文件来处理数据的导出。 这是通过自动打开导出的文件调用创build的。 您可以尝试允许这样做,以便在调用refresh()方法后打开新的导出文件。 请参阅http://rmps.cygnaltech.net/?p=779