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

Forumthread: Verbindung mit SAP

Verbindung mit SAP
Fettertiger
Hallo liebe Experten,
das untenstehende Makro treibt mich noch zur Verzweiflung. Mit dem Makro starte ich über einen SAP shortcut eine SAP session, mache ein paar Transaktionen und schliesse per SAP Befehle auch SAP wieder.
Das Makro funzt soweit auch einwandfrei, ausser wenn ich es zum zweiten Mal aufrufe. Dann bekomme ich in dieser Zeile einen Runtimeerror 91: wscript.ConnectObject Session, "on" .
Hat jemand eine Idee wie man das lösen kann?
Dim SapApplication, SapGuiAuto, Connection, Session, wscript As Object
Dim lastrow As Double
Public System As String
Sub SAP_prepare_sapscript()
Application.EnableCancelKey = xlDisabled
If Left(tbL_Set.Range("c3").Value, 1) = "%" Then
PathStrg = Environ(Mid(tbL_Set.Range("c3").Value, 2, InStr(2, tbL_Set.Range("c3").Value, _
"%", 0) - 2))
Else:
PathStrg = tbL_Set.Range("c3").Value
End If
If Right(PathStrg, 1)  "\" Then PathStrg = PathStrg & "\"
On Error Resume Next
Shell (tbL_Set.Range("c4").Value & "sapshcut.exe " & PathStrg & System & ".sap")
If Wait_for_Window("SAP Easy Access") = False Then GoTo giveUp 'Separates Makro das wartet  _
bis SAP geöffnet ist
On Error GoTo 0
If Not IsObject(SapApplication) Then
On Error Resume Next
Set SapGuiAuto = GetObject("SAPGUI")
If Err.Number  0 Then
MsgBox ("Not able to log in")
NoSap = True
Err.Clear
GoTo giveUp
End If
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
Err.Clear
'Set up connection to the Excel data to be keyed into SAP:
Session.findById("wnd[0]").maximize
Set objExcel = GetObject(, "Excel.Application")
Set objSheet = objExcel.ActiveWorkbook.ActiveSheet
run_Sap_Script
Application.ScreenUpdating = False
If Err.Number  0 Then
If Err.Number  91 Then
If Err.Number  9 Then
MsgBox ("There was an error running the Script")
Sapok = False
Err.Clear
GoTo giveUp
End If
End If
Err.Clear
End If
giveUp:
Application.WindowState = xlMaximized
End Sub

Sub run_Sap_Script()
'mach ganz viel tolle Sachen in SAP
'log back off out of SAP
Session.findById("wnd[0]/tbar[0]/btn[15]").press
Session.findById("wnd[1]/usr/btnSPOP-OPTION1").press
Err.Clear
End Sub

Auf jeden Fall schon mal vielen Dank im Voraus
Grüße
Theo
Anzeige

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Verbindung mit SAP
22.07.2011 12:40:07
Hajo_Zi
Hallo Theo,
vieleicht löst sich das Problem, wenn D mit Set gesetzteVariablen am Ende auf Nothing setzt?

