首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SAP GUI脚本打开一个Excel窗口,但我无法停止它

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

Stack Overflow用户
提问于 2015-10-21 17:57:20
回答 4查看 8.8K关注 0票数 2

我已经将其全部运行,除了一个(看似很小的)问题: SAP总是自动打开导出的Excel文件,而且似乎没有办法阻止它,因为它似乎发生在Excel VBA中导入数据的子例程完成之后(它们包含SAP GUI脚本)。

如果我只运行Excel子例程,那么sap_export文件就会打开,这非常烦人。但是,如果我运行refresh_sap(),它调用sap_export(),然后运行refresh(),它访问导入数据的导出Excel文件,我会得到提示,告诉我该文件已经在使用中。

我找不到任何方法来阻止SAP GUI脚本打开该文件,因为它似乎不会在运行时发生。我怀疑这就是为什么我找不到任何使用Application.Wait或DoEvents来解决这个问题的方法。无论我等多长时间,它都不会工作,因为文件只是在运行后才会打开。

代码语言:javascript
复制
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并查看是否有效-尽管我不希望这样做。

EN

回答 4

Stack Overflow用户

发布于 2015-11-02 17:42:00

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

票数 0
EN

Stack Overflow用户

发布于 2019-06-21 21:27:40

将SAP输出保存为Excel格式后,VBA例程通常会执行大量工作。与您的体验一样,Excel会在宏完成后立即尝试打开该文件。我通常会直接在其他VBA例程中对数据进行后处理。我发现如果我在VBA算法中做了两件事,文件不会打开,VBA也不会中断。下面是我要做的:

  1. 在我从SAP导出文件后,我立即通过连接文件名中.XLS之前的日期和时间来重命名该文件。我将该名称保存在Excel文件中,然后单独打开它。
  2. 重命名后,我会立即继续打开重命名的文件或打开VBA中的其他例程,大多数情况下,打开找不到的文件名不会中断VBA的处理。
票数 0
EN

Stack Overflow用户

发布于 2021-03-12 22:57:00

我想出了一个解决办法,有一次,当我使用SAP脚本运行VBA时,我观察到Excel太忙了,没有时间响应SAP的打开文件请求。因此,当SAP打开该文件时,它会尝试在Excel的最新实例中打开它。如果您的脚本在旧实例的电子表格中运行,SAP将向新实例发送打开文件命令,这意味着Excel打开错误消息将显示在较新的Excel单独实例中。下面是你如何做到这一点:

  1. 使用宏
  2. 打开电子表格,按住Alt键的同时按下
  3. ,在任务栏
  4. 中的Excel图标上单击鼠标右键并按住Alt键,从弹出菜单中选择Excel图标
  5. 仍然按住ALT,最终将出现一条消息,询问您是否需要新实例,回答是
  6. 当显示绿色的Excel启动消息时,松开ALT键确保新实例处于空白状态。正常运行宏/脚本。

在Excel 365中的工作方式就像一个护身符。我没有在旧版本中测试过它。最后,您必须转到Excel的新实例,逐条清除所有错误消息。

除此之外,您可能需要阻止新实例打开该文件。我通过在导出文件后立即重命名目录中的SAP导出文件来处理此问题。我通过在文件名中添加日期戳来重命名该文件。这样,我就可以确保新实例不会偶然打开导出的文件。因此,如果我总是导出到SAP_MMUsers.xlsx,我在VBA编码中将其重命名为SAP_MMUsers_0312.xlsx。因此,我总是导出到SAP_MMUsers.xlsx,并且只需在第一次运行宏/脚本时回答SAP“允许”问题。导出文件名不应该存在于目录中,因此我不必为Replace选项编写代码,并且如果我需要返回并查看原始数据,我将使用时间戳保存输出。在我的过程中,我总是删除目录中遵循我的SAP导出命名约定的任何SAP导出文件(它们总是以“SAP_”开头)。这样,该进程就在VBA代码中内置了一些冗余,以避免处理中断。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33256214

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档