Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

SAP Script über VBA beenden

Forumthread: SAP Script über VBA beenden

SAP Script über VBA beenden
16.08.2023 06:36:47
Nikki
Hallo, ich bin mal wieder auf Eure Hilfe angewiesen.
Ich habe mir mit Hilfe des Internets ein SAP Sript zusammengebastelt welches über Excel gestartet wird. Das Marko speichert Daten aus SAP in Excel ab. Jetzt habe ich das Problem, dass wenn unten stehendes Marko durchgelaufen ist, kein anderes mehr funktioniert. Entweder bekomme ich eine Fehlermeldung oder die Buttons mit den Markos reagieren überhaupt nicht mehr. Ich muss erst die Datei schließen und wieder neu öffnen. Danach funktionieren wieder alle Makros. Ich vermute, dass es irgendwie an der Verbindung zu SAP liegt. Wie bekomme ich das hin, ohne jedesmal die Datei neu zu öffnen? Kann mir jemand helfen? Das wäre super. Vielen dank für eure Hilfe.

Sub Vorgänge()
Dim SAPGuiAuto, Application, connection, session As Object
Dim Stückliste As String
Dim Speichername As String
Dim Speicherort As String

Dim i As Integer
Dim lastrow As Integer

Set SAPGuiAuto = GetObject("SAPGUI")
Set Application = SAPGuiAuto.getscriptingEngine

Set connection = Application.Children(0)
Set session = connection.Children(0)

lastrow = ThisWorkbook.Sheets("PPS").Cells(Rows.Count, 1).End(xlUp).Row


session.findById("wnd[0]").resizeWorkingPane 342, 42, False
session.findById("wnd[0]/tbar[0]/okcd").Text = "/ncoois"
session.findById("wnd[0]").sendVKey 0

For i = 2 To lastrow


Stückliste = ThisWorkbook.Sheets("PPS").Range("A" & i).Value
Speichername = ThisWorkbook.Sheets("PPS").Range("b" & i).Value
Speicherort = ThisWorkbook.Sheets("PPS").Range("c" & i).Value

session.findById("wnd[0]").resizeWorkingPane 272, 40, False

session.findById("wnd[0]/tbar[0]/okcd").Text = "/ncoois"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/ssub%_SUBSCREEN_TOPBLOCK:PPIO_ENTRY:1100/chkPPIO_ENTRY_SC1100-SELECT_PLANNEDORDS").SetFocus
session.findById("wnd[0]/usr/ssub%_SUBSCREEN_TOPBLOCK:PPIO_ENTRY:1100/chkPPIO_ENTRY_SC1100-SELECT_PLANNEDORDS").Selected = True
session.findById("wnd[0]/usr/ssub%_SUBSCREEN_TOPBLOCK:PPIO_ENTRY:1100/cmbPPIO_ENTRY_SC1100-PPIO_LISTTYP").Key = "PPIOA000"
session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_MATNR-LOW").Text = Stückliste
session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_MATNR-LOW").SetFocus
session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_MATNR-LOW").caretPosition = 9
session.findById("wnd[0]/tbar[1]/btn[8]").press
session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont[1]/shell").currentCellRow = -1
session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont[1]/shell").selectColumn "AUFNR"
session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont[1]/shell").contextMenu
session.findById("wnd[0]/usr/cntlCUSTOM/shellcont/shell/shellcont[1]/shell").selectContextMenuItem "&XXL"
session.findById("wnd[1]/usr/chkCB_ALWAYS").SetFocus
session.findById("wnd[1]/usr/chkCB_ALWAYS").Selected = True
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/usr/ctxtDY_PATH").SetFocus
session.findById("wnd[1]/usr/ctxtDY_PATH").caretPosition = 0
session.findById("wnd[1]").sendVKey 4
session.findById("wnd[2]/usr/ctxtDY_PATH").Text = Speicherort
session.findById("wnd[2]/usr/ctxtDY_FILENAME").Text = Speichername
session.findById("wnd[2]/usr/ctxtDY_FILENAME").caretPosition = 9
session.findById("wnd[2]/tbar[0]/btn[11]").press
session.findById("wnd[1]/tbar[0]/btn[11]").press
session.findById("wnd[0]/tbar[0]/btn[3]").press
session.findById("wnd[0]").resizeWorkingPane 179, 40, False
session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_MATNR-LOW").SetFocus
session.findById("wnd[0]/usr/tabsTABSTRIP_SELBLOCK/tabpSEL_00/ssub%_SUBSCREEN_SELBLOCK:PPIO_ENTRY:1200/ctxtS_MATNR-LOW").caretPosition = 9
Next i

Myend:
Set session = Nothing
Set SAPGuiAuto = Nothing
Set Application = Nothing
Set connection = Nothing

End Sub
Anzeige

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: SAP Script über VBA beenden
16.08.2023 08:48:48
Crazy Tom
moin

dim Application?

set Application = nothing?

da würde ich auch nüscht mehr machen

MfG Tom
AW: SAP Script über VBA beenden
16.08.2023 09:25:36
Der Steuerfuzzi
Hallo,

hm, ich kenn mich mit SAP nicht wirklich aus, aber auf den ersten Blick ist nichts erkennbar, was problematisch sein könnte.

Kann es vielleicht sein, dass das Makro sehr lange läuft und deshalb nichts mehr reagiert? Wie viele Zeilen arbeitet das Makro denn ab? Also welchen Wert hat lastrow?

Grüße
Michael
Anzeige
SAP Script über VBA beenden
16.08.2023 09:26:06
Ulf
Hi
Application (Cennection) sind Schlüsselworte, VBA kennt keine Deklaration in Kette
=>
Dim sapGuiAuto as Object
Dim sapApplication as Object
Dim sapConnection as Object
Dim sapSession As Object
Set sapGUIAuto..
Set sapAppli..

umgekehrt beenden

Set sapSession=nothing
set sapConnection...
hth
Ulf
Anzeige
SAP Script über VBA beenden
16.08.2023 12:12:34
Nikki
Danke für eure Nachrichten.
Leider ist hier nicht die richtige Lösung bei. Es werden nach wie vor nur Makros ausgeführt wenn ich die Datei nochmal neu öffen.
AW: SAP Script über VBA beenden
16.08.2023 12:16:48
Der Steuerfuzzi
Da kein konkretes Feedback kommt, werte ich das als fehlende Bereitschaft zur Mitarbeit ... bin dann raus
;
Anzeige
Anzeige

Infobox / Tutorial

SAP Script über VBA beenden


Schritt-für-Schritt-Anleitung

  1. VBA-Umgebung einrichten: Öffne Excel und gehe zu Entwicklertools > Visual Basic (oder drücke ALT + F11).
  2. Neues Modul erstellen: Klicke im VBA-Editor mit der rechten Maustaste auf VBAProject (DeinWorkbook), wähle Einfügen > Modul.
  3. Code einfügen: Kopiere den Code aus dem Forum und füge ihn in das Modul ein.
  4. Variablen korrekt deklarieren: Stelle sicher, dass die Variablen wie sapGuiAuto, sapApplication, sapConnection und sapSession richtig deklariert sind. Verwende:
    Dim sapGuiAuto As Object
    Dim sapApplication As Object
    Dim sapConnection As Object
    Dim sapSession As Object
  5. Verbindung zu SAP schließen: Am Ende des Makros sollte der Code zum Schließen der SAP-Session hinzugefügt werden. Dies kann so aussehen:
    Set sapSession = Nothing
    Set sapConnection = Nothing
    Set sapApplication = Nothing
    Set sapGuiAuto = Nothing
  6. Makro ausführen: Schließe den VBA-Editor und führe das Makro über Entwicklertools > Makros aus.

Häufige Fehler und Lösungen

  • Fehler: Keine Reaktion auf weitere Makros
    Lösung: Stelle sicher, dass alle SAP-Objekte am Ende des Makros korrekt auf Nothing gesetzt werden, um die sap session beenden zu gewährleisten.

  • Fehler: Makro läuft zu lange
    Lösung: Überprüfe die Anzahl der Zeilen, die das Makro verarbeitet. Wenn lastrow sehr hoch ist, könnte das die Ausführung beeinträchtigen. Teile den Prozess in mehrere kleinere Makros auf.


Alternative Methoden

  • Verwendung von Batch-Skripten: Anstatt das SAP-Skript direkt über VBA auszuführen, kannst du ein Batch-Skript erstellen, das regelmäßig ausgeführt wird, um die Daten zu aktualisieren.

  • Direkte SAP-Integration: Prüfe, ob es Möglichkeiten gibt, SAP-Daten direkt in Excel zu importieren, ohne über VBA gehen zu müssen.


Praktische Beispiele

Hier ist ein Beispiel, wie du den Code anpassen kannst, um sicherzustellen, dass die Verbindung zu SAP richtig beendet wird:

Sub Vorgänge()
    ' ... (dein bestehender Code)

    ' Am Ende des Makros
    Myend:
    Set sapSession = Nothing
    Set sapConnection = Nothing
    Set sapApplication = Nothing
    Set sapGuiAuto = Nothing
End Sub

Durch das Setzen der Objekte auf Nothing wird die SAP-Session korrekt beendet.


Tipps für Profis

  • Error Handling implementieren: Füge Error-Handling in deinem Makro hinzu, um unerwartete Fehler zu erfassen. Das könnte so aussehen:

    On Error GoTo ErrorHandler
    ' Dein Code hier
    Exit Sub
    
    ErrorHandler:
    MsgBox "Ein Fehler ist aufgetreten: " & Err.Description
  • Optimierung der Performance: Um die Ausführungsgeschwindigkeit zu erhöhen, kannst du die Bildschirmaktualisierung während des Makros deaktivieren:

    Application.ScreenUpdating = False
    ' Dein Code hier
    Application.ScreenUpdating = True

FAQ: Häufige Fragen

1. Was ist der Vorteil von SAP VBA?
Mit SAP VBA kannst du automatisierte Skripte erstellen, um Daten zwischen SAP und Excel auszutauschen, was die Effizienz erheblich steigert.

2. Kann ich SAP-Skripte auch ohne VBA ausführen?
Ja, es gibt verschiedene Möglichkeiten, SAP-Daten in Excel zu importieren, z.B. über ODBC oder die SAP GUI.

3. Warum funktioniert mein Makro nicht mehr, nachdem ich es einmal ausgeführt habe?
Das liegt häufig daran, dass die SAP-Session offen bleibt. Achte darauf, die Session am Ende des Makros richtig zu schließen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige