簡體   English   中英

阻止或關閉導出的文件 - 從 SAP GUI 到 Excel

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM