SAP Jobsuche bei DV-Treff
gnagflow
  • gnagflow
  • SAP Forum - Neuling Thema Starter
vor 4 Jahre
Hallo,

aus Excel gehe ich nach SAP um mir einen Bericht zurück nach Excel zu holen und diesen dann in Excel zu formatieren und zu sortieren.

In SAP anmelden und den Export aus SAP erstellen funktioniert.

Wenn ich am Ende des Scripts dann versuche die Datei anzusprechen, z. Bsp. mit 'Workbooks.("export.xlsx").activate oder irgendeinen anderen Befehl, erhalte ich einen Fehler und die Datei export.xlsx ist nicht sichtbar, auch wenn ich vorher ein Application.wait oder wscript.sleep verwende. Setze ich aber einen Halt beim activate-Befehl, wird die "export.xlsx" sichtbar, ist aktiv und kann bearbeitet werden. Der activate-Befehlt funktioniert dann auch und das Script läuft weiter. Ein Workaround wäre sicherlich das Script an der Stelle zu beenden und den Rest über ein zusätzliches Script zu starten.

Das wäre aber unschön.

Hat jemand von Euch eine Idee, wie ich das lösen kann?

Ich habe heute auch schon einige Stunden recherchiert, konnte aber keine Lösung finden.

Versionen: Excel 365 und SAPGui 750.

Vielen Dank und Gruß

Wolfgang

Förderer

ScriptMan
vor 4 Jahre
Hallo Wolfgang,

willkommen im Forum. Dein Problem wäre besser unter GuiXT aufgehoben. SAP Script und SAP GUI Scripting sind zwei verschiedene Themen.

Siehe dir bitte folgenden Link an:

https://stackoverflow.com/questions/40729968/exported-file-opens-after-macro-completes-unwanted 

Mit ein wenig Arbeit kannst du es für dich anpassen.

Grüße, ScriptMan

gnagflow
  • gnagflow
  • SAP Forum - Neuling Thema Starter
vor 4 Jahre
Hallo Scriptman,

vielen Dank für Deine Antwort und sorry, dass ich Thema unter der falschen Rubrik eingegeben habe. Vielleicht könntest Du das korrigieren und der richtigen Rubrik zuordnern.

Ich habe den von Dir genannten Link angesehen und den Code bei mir angepasst. Der Code läuft auch im Debugging-Modus, wenn ich einen Halt einfüge bei mir durch. Sobald ich es durchlaufen lasse, kommt die Fehlermeldung, dass die personal.xlsb gesperrt ist, da die Export-Datei in einer neuen Instanz geöffnet wird. Auch wenn ich application.enableevents und application.displayalerts auf false setze, führt das zu keiner Verbesserung. Excel hängt sich auf und kann auch nicht mehr mit der Tastenkombi STRG-Pause unterbrochen werden. Es hilft nur ein Killen des Prozesses. Ich habe bei der Recherche keinen Hinweis gefunden, wie ich via VBA verhindern kann, dass bei einer neuen Instanz die Inhalte des XLSTART-Ordners nicht mitgestartet werden.

Anbei der Ausschnitt aus meinem Code:

...................

.findById("wnd[1]/tbar[0]/btn[11]").press

End With

'# Export-Datei beenden

Application.EnableEvents = False

Application.DisplayAlerts = False

SAP_Workbook = "export.xlsx"

On Error Resume Next

Do

Err.Clear

Set xclApp = GetObject(, "Excel.Application")

If Err.Number = 0 Then Exit Do

'msgbox "Wait for Excel session"

WScript.sleep 2000

objSess.findById("wnd[0]").Iconify

objSess.findById("wnd[0]").Maximize

Loop

' Application.EnableEvents = True

' Application.EnableEvents = False

Do

Err.Clear

Set xclwbk = xclApp.Workbooks.Item(SAP_Workbook)

If Err.Number = 0 Then Exit Do

'msgbox "Wait for SAP workbook"

WScript.sleep 2000

Loop

Application.DisplayAlerts = True

Application.EnableEvents = True

On Error GoTo 0

Set xclsheet = xclwbk.Worksheets(1)

xclApp.Visible = True

xclApp.DisplayAlerts = False

xclApp.ActiveWorkbook.Close

Set xclwbk = Nothing

Set xclsheet = Nothing

xclApp.Quit

Set xclApp = Nothing

...............

Ich möchte mich noch einmal besonders bei Dir bedanken, weil mir Deine Antworten in diesem Forum schon oft geholfen und mich weiter voran gebracht haben.

Viele Grüße

Wolfgang

ScriptMan
vor 4 Jahre
Hallo Wolfgang,

in dem Link befand sich noch ein anderer Beitrag vom 23.11.2016 und der war dann der Richtige. Am Ende ist es auch nur ein Workaround, der aber ohne weiteres zu tun, funktionieren müsste. Dein Beitrag kann nur ein Administrator dieses Portals verschieben und das bin ich nicht. Danke aber für Deine anerkennenden Worte.

