SAP Jobsuche bei DV-Treff
abl489
  • abl489
  • SAP Forum - User Thema Starter
vor 7 Jahre
Guten Tag,

ich bin noch ein absoluter Neuling im Gebiet VBA und Scripting.

Aber so langsam wird es. Bin aber nun auf ein Problem gestoßen, was ich nicht behaben kann.

Ich habe ein Script aufgenommen, was eine bestimmte Transaktion in SAP aufruft und bestimmte Parameter übergibt.

Nun möchte ich einen Excel-Export ausführen und zwar auch automatisch durch das Skript.

Dabei wird aber leider ein Windows Fenster "Speichern unter" geöffnet, was ich über SAP Scripting nicht ansprechen kann.

Hat einer eine Idee, wie die Zeilen dazu heißen müssen?

Mir würde eine allgemeine variante reichen.. zB Speichertort Desktop, Name test

und ja sie soll immer überschrieben werden.. also müsste auch das im code vorhanden sein

Danach würde ich die Tabelle dann in meine aktuelle Excel-Datei ziehen. natürlich auch per makro

Aber wie gesagt ich habe leider keine Ahnung wie man das Dialog-Fenster von Windows anspricht.

Jemand eine Idee?

Wäre wirklich sehr dankbar über jede Hilfe.

Förderer

ScriptMan
vor 7 Jahre
Hallo abl489,

SAP Script hat leider nichts mit SAP GUI Scripting zu tun. Aber das nur am Rande. 😎

Ich kenne 3 Möglichkeiten. Diese sind in den 2 nachfolgenden Links erkennbar. Wähle daraus das Passende für dich aus.

z.B.

https://archive.sap.com/discussions/thread/3450067 

https://archive.sap.com/discussions/thread/1487670 

Grüße,

ScriptMan

abl489
  • abl489
  • SAP Forum - User Thema Starter
vor 7 Jahre
Hallo ScriptMan,

habe schon viele Beiträge von dir gelesen und bin grad total glücklich, dass du mir geantwortet hast :)

Danke für die Links! Ich probier sie später mal aus, ansonsten melde ich mich nochmal.

Ich wusste gar nicht, dass da ein Unterschied ist, sorry!

Ich persönlich rede von dem Recorder, der das Script automatisch aufnimmt.

Vielen Dank und liebe Grüße!

abl489
  • abl489
  • SAP Forum - User Thema Starter
vor 7 Jahre
Hey ScriptMan,

ich bin nun echt am verzweifeln.

Ich habe nun alles versucht und nichts klappt.

Immer und immer wieder öffnet SAP einfach das Dialog-Fenster von Windows mit Speichern unter.

Wie kann ich das Fenster ansprechen und einen Namen und Speicherort vergeben?

