EXCEL Datenextrakt mit VB GUI öffnet automatisch die EXCEL Datei

  • Excel

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ScriptMan.

    EXCEL Datenextrakt mit VB GUI öffnet automatisch die EXCEL Datei

    Ich habe ein Problem, das einige User im Netz auch haben, aber ich habe dafür noch keine Lösung gefunden.
    Ich möchte mit VB (EXCEL) einen SAP Extrakt automatisch mit Hilfe von GUI extraieren. Der Extrakt soll wieder eine Excel Datei sein. Das ganze funktioniert mit folgendem Code einwandfrei.
    Es gibt nur ein problemchen. Die neu extraierte Excel Datei wird immer automatisch geöffnet. Dadurch bleibt das eigentliche Makro immer in Zeile 32 stehen und kann nur manuell wieder gestartet werden.
    Wie kann ich das automatische öffnen des Datenextraktes unterbinden, oder mit VB so ignorieren, das es das Makro nicht stoppt?


    Visual Basic-Quellcode

    1. Sub SAP_Extrakt_Reservierungen()
    2. If Not IsObject(Application1) Then
    3. Set SapGuiAuto = GetObject("SAPGUI")
    4. Set Application1 = SapGuiAuto.GetScriptingEngine
    5. End If
    6. If Not IsObject(Connection) Then
    7. Set Connection = Application1.Children(0)
    8. End If
    9. If Not IsObject(session) Then
    10. Set session = Connection.Children(0)
    11. End If
    12. If IsObject(WScript) Then
    13. WScript.ConnectObject session, "on"
    14. WScript.ConnectObject Application1, "on"
    15. End If
    16. session.findById("wnd[0]").maximize
    17. session.findById("wnd[0]/tbar[0]/okcd").Text = "/NMB25"
    18. session.findById("wnd[0]").sendvkey 0
    19. session.findById("wnd[0]/tbar[1]/btn[17]").press
    20. session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").currentCellRow = 2
    21. session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").selectedRows = "2"
    22. session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").doubleClickCurrentCell
    23. session.findById("wnd[0]/tbar[1]/btn[8]").press
    24. session.findById("wnd[0]/mbar/menu[0]/menu[1]/menu[1]").Select
    25. session.findById("wnd[1]/tbar[0]/btn[0]").press
    26. session.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 14
    27. session.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "Reservierungen.xlsx"
    28. session.findById("wnd[1]/tbar[0]/btn[11]").press '(Datei ersetzen)
    29. Windows("Reservierungen.xlsx").Activate
    30. ActiveWorkbook.Close SaveChanges:=False
    31. End Sub

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Parawolli“ ()

    Parawolli schrieb:

    Windows("Reservierungen.xlsx").Activate
    ActiveWorkbook.Close SaveChanges:=False
    Was ist Reservierungen.xlsx?
    Es kann nicht das Workbook sein, das den Code beinhaltet.
    Es müsste sonst ein .xlsm oder .xlsb sein.

    Activate ist selten gut im Code.
    Adressiere die Objekte direkt.
    Entweder

    Visual Basic-Quellcode

    1. Windows("Reservierungen.xlsx").Close SaveChanges:=False
    oder besser

    Visual Basic-Quellcode

    1. ThisWorkbook.Close SaveChanges:=False
    (so wie es halt passt).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    petaod schrieb:

    Was ist Reservierungen.xlsx?
    Es kann nicht das Workbook sein, das den Code beinhaltet.
    Ja genau, es ist nicht das Workbook mit dem Makro, sondern die mit Hilfe des Makros erstellte Excel Datei aus dem SAP.
    Auf die Endung .xlsx habe ich keine Einfluss. Die vergibt SAP automatisch, wenn ich angebe, das eine Tabellenkalkulation erstellt werden soll.

    Den Code bis Zeile 30 habe ich übrigens mit dem GUI Recorder aus SAP aufgenommen.
    Das eigentliche Problem ist ja nur das verhalten von SAP bzw. Excel, das die neu erstellte Datei sich automatisch öffnet und dadurch das Makro stoppt, weil meine .xlxm Datei dadurch verlassen wird.

    Ich könnte das Problem mit weiteren Befehlsschaltflächen umgehen, weil ich dadurch ja wieder den Code starten könnte, aber ich möchte das es möglichst mit einer Befehlsschaltfläche durchläuft.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „EaranMaleasi“ ()

    Ich habe überall in meinem Code mit Deine Vorschlag ergänzt. --> Windows("Reservierungen.xlsx").Close SaveChanges:=False
    Aber das ist und kann auch nicht das Problem sein! Denn es kommt ja keine Fehlermeldung, sondern das Makro hält einfach nur an, weil sich unerwartet während des Programmlaufes eine Excel Datei öffnet, die nicht vom laufenden Makro heraus geöffnet wird, sondern von SAP.
    Der hängt da irgendwo in der SapGui.ScriptingEngine.
    Die musst du wohl irgendwie beenden, bevor du das von ihr erzeugte Workbook schließen kannst.
    Ich vermute, dass das eine völlig andere Excel-Instanz ist als die, in der dein Makro läuft.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ja, genau das ist eben das Problem und wird auch immer in den anderen Chats zu diesem Problem gepostet.
    Ich habe schon mal in den Einstellungen von SAP gesucht, aber nichts gefunden. Ich werde das Problem wohl mit mehreren Befehlsschaltflächen umgehen müssen.
    Sind dann 2 zusätzliche, weil ich 2x einen SAP Extrakt ziehen muss.
    Falls noch jemand an einem workaround für das dargestellte Problem interessiert sein sollte, kann er sich folgende Lösung anschauen:

    ...

    Visual Basic-Quellcode

    1. session.findById("wnd[1]/tbar[0]/btn[0]").press
    2. 'session.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 14 'nicht notwendig
    3. session.findById("wnd[1]/usr/ctxtDY_PATH").Text = "c:\tmp" 'notwendig
    4. session.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "Reservierungen.xlsx"
    5. session.findById("wnd[1]/tbar[0]/btn[11]").press '(Datei ersetzen)
    6. Dim xlApp As Object
    7. Do
    8. Application.Wait Now + TimeSerial(0, 0, 1)
    9. On Error Resume Next
    10. Set xlApp = GetObject("c:\tmp\Reservierungen.xlsx").Application
    11. If Err.Number = 0 Then Exit Do
    12. On Error GoTo 0
    13. Loop
    14. On Error GoTo 0
    15. xlApp.Workbooks(1).Close False
    16. xlApp.Quit
    17. End Sub


    Grüße, ScriptMan

    *Code-Tag eingefügt*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()