Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1852to1856
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

SAP Zugriff, Meldung unterdrücken

SAP Zugriff, Meldung unterdrücken
09.11.2021 16:31:32
chocolino
Hallo zusammen,
ich greife via VBA auf SAP zu, um mir diverse Abzüge zu generieren.
Nun ist es so, dass SAP lange läd, wenn die Datensätze entsprechen lang sind. Dann wirf mir Excel die Fehlermeldung "Microsoft Excel wartet auf die Beendigung einer OLE-Aktion in einer anderen Anwendung." Die Meldung kann ich zwar manuell wegdrücken, wenn SAP fertig geladen hat und den Code läuft dann auch weiter, jedoch wollte ich die Meldung unterdrücken, um die Benutzerfreundlichkeit zu erhöhen. Das funktioniert auch, jedoch nur zum Teil. Den Fehler habe ich gefunden, er ergibt für mich aber keinen Sinn. Mein Code lautet wie folgt:
Sub DatenausSAP()
....
'SAP öffnen
Shell "C:\Program Files (x86)\SAP\FrontEnd\SAPgui\saplogon.exe", 4
Set WshShell = CreateObject("WScript.Shell")
Set SapGui = GetObject("SAPGUI")
Set Appl = SapGui.GetScriptingEngine
Set Connection = Appl.Openconnection("1. N20 - Production", True)
'SAP Anmeldedaten eingeben
login = MsgBox("Please log in to SAP, then confirm with 'OK'.", vbOKCancel, "SAP")
Set session = Connection.Children(0)
'Fehlermeldung unterdrücken (1)
Application.DisplayAlerts = False
'Daten in SAP eingeben und exportieren
.... (unwichtig)
Application.DisplayAlerts = True
'Datei speichern
dateiname = Year(Now) & Month(Now) & Day(Now) & "_Rückstellungen_SAPDatengrundlage"
ActiveWorkbook.SaveAs "Z:\Personalrückstellungen\Archiv\" & dateiname & ".xlsx"
-Bis hier hin passt alles. Dann geht mein Code in SAP und macht genau das selbe nochmal:
Application.DisplayAlerts = False
'SAP Zugriff, andere Auswertung
session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/btn[3]").press
session.findById("wnd[0]/usr/radPLSTAND").Select
session.findById("wnd[0]/usr/radPLSTAND").SetFocus
session.findById("wnd[0]/tbar[1]/btn[8]").press
'Fehlermeldung unterdrücken (2)
Application.DisplayAlerts = True
'speichern
dateiname = Year(Now) & Month(Now) & Day(Now) & "_Rückstellungen_SAPStandardliste"
(****)ActiveWorkbook.SaveAs ("Z:\Personalrückstellungen\Archiv\" & dateiname & ".xlsx")
- (****) Hier beim Speichern passiert dann der Fehler. Excel wirft einen Anwendungsfehler, als würde er den Ordner nicht mehr finden. Wenn ich die 'Fehlermeldung unterdrücken (2) auskommentiere, funktioniert alles wunderbar (allerdings wirft er dann wieder die nervige "Microsoft Excel wartet..." Meldung, die ich ja nicht haben will.
Ich kann mir leider nicht erklären, wieso er bei der zweiten Datei ein Problem hat. Hat vllt jemand anderes eine Idee?
Vielen Dank!!
LG Chocolino

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: SAP Zugriff, Meldung unterdrücken
09.11.2021 16:37:52
mumpel
Wenn ein VBA-Code läuft kannst Du nicht parallel weiterarbeiten.
AW: SAP Zugriff, Meldung unterdrücken
09.11.2021 17:12:41
Karl-Heinz
Hallo Chocolino,
wenn es Dir nur um das Wegklicken einer MsgBox geht (hier SAP), könnte ich Dir folgende Vorgehensweise vorschlagen:
Es wird ein Timer gesetzt, zweckmäßigerweise dort, wo dann evtl. die Msgbox generiert wird, der dann z.B. alle 50 ms in einer Prüfsub prüft, ob die Msgbox schon angezeigt wird. Dann wird ein Button geklickt, so als wenn Du es selbst getan hättest. Funktioniert in der Regel gut.
Was wird gebraucht dafür: Der Titeltext der Msgbox, die ID des Buttons und zur Sicherheit der Klassenname der MsgBox (geht auch ohne).
Den Caption-Text müsstest Du noch anpassen. Klassenname und ID sollten stimmen, kann ich aber ohne SAP nicht prüfen.
Kannst es ja mal ausprobieren.
Code:

[Cc][+][-]

Option Explicit Private Declare PtrSafe Function KillTimer Lib "user32" ( _ ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr) As Long Private Declare PtrSafe Function SetTimer Lib "user32" ( _ ByVal hWnd As LongPtr, ByVal nIDEvent As LongPtr, _ ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr Private Declare PtrSafe Function SendDlgItemMessageA Lib "user32" ( _ ByVal hDlg As LongPtr, ByVal nIDDlgItem As Long, _ ByVal wMsg As Long, ByVal wParam As LongPtr, _ ByVal lParam As LongPtr) As LongPtr Private Declare PtrSafe Function FindWindowA Lib "user32" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As LongPtr Dim hTimer As LongPtr Sub ClickOk() ' VBA-Code SAP On Error GoTo Fehler ' Zur Sicherheit... hTimer = SetTimer(0&, 0&, 50, AddressOf DlgClickProc) ' VBA-Code SAP, der die Msgbox generiert Fehler: KillTimer 0&, hTimer ' Timer zur Sicherheit abschalten ' VBA-Code SAP, nach der Msgbox End Sub Private Sub DlgClickProc() ' Klickt den OK-Button an Dim hDlg As LongPtr hDlg = FindWindowA("#32770", "SAP Meldung") ' MsgBoxanzeige abfangen If hDlg > 0 Then SendDlgItemMessageA hDlg, 2, &HF5, 0&, 0& ' 6=ja, 2=nein/OK KillTimer 0&, hTimer ' Timer abschalten End If End Sub

viele Grüße
Karl-Heinz

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige