[英]Prevent or Close Exported Files - From SAP GUI to Excel
我將多個數據集從 SAP GUI 導出到 EXCEL 365。我的代碼將數據導出到一個唯一命名的占位符文件,然后移動到下一個 T 代碼。 在宏運行時,導出的文件打開緩慢,具體取決於文件大小。 我計划讓查詢引用導出的文件,以消除用戶的任何復制粘貼問題,並加快完全加載工作簿的總處理速度。
Workbooks("FileName").Close 會觸發運行時錯誤 ('9')。
Workbooks.Close 關閉所有未通過 SAP GUI 導出程序打開的工作簿。
我發現了一個 oShell taskkill 行,我將在下面發布它運行良好,盡管導出的文件仍然完全打開,但它也關閉了我的模板工作簿(觸發宏的那個)。 有一半的時間,這個關閉會觸發“你想保存嗎?” 消息框,我可以用 SendKeys 很好地處理它(我可以接受這個解決方案)。 但是,另一半時間彈出“無法關閉Excel窗口”,單擊“確定”立即關閉模板文件。
我嘗試為工作簿聲明變量對象,然后關閉變量。 這里的問題是唯一似乎有效的功能是“打開”,它只打開最后一個保存文件。 如果在導出文件時包含此代碼,則最后保存的文件將在運行時全部打開,導出的文件將在宏完成后打開。
我已經嘗試為工作簿(“文件名”)創建一個獨立的宏。關閉和工作簿(“路徑名\\文件名”)。關閉導出宏完成后要運行的方法。 相同的運行時錯誤結果。
我已經包含了我的多次關閉程序嘗試,但它們都被注釋掉了。 我仍在學習詞匯和象征意義,所以如果我有任何問題以更好地理解所提供的任何幫助,請耐心等待。
編輯:我為單個數據轉儲和關閉導出文件的相關嘗試修剪了我的代碼。 在 SAP 之后還添加了“GUI”,並刪除了對我的變體的引用。
這是我的代碼:
Sub Data_Dumps()
''Check for open Excel Workbooks
'Dim oShell: Set oShell = CreateObject("WScript.Shell")
'Dim MB51 As Workbook
If Not IsObject(GetDataDump) Then
Set SapGuiAuto = GetObject("SAPGUI")
Set GetDataDump = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
Set Connection = GetDataDump.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 GetDataDump, "on"
End If
'Consumption - MB51
session.findById("wnd[0]/tbar[0]/okcd").Text = "/nmb51"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/btn%_MATNR_%_APP_%-VALU_PUSH").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/usr/btn%_WERKS_%_APP_%-VALU_PUSH").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/usr/btn%_LGORT_%_APP_%-VALU_PUSH").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/usr/btn%_CHARG_%_APP_%-VALU_PUSH").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/usr/btn%_LIFNR_%_APP_%-VALU_PUSH").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/usr/btn%_KUNNR_%_APP_%-VALU_PUSH").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/usr/btn%_KUNNR_%_APP_%-VALU_PUSH").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/usr/btn%_BWART_%_APP_%-VALU_PUSH").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/usr/btn%_SOBKZ_%_APP_%-VALU_PUSH").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/usr/btn%_MAT_KDAU_%_APP_%-VALU_PUSH").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/usr/btn%_MAT_KDPO_%_APP_%-VALU_PUSH").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/usr/btn%_BUDAT_%_APP_%-VALU_PUSH").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/usr/btn%_USNAM_%_APP_%-VALU_PUSH").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/usr/btn%_VGART_%_APP_%-VALU_PUSH").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/usr/btn%_XBLNR_%_APP_%-VALU_PUSH").showContextMenu
session.findById("wnd[0]/usr").selectContextMenuItem "DELACTX"
session.findById("wnd[0]/tbar[1]/btn[17]").press
session.findById("wnd[1]/usr/txtV-LOW").Text = "/SIOP Central"
session.findById("wnd[1]/usr/txtENAME-LOW").Text = ""
session.findById("wnd[1]/tbar[0]/btn[8]").press
session.findById("wnd[0]/tbar[1]/btn[8]").press
session.findById("wnd[0]/mbar/menu[0]/menu[1]/menu[1]").Select
session.findById("wnd[1]/usr/ctxtDY_PATH").Text = "Z:\Rebar Fab Planning\DSI & Inventory Data Dumps"
session.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "Consumption - MB51.XLSX"
session.findById("wnd[1]/tbar[0]/btn[11]").press
'
''Closes Excel Sheets
'oShell.Run "taskkill /im excel.exe", , True
'
''Keeps DSI & Inventory Sheet Open
'
'SendKeys "{Tab}{Tab}~"
''Closes Data Dump Workbooks
'MB51.Close
'Workbooks("Consumption - MB51.XLSX").Close
'Workbooks("Z:\Rebar Fab Planning\DSI & Inventory Data Dumps\Consumption - MB51.XLSX").Close
End Sub
如果你幸運的話。 以這樣的方式設置 Excel,您的文件Z:\\Rebar Fab Planning\\DSI & Inventory Data Dumps\\Consumption - MB51.XLSX在同一個 Excel 實例中打開,您可以使用以下代碼關閉此文件
Option Explicit
Function isWorkbookOpen(ByVal wkbName As String) As Boolean
' Only working for same Excel instance
Dim wkb As Workbook
On Error Resume Next
Set wkb = Workbooks(wkbName)
On Error GoTo 0
If wkb Is Nothing Then
isWorkbookOpen = False
Else
isWorkbookOpen = True
End If
End Function
Function closeWkb(ByVal wkbName As String, counter As Long)
Const MAX_TRIES As Long = 10
If isWorkbookOpen(wkbName) Then
Workbooks(wkbName).Close False
Else
counter = counter + 1
If counter <= MAX_TRIES Then
Application.OnTime Now + TimeValue("00:00:05"), "'closeWkb """ & wkbName & """,""" & counter & "'"
End If
End If
End Function
在你的代碼中,你只需調用
closeWkb "Consumption - MB51.XLSX", 0
如果找到具有此名稱的打開工作簿,代碼將每 5 秒嘗試關閉 Excel 文件Consumption - MB51.XLSX MAX_TRIES次(上面代碼中的 10 次)。 僅當您嘗試關閉的工作簿在同一實例中打開時才有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.