z.B.

...................
.findById("wnd[1]/tbar[0]/btn[11]").press
End With

'# Export-Datei beenden

set Wshell = CreateObject("WScript.Shell")
Wshell.run "c:\tmp\SAP_Workbook_Close.vbs",1,false
End Sub

SAP_Workbook_Close.vbs:

SAP_Workbook = "SAP_export.xlsx" 
on error resume next
do
 err.clear
 Set xclApp = GetObject(, "Excel.Application")
 If Err.Number = 0 Then exit do
 'msgbox "Wait for Excel session"
 wscript.sleep 2000
 loop

do 
 err.clear
 Set xclwbk = xclApp.Workbooks.Item(SAP_Workbook)
 If Err.Number = 0 Then exit do
 'msgbox "Wait for SAP workbook"
 wscript.sleep 2000
loop

on error goto 0 
Set xclSheet = xclwbk.Worksheets(1)

xclApp.Visible = True
xclapp.DisplayAlerts = false

xclapp.ActiveWorkbook.Close


Set xclwbk = Nothing
Set xclsheet = Nothing
'xclapp.Quit
set xclapp = Nothing

Grüße,

ScriptMan

Gosemann
vor 4 Jahre
Hallo

Ich neu hier im Forum und das ist sozusagen mein erster Beitrag. Eigentlich habe ich mich hier angemeldet weil ich auf der Suche nach einer Anbindung für Kyocera Drucker unter SAP bin und dann fiel gleich dieser Beitrag ins Auge. Ich bin keine großer SAP User oder VBA Programmierer aber dennoch habe ich es geschafft ein Tool für unser Unternehmen zu schreiben bei dem man mit einem Scanner TA-Nummern erfasst und diese dann mit LT12 automatisch quittiert und danach wird mit LT22 eine Liste mit noch allen offenen Positionen gezogen. Ich glaube oder ich vermute mal das Problem zu kennen.Im VBA Script kommt die Anweisung zB. wie bei mir eine LT22 Liste zu exportieren und du versuchst die Daten dann einzulesen und Excel findet die Instanz nicht denn sie ich nicht da , oder noch nicht da denn die Instanz kommt von SAP. Seltsamerweise hatte ich diese Probleme vorher nicht und mit vorher meine ich vor Office365. Zusätzlich zu Office365 kam noch dazu das die Export.xlsx sich immer in den Vordergrund geschoben hatte. Gelöst habe ich das bzw. der Zufall hat es für mich gelöst indem ich das Script in eine Userform gepackt und diese beim starten Excel mit Application.visible = false versteckt habe.

Eine zweite Möglichkeit wäre, die mir jetzt gerade beim schreiben einfällt und die ich später mal testen werde ist: Ich erstelle eine leere Access Datenbank und in dieser eine Verknüpfung zur Export.xlsx. Access schließen und Export löschen und im Script in einer Schleife bis dir(exportt.xlsx)=true und dann in Excel mit ADODB zugreifen.

Soviel zu meinem ersten Beitrag und ich hoffe mal er ist nützlich😊 😊

Lutz Fricke
vor 4 Jahre
Hallo zusammen,

ich habe auch das oben beschriebene Problem. Merkwürdigerweise nur bei einigen Transaktionen.

Aus der COOISPI heraus läuft's perfekt. SAP öffnet automatisch eine neue Instanz, die ich dann sauber abarbeiten kann.

Aus der MB51 heraus läuft es aber einfach nicht. Wie beschrieben erscheint nach Ende des Makros die exportierte Datei oder, wenn sie im Makro wieder gelöscht wurde, eine entsprechende Fehlermeldung.

@Scriptman, du hast im verlinkten Threat zuletzt noch eine neuere Lösung gepostet:

Zitat:

...

' Export from SAP to .xlsx file.

Session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").contextMenu

Session.findById("wnd[0]/usr/cntlGRID1/shellcont/shell").selectContextMenuItem "&XXL"

Session.findById("wnd[1]/tbar[0]/btn[0]").press

Session.findById("wnd[1]/usr/ctxt[0]").Text = "C:\tmp"

Session.findById("wnd[1]/usr/ctxt[1]").Text = "SAP_export.XLSX"

Session.findById("wnd[1]/tbar[0]/btn[11]").press

Dim xlApp As Object

Application.Wait Now + TimeSerial(0, 0, 5)

Set xlApp = GetObject("c:\tmp\SAP_export.XLSX").Application

xlApp.Workbooks(1).Close False

'xlApp.Quit

...

Das habe ich probiert, aber leider schließt mir das Makro dann die Instanz mit dem Makro selbst... Und wenn ich den Code richtig lese, ist das ja auch korrekt. Wie behalte ich mein Makro am Laufen und wo genau kommt der Code zur Bearbeitung der Export-Datei hin.

@gosemann,

was genau meinst Du mit "in eine Userform gepackt"? Hast Du nen Beispielcode für mich?

Vielen Dank,

Lutz Fricke