Ich habe keine Ahnung wie ich das Problem angehen soll :(

ScriptMan
vor 7 Jahre
Hallo abl489,

gib uns bitte folgende Informationen bekannt:

1. Transaktionsbezeichnung (z.B. VA01)

2. SAP GUI Version (z.B. 7.4) / Patchlevel (z.B. 5)

3. einen Ausschnitt aus dem vorhandenen Skript mit der betreffenden Stelle

Grüße,

ScriptMan

abl489
  • abl489
  • SAP Forum - User Thema Starter
vor 7 Jahre
Hey ScriptMan,

es handelt sich um die Transaktion COOIS.

Zu 2. kann ich nur sagen beim Start steht: SAP GUI for WINDOWS und dann 740 Final Release

Oben Links steht immer SAP Logon Pad 740

Das ganze läuft über Citrix.

und nun der code:

Sub Schaltfläche1_Klicken()

If Not IsObject(SAPApplication) Then

Set SapGuiAuto = GetObject("SAPGUI")

Set SAPApplication = SapGuiAuto.GetScriptingEngine

End If

If Not IsObject(Connection) Then

Set Connection = SAPApplication.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 Application, "on"

End If

session.findById("wnd[0]").resizeWorkingPane 232, 38, False

session.findById("wnd[0]/tbar[0]/okcd").Text = "/nCOOIS"

session.findById("wnd[0]").sendVKey 0

session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_ARBPL-LOW").Text = "102"

session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_OWERK-LOW").Text = "4910"

session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtP_SYOP1").Text = "FREI"

session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_ECKEN-LOW").Text = "05.12.2016"

session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_ECKEN-HIGH").Text = "09.12.2016"

session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_ECKEN-HIGH").SetFocus

session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_ECKEN-HIGH").caretPosition = 10

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

session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell").pressToolbarButton "&NAVIGATION_PROFILE_TOOLBAR_EXPAND"

session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell").pressToolbarContextButton "&MB_EXPORT"

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

session.findById("wnd[1]/usr/radRB_OTHERS").SetFocus

session.findById("wnd[1]/usr/radRB_OTHERS").Select

session.findById("wnd[1]/usr/cmbG_LISTBOX").Key = "04"

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

Hier ist nun das Windows Fenster auf mit der Aufforderung Speichern unter. Also müsste hier ein Hinweis kommen

End Sub

Eine andere Lösung wäre auch, die angezeigte Tabelle direkt in die offene Excel Datei in ein Arbeitsblatt zu kopieren.

Ist das einfacher??

Dann müsste der Export nicht als Datei stattfinden, sondern nur die Tabelle kopiert werden.

Danke für deine Hilfe!

ScriptMan
vor 7 Jahre
Hallo abl489,

man kann ab der Version 7.4 im SAP GUI Scripting einstellen, dass der Scriptrecorder auch die Dialogfenster aufzeichnen soll.

1. Lokales Layout anpassen (Alt / F12)

2. Optionen

3. Barrierefreiheit & Scripting

4. Skriptunterstützung

5. Systemeigene Dialogfenster von Microsoft Windows anzeigen

(deaktivieren = kein Häkchen)

Grüße,

ScriptMan

abl489
  • abl489
  • SAP Forum - User Thema Starter
vor 7 Jahre
Guten Tag ScriptMan,

das habe ich auch schon gesehen, aber bewirkt bei mir leider keine Veränderung :(

Also wenn ich die Einstellung vornehme und dann das Skript aufzeichne und abspiele, dann bleibt es trotzdem bei dem Dialogfenster Speichern Unter stehen und verlangt eine Aktion..

Eine andere denkbare Alternative: es wird keine Exportdatei erstellt.

Sprich: die benötigten Zeilen werden einfach direkt in ein bestimmtes Arbeitsblatt kopiert.

Aber da habe ich leider auch keine Ahnung wie das passieren soll. ( Strg+C und Strg+V ablaufen lassen)

ScriptMan
vor 7 Jahre
Hallo abl489,

dann muss man eben andere Möglichkeiten ausloten.

Frage:

Kann es statt XML- auch ein XXL-Format sein? Wenn ja, dann könnte man die nachfolgende Version ausprobieren. Ansonsten müsste man selbstverständlich mit dem XML-Format was Anderes unternehmen.


. . .
session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell").pressToolbarButton "&NAVIGATION_PROFILE_TOOLBAR_EXPAND"
session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell").pressToolbarContextButton "&MB_EXPORT"
session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont/shell").selectContextMenuItem "&XXL"
session.findById("wnd[1]/usr/radRB_OTHERS").SetFocus
session.findById("wnd[1]/usr/radRB_OTHERS").Select

'diese Kommandos müsste man u.U. in deinem System neu aufzeichnen
'-------------------------------------------------------------------------------------------
session.findById("wnd[1]/usr/cmbG_LISTBOX").Key = "08"
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/usr/subSUBSCREEN_STEPLOOP:SAPLSPO5:0150/sub:SAPLSPO5:0150/radSPOPLI-SELFLAG[0,0]").select
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/tbar[0]/btn[0]").press
'-------------------------------------------------------------------------------------------

SAP_Workbook = "Tabelle von Basis (1)"
EXCEL_Path  = "z:\tmp\"
myWorkbook = "Report.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.SaveAs EXCEL_Path & myWorkbook 
xclapp.ActiveWorkbook.Close


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

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

End Sub

Grüße,

ScriptMan

P.S. Mit STRG/C und STRG/V kommt man beim Scripting nicht weiter.

abl489
  • abl489
  • SAP Forum - User Thema Starter
vor 7 Jahre
Hey ScriptMan,

ich probiere deins gleich direkt mal aus.

Vorher noch eine Frage:

Ich habe einen alten Thread durchgearbeitet, wo du auch geantwortet hast.

Da hat es ein User wie folgt geschafft: (Anpassung an meins schon)

Set xlapp = CreateObject("Excel.Application")

Set xlBook = xlapp.Workbooks.Add

Set xlSheet = xlBook.Worksheets(1)

xlapp.Visible = True

'schleife abarbeiten der Liste

LastLine = session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell").RowCount - 1

For i = 0 To LastLine

xlSheet.Range("a1").Value = session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell").getcellvalue(i, "Werk")

Next

Dabei öffnet er dann aber leider nur eine neues Excel-Datei und kopiert nichts rein.

Weißt du wieso?

abl489
  • abl489
  • SAP Forum - User Thema Starter
vor 7 Jahre
Dein Code funktioniert leider nicht :(

Es passiert nichts und wenn ich den Code abbreche ist der Fehler bei der Zeile:

If Err.Number = 0 Then Exit Do

Ich hab bei deinem Code nun einfach mal die Loops rausgenommen und dann läuft er ohne zu meckern, aber ohne Ziel 💤

Wenn ich hinschau, dann sehe ich, dass einmal ein ExcelSheet mit den benötigten Daten aufploppt, aber er speichert es nirgends ab.

Finde die Datei, wie ich Sie genannt habe unter den angegebenen Pfad nicht :/

ScriptMan
vor 7 Jahre
Ich beziehe mich immer noch auf das vorhergehende Bespiel von mir. Dort habe ich angedeutet, dass man u.U. bestimmte Passage im Skript neu aufzeichnen müsste und an der Stelle die vorhandenen Kommandos mit den neu aufgezeichneten ersetzen müsste.

1. Export in eine Tabellenkalkulation wählen

2. Aus allen verfügbaren Formaten auswählen

3. Excel (im bisherigen XXL-Format) auswählen

4. Bestätigen

5. Information bestätigen

6. Wenn eine Auswahl kommen sollte, dann Tabelle (nicht Pivottabelle) auswählen

7. Wenn eine Info kommen sollte dann bestätigen

8. Wenn jetzt die Excel-Mappe (Tabelle von Basis (1) ) erscheint, kann die Aufzeichnung beendet werden.

Dann einfach die Kommandos ab der Zeile

session.findById("wnd[1]/usr/cmbG_LISTBOX").key = "08"

ersetzen.

Die Schleifen müssen selbstverständlich drin bleiben.

abl489
  • abl489
  • SAP Forum - User Thema Starter
vor 7 Jahre
Ok, tut mir wahnsinnig leid!! Ich muss irgendwas vorhin falsch gemacht haben.

Nun funktioniert es!!! 😃

Vielen, vielen Dank!!!!!!!!!!!

An welcher Stelle müsste ich eingreifen, um die Daten direkt abzugreifen, statt die Datei extra zu speichern?

Ich könnte quasi ein Export erstellen, dann die Daten in meine aktuell offene Datei kopieren und wieder schließen.

Danke ScriptMan!

ScriptMan
vor 7 Jahre
Hier kommt nun eine neue Variante des Excel-Exports:


...
SAP_Workbook = "Tabelle von Basis (1)"
'EXCEL_Path  = "z:\tmp\"
myWorkbook = "Report.xlsx"
mySheet = "Tabelle1"


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.SaveAs EXCEL_Path & myWorkbook 

xclapp.ActiveWindow.WindowState = 2
xclapp.Cells.Select
xclapp.Selection.Copy
xclapp.Windows(myWorkbook).Activate
xclapp.Sheets(mySheet).Select
xclapp.ActiveSheet.Paste
xclapp.Range("A1").Select
xclapp.Windows(SAP_Workbook).Activate
xclapp.Range("A1").Select
xclapp.Application.CutCopyMode = False
xclapp.ActiveWorkbook.Close
xclapp.Windows(myWorkbook).Activate
xclapp.Range("A1").Select

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

session.findById("wnd[1]/tbar[0]/btn[0]").press
End Sub
abl489
  • abl489
  • SAP Forum - User Thema Starter
vor 7 Jahre
Ein Traum!

Vielen herzlichen Dank!

abl489
  • abl489
  • SAP Forum - User Thema Starter
vor 7 Jahre
Huhu,

eine klitzekleine Frage noch.

Die letzte Zeile im Code ist ja die Bestätigung in SAP. Dadurch wird bei dem Code als letztes SAP angezeigt.

Ich würde aber gerne zu Excel zurück und zwar zu der UserForm, wo der Button für den Vorgang integriert ist.

Wenn ich einfach UserForm.Show angebe, meldet er einen Fehler :(

und: wie lautet der Code, dass das ganze im Hintergrund passiert?

ich habe Application.ScreenUpdating = False gefunden. Aber die Prozesse werden weiterhin angezeigt. Sprich ich kann am Bildschirm jeden Schritt sehen.

Das Ergebnis soll eigentlich sein: Ich drücke einen Button auf der UserForm.. Excel zieht die Daten aus SAP und fertig. Es soll quasi nur eine Aktualisierung sein. Der Bildschirm soll quasi star sein.

ScriptMan
vor 7 Jahre
Das was im SAP geschieht, kann man nicht vollständig im Hintergrund ausführen lasen. Das Einzige was man ausprobieren kann, ist folgendes:

Ersetzen von

session.findById("wnd[0]").maximize

durch

session.findById("wnd[0]").iconify

gleich am Anfang des wahrscheinlich VBA-Programmes:

z.B


Sub myMakro ()
Set SapGuiAuto  = GetObject("SAPGUI")
Set SAP_Application = SapGuiAuto.GetScriptingEngine
Set connection = SAP_Application.Children(0)
Set session    = connection.Children(0)
session.findById("wnd[0]").iconify
. . .

SAP bleibt dann in der Taskleiste. Einzelne kleine Fenster können aber trotzdem hochpoppen. Der Focus bleibt aber im Excel stehen.

Mit Application.ScreenUpdating = False wird lediglich der Bildschirm im Excel eingefroren.

abl489
  • abl489
  • SAP Forum - User Thema Starter
vor 7 Jahre
Hey ScriptMan,

ich habe nachträglich doch leider ein Problem mit dem Code.

An sich funktioniert er wie gewollt, danke nochmal!

Aber: komischerweise meldet er manchmal bei der ersten Ausführungen folgenden Fehler: xclapp.ActiveSheet.Paste

Laufzeitfehler '1004':

Wenn Sie alle Zellen aus einer Excel-Arbeitsmappe einfügen möchten, müssen Sie die Daten in die erste Zelle (A1 oder Z1S1) einfügen.

Wenn ich die Zeile dann einfach deaktivier und wieder aktivier funktioniert es wieder und dann reibungslos.

Was kann der Fehler sein?

Danke!

ScriptMan
vor 7 Jahre
Hallo abl489,

so wie es aussieht, habe ich was nicht bedacht. Du müsstest noch den folgenden Befehl einbauen:


...
xclapp.ActiveWindow.WindowState = 2
xclapp.Cells.Select
xclapp.Selection.Copy
xclapp.Windows(myWorkbook).Activate
xclapp.Sheets(mySheet).Select
'-----------neu--------------------
xclapp.Range("A1").Select
'-----------neu--------------------
xclapp.ActiveSheet.Paste
xclapp.Range("A1").Select
xclapp.Windows(SAP_Workbook).Activate
xclapp.Range("A1").Select
xclapp.Application.CutCopyMode = False
xclapp.ActiveWorkbook.Close
xclapp.Windows(myWorkbook).Activate
xclapp.Range("A1").Select
...

Grüße,

ScriptMan

abl489
  • abl489
  • SAP Forum - User Thema Starter
vor 7 Jahre
Da hätte ich nun wirklich selbst drauf kommen können :D

Wobei ich das Szenario mit dem Makrorecorder nachgespielt und aufgenommen habe und da war es bei mir auch nicht drin 😃 und klappt ja auch oft ohne die Zeile!..

Vielen Dank ScriptMan!