AW: Verbindung mit SAP
25.07.2011 17:47:53
Fettertiger
Hallo Hajo,
hat leider nix genützt. Um den Fehler weg zu bekommen muss ich weiterhin Excel beenden und die Datei neu öffnen. Danach läuft es wieder einmal fehlerfrei. Ich habe irgendwas auf Google gefunden vonwegen Globaler Variable, aber mir war das leider mindestens 5 Nummern zu hoch :-(.
Gruss
Theo
Anzeige
AW: Verbindung mit SAP
25.07.2011 19:37:48
fcs
Hallo Theo,
ich tippe mal, dass deine Makros die Connection/Session-Objekte nicht sauber wieder schliessen bzw. beenden. Bei dem 2. Versuch die gleichen Verbindungen/Sessions nochmals anzulegen weigert sich Excel/SAP.
Mit

If IsObject(wscript) Then
wscript.ConnectObject Session, "on"
wscript.ConnectObject Application, "on"
End If
Werden die Datenverbindungen/Sessions scheinbar aktiviert.
Ich denke, es braucht irgendwo auch ein
      If IsObject(wscript) Then
wscript.ConnectObject Session, "off"
wscript.ConnectObject Application, "off"
End If
Bevor das Makro bendet wird, möglicher Weise bevor SAP wieder geschlossen wird. Ansonsten hängt die Datenverbindung noch irgendwo verweist in Excel rum.
Eine optimale Position im Code für das Setzen auf "off"kann ich dir leider nicht vorschlagen. Dafür kenne ich mich im Zusammenspiel von Excel/SAP nicht aus.
Gruß
Franz
Anzeige
AW: Verbindung mit SAP
29.07.2011 14:25:47
Fettertiger
Hallo Franz,
das hat leider auch nix genützt.
Schade
Gruss
Theo
;
Anzeige
Anzeige

Infobox / Tutorial

Verbindung mit SAP in Excel


Schritt-für-Schritt-Anleitung

  1. Makro erstellen: Öffne Excel und drücke ALT + F11, um den VBA-Editor zu starten. Erstelle ein neues Modul und füge den folgenden Code ein:

    Sub SAP_prepare_sapscript()
       Application.EnableCancelKey = xlDisabled
       ' Pfad und Systemname festlegen
       ...
       ' Verbindung zu SAP herstellen
       ...
       ' Skript ausführen
       run_Sap_Script
       Application.ScreenUpdating = False
       ...
    End Sub
  2. Variablen setzen: Stelle sicher, dass alle Variablen wie SapApplication, Connection, und Session korrekt deklariert und gesetzt sind.

  3. Fehlerbehandlung: Integriere eine Fehlerbehandlung, um Runtime-Fehler zu vermeiden, insbesondere wenn das Makro mehrmals ausgeführt wird.

  4. Datenverbindung beenden: Füge am Ende des Makros die Zeilen hinzu, um die Verbindungen zu schließen:

    If IsObject(wscript) Then
       wscript.ConnectObject Session, "off"
       wscript.ConnectObject Application, "off"
    End If
  5. Makro testen: Führe das Makro aus und überprüfe, ob die Verbindung zu SAP erfolgreich hergestellt wird.


Häufige Fehler und Lösungen

  • Runtime-Fehler 91: Dieser Fehler tritt häufig auf, wenn die Session- oder Connection-Objekte nicht korrekt zurückgesetzt werden. Stelle sicher, dass Du die Objekte am Ende des Makros auf Nothing setzt.

  • Verbindung bleibt bestehen: Wenn Du das Makro mehrmals ausführst, kann es sein, dass die Verbindung zu SAP nicht richtig geschlossen wird. Nutze die ConnectObject-Methode mit "off".


Alternative Methoden

  • Globaler Variablen: Wenn Du Schwierigkeiten hast, die Verbindungen zu schließen, könnte das Arbeiten mit globalen Variablen helfen. Achte jedoch darauf, diese am Ende des Programms auf Nothing zu setzen, um Speicherlecks zu vermeiden.

  • Fehlerprotokollierung: Implementiere eine einfache Protokollierung für Fehler, die während der Ausführung des Makros auftreten. Dies kann Dir helfen, Probleme schneller zu erkennen.


Praktische Beispiele

Hier ist ein einfaches Beispiel, wie Du das Makro gestalten kannst, um eine Verbindung zu SAP herzustellen und Daten zu übertragen:

Sub run_Sap_Script()
    ' Verbindung zu SAP herstellen und Daten eingeben
    Session.findById("wnd[0]").maximize
    Session.findById("wnd[0]/usr/btnSPOP-OPTION1").press
    ' Skriptbefehle hier einfügen
    ...
    ' Abmeldung aus SAP
    Session.findById("wnd[0]/tbar[0]/btn[15]").press
End Sub

Tipps für Profis

  • Verwende On Error: Setze On Error Resume Next und überprüfe anschließend den Fehlerstatus, um Probleme zu identifizieren und zu beheben.

  • Debugging: Nutze den Debugger im VBA-Editor, um Schritt für Schritt durch den Code zu gehen. Dies kann helfen, die genaue Stelle zu finden, an der der Fehler auftritt.

  • Dokumentation: Halte Deine Makros gut dokumentiert, um später Änderungen einfacher vornehmen zu können.


FAQ: Häufige Fragen

1. Was mache ich, wenn die Verbindung zu SAP nicht hergestellt werden kann? Überprüfe, ob SAP korrekt installiert ist und ob Du die richtigen Berechtigungen hast, die Verbindung herzustellen.

2. Wie kann ich die Ausführungsgeschwindigkeit meines Makros erhöhen? Reduziere die Anzahl der Bildschirmaktualisierungen während der Ausführung, indem Du Application.ScreenUpdating = False verwendest und setze es am Ende wieder auf True.

3. Was ist der beste Weg, um Fehler zu protokollieren? Du kannst eine einfache Textdatei erstellen, in der Fehler protokolliert werden, oder die Debug.Print-Anweisung verwenden, um Fehler in der Immediate-Fenster des VBA-Editors anzuzeigen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige