繁体   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