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

Fehler 438

Forumthread: Fehler 438

Fehler 438
21.01.2025 20:55:23
xbelightx
Hallo zusammen,

ich bin ein absoluter VBA Neuling und versuche gerade einen Download aus SAP zu bauen und die Datei dann in eine andere Excel Tabelle einzufügen. So weit so gut...Dafür habe ich zwei Makros erstellt: 1. Marko führt den Download aus SAP durch und speichert die Datei auf meinem Laufwerk. Der 2. Makro kopiert die Daten und fügt sie dann in die andere Datei ein und schließt die erste Datei ( den SAP Download ). Funktioniert wunderbar.
Nun habe ich beide Makros untereinander zusammengefasst damit ich den Makro per Knopfdruck ausführen kann und nun kommt eine Fehlermeldung: Laufzeitfehler 438

Hier mein VBA Code:

1. Macro SAP Dowload

Sub testdownload()

Dim SapGuiAuto, Application, connection, session As Object

Set SapGuiAuto = GetObject("SAPGUI")
Set Application = SapGuiAuto.GetScriptingEngine
Set connection = Application.Children(0)
Set session = connection.Children(0)

session.findById("wnd[0]/tbar[0]/okcd").Text = "/nvl06f"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/tbar[1]/btn[17]").press
session.findById("wnd[1]/tbar[0]/btn[8]").press
session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").currentCellRow = 2
session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").selectedRows = "2"
session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").doubleClickCurrentCell
session.findById("wnd[0]/tbar[1]/btn[8]").press
session.findById("wnd[0]/tbar[1]/btn[18]").press
session.findById("wnd[0]/tbar[1]/btn[33]").press
session.findById("wnd[1]/usr/lbl[14,8]").SetFocus
session.findById("wnd[1]/usr/lbl[14,8]").caretPosition = 2
session.findById("wnd[1]").sendVKey 2
session.findById("wnd[0]/mbar/menu[0]/menu[5]/menu[1]").Select
session.findById("wnd[1]/usr/subSUB_CONFIGURATION:SAPLSALV_GUI_CUL_EXPORT_AS:0512/txtGS_EXPORT-FILE_NAME").Text = "XXX"
session.findById("wnd[1]/usr/subSUB_CONFIGURATION:SAPLSALV_GUI_CUL_EXPORT_AS:0512/txtGS_EXPORT-FILE_NAME").caretPosition = 7
session.findById("wnd[1]/tbar[0]/btn[20]").press
session.findById("wnd[1]/tbar[0]/btn[0]").press


End Sub

2. Macro Daten kopieren und einfügen

Sub DatenKopieren()

Dim offeneDatei As Workbook

Workbooks.Open "C:\temp\XXX.xlsx"

Set offeneDatei = ActiveWorkbook

'Wähle Datenbereich aus & kopieren
Range("A2:S2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy

'Kopiere Daten in aktive Workbook
'Wähle nächste freie Zelle in Spalte A
Windows("XXX.xlsm").Activate
Sheets("XXX").Select
Range("A3").Select

'Daten einfügen
ActiveSheet.Paste

'XXX schließen
Application.DisplayAlerts = False
Workbooks("XXX.xlsx").Close SaveChanges = False
Application.DisplayAlerts = True

End Sub

Der Debugger markiert mir folgende Zeile gelb und sagt: Laufzeitfehler 438
Application.DisplayAlerts = False

Er schließt die Datei am Ende nicht.

Klappt wunderbar, wenn ich die Makros einzeln ausführe... nur auf Knopfdruck nicht!

Habt Ihr eine Idee woran das liegt?

Vielen Dank vorab.
Anzeige

19
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Fehler 438
21.01.2025 21:10:35
Uduuh
Hallo,
da passt was nicht.
Du fügst Daten in Workbooks("XXX.xls") ein und schließ es ohne zu speichern? Was soll das?

'Klappt wunderbar' kann ich mir nicht vorstellen.

Gruß aus'm Pott
Udo
AW: Fehler 438
21.01.2025 21:21:32
xbelightx
Die Download Datei ( A ) vom SAP wird gespeichert ( wie gesagt, bin ein absoluter Neuling ).

Die Daten sollen in eine andere Datei ( B ) kopiert werden und da muss erstmal nichts gespeichert werden, weil ich dann dort weiter arbeiten muss.

Sobald die Daten aus Tabelle A in Tabelle B sind, soll Tabelle A automatisch geschlossen werden.

Wie geschrieben klappt das alles, wenn ich die 2 Makros nacheinander manuell ausführe, aber nicht wenn ich sie zusammenführe.
Anzeige
AW: Fehler 438
21.01.2025 21:24:37
Onur
Wie heisst denn die eine Datei und wie die Andere ? Bei dir steht doch überall nur "XXX".
Sind etwa selbst der Namen der Dateien "top secret" ?
AW: Fehler 438
21.01.2025 21:14:06
Onur
Wieso einmal xlsx und dann xlsm ?
AW: Fehler 438
21.01.2025 21:56:27
Ulf
Hi,
Application ist ein reserviertes Wort in VBA, durch Verwendung mit dem SAPGui ist es mehrdeutig. Die errsten drei Variablen sind noch dazu Variants.
Korrigiere ~


Dim sapGuiAuto as Object, sapApp as Object, sapCONN as Object, sapSession As Object
Set sapGuiAuto = GetObject("SAPGUI")
Set sapApplication = sapGuiAuto.GetScriptingEngine
Set sapConnection = sapApplication.Children(0)
Set sapSession = sapConnection.Children(0)

und ersetze die Aufrufe dito
dann sollte das laufen.
hth
Ulf
Anzeige
AW: Fehler 438
22.01.2025 13:29:47
Piet
Hallo

wenn du neu mit VBA angefangen hast, ist es sehr empfehlenswert Code einzeln zu entwickeln, und sie nacheinander aufrufen.
Bei sehr langen Codes wird es schnell unübersichtlich, da baut man sich schnell -eigene Fehler- ein. Die finden ist schwierig.
Bei kleinen Makros erkennst du sofort welches Makro einwandfrei läuft, du kannst jedes seperat starten, siehst das Ergebnis.

mfg Piet
Anzeige
das mit der Variablen...
21.01.2025 22:18:59
Uduuh
Hallo Ulf,
... hast du sehr schön gesehen.
Wenn er in TESTDOWNLOAD vor End Sub einfach Call DatenKopieren gesetzt hätte, wäre alles gut gewesen. Mit dem Button natürlich nur TESTDOWNLOAD aufrufen.

Gruß aus'm Pott
Udo
AW: das mit der Variablen...
21.01.2025 22:33:38
Ulf
Hi Udo,
schön(er) wärs wenn oben stünde


Set sapApp = sapGuiAuto.GetScriptingEngine

Wer von euch ohne...
Anzeige
AW: das mit der Variablen...
21.01.2025 23:13:17
xbelight
Hallo Ulf, Hallo Udo,

Erstmal vielen Dank für eure Rückmeldungen. Ich werde es gleich morgen früh ausprobieren.

Mir kam noch ein Gedanke, das ich die 2 Makros weiterhin getrennt lasse und über Sub StartMakro
Makro 1
Makro 2
End Sub
die Verbindung und Abfolge herstelle und so vielleicht den Fehler umgehen kann.

Ich habe leider noch keine Erfahrung in VBA ( habe erst am Wochenende angefangen und hangel mich gerade da durch ). Ulfs Antwort ist leider schon zu hoch für mich… aber ich probiere es morgen nochmal und komme nochmal auf euch zurück!

Vielen Dank und einen schönen Abend.
Anzeige
das geht auch. owT
21.01.2025 23:58:26
Uduuh
AW: das geht auch. owT
22.01.2025 19:32:58
xbelightx
Danke. Das Problem konnte ich teilweise mit dem Sub MakroStart lösen.
Der Debugger meldet sich nicht mehr und ich schließe die Datei nach dem die Makros durchgelaufen sind per Mausklick.

Habe nun eine andere Frage.. mache einen neuen Beitrag auf.
AW: Fehler 438
21.01.2025 21:25:49
xbelightx
Die Download Datei aus SAP ist eine XLSX Datei und die Daten sollen dann in eine XLSM Datei eingefügt werden.

Anzeige
AW: Fehler 438
21.01.2025 21:27:03
Onur
Und beide heissen "XXX" ???
AW: Fehler 438
21.01.2025 21:36:52
xbelightx
Ja, die Tabellen haben Namen. Da es um Tabellen aus dem SAP geht und eine weitere Arbeitsdatei, habe ich die Namen rausgekommen.

Ich kann den Code gerne nochmal mit Namen Tabelle A und B neu hochladen.
Glaube das die Namen der Tabellen aber nicht das Problem lösen.

Für sachdienliche Hinweise wäre ich sehr dankbar.
Anzeige
AW: Fehler 438
21.01.2025 21:40:04
Onur
"Glaube das die Namen der Tabellen aber nicht das Problem lösen. " ?
Stimmt, aber der "anonymisierte" Code bringt gar nix, da er so nicht lauffähig ist! Wenn schon, dann musst du Datei A in XXX und Datei B in YYY ändern.
Wie sollen wir einen Code analysieren, den es SO gar nicht gibt ?
AW: Fehler 438
21.01.2025 21:57:04
xbelightx
Ok, verstehe. Habe die Dateinamen nun mit Namen versehen.
Hier nochmal der Code:

Sub testdownload()

Dim SapGuiAuto, Application, connection, session As Object

Set SapGuiAuto = GetObject("SAPGUI")
Set Application = SapGuiAuto.GetScriptingEngine
Set connection = Application.Children(0)
Set session = connection.Children(0)

session.findById("wnd[0]/tbar[0]/okcd").Text = "/nvl06f"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/tbar[1]/btn[17]").press
session.findById("wnd[1]/tbar[0]/btn[8]").press
session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").currentCellRow = 2
session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").selectedRows = "2"
session.findById("wnd[1]/usr/cntlALV_CONTAINER_1/shellcont/shell").doubleClickCurrentCell
session.findById("wnd[0]/tbar[1]/btn[8]").press
session.findById("wnd[0]/tbar[1]/btn[18]").press
session.findById("wnd[0]/tbar[1]/btn[33]").press
session.findById("wnd[1]/usr/lbl[14,8]").SetFocus
session.findById("wnd[1]/usr/lbl[14,8]").caretPosition = 2
session.findById("wnd[1]").sendVKey 2
session.findById("wnd[0]/mbar/menu[0]/menu[5]/menu[1]").Select
session.findById("wnd[1]/usr/subSUB_CONFIGURATION:SAPLSALV_GUI_CUL_EXPORT_AS:0512/txtGS_EXPORT-FILE_NAME").Text = "Tabelle A"
session.findById("wnd[1]/usr/subSUB_CONFIGURATION:SAPLSALV_GUI_CUL_EXPORT_AS:0512/txtGS_EXPORT-FILE_NAME").caretPosition = 7
session.findById("wnd[1]/tbar[0]/btn[20]").press
session.findById("wnd[1]/tbar[0]/btn[0]").press

Dim offeneDatei As Workbook

Workbooks.Open "C:\temp\Tabelle A.xlsx"

Set offeneDatei = ActiveWorkbook

'Wähle Datenbereich aus & kopieren
Range("A2:S2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy

'Kopiere Daten in aktive Workbook
'Wähle nächste freie Zelle in Spalte A
Windows("Tabelle B.xlsm").Activate
Sheets("Tabelle 2").Select
Range("A3").Select

'Daten einfügen
ActiveSheet.Paste

'Tabelle A schließen
Application.DisplayAlerts = False
Workbooks("Tabelle A.xlsx").Close SaveChanges = False
Application.DisplayAlerts = True

End Sub

Der Fehler erscheint wenn die Tabelle A geschlossen werden soll.
Application.DisplayAlerts = False
Fehler: 438
Anzeige
AW: Fehler 438
21.01.2025 22:09:23
Onur
Dafür brauchst du doch kein Makro.
Öffne BEIDE Dateien und aktiviere B und daraus Tabelle2.
Klicke auf A3 und schreibe (ohne ENTER) ein "=".
Dann klicke auf DateiA und markiere A2:S2 und drücke auf ENTER.
Fertig! Jetzt kannst du DateiA wieder schliessen oder aber auch testen: Sobald du auf DateiA etwas in A2:S2 änderst, ändert sich auch die entsprechende Zelle in DateiB.
Anzeige
AW: Fehler 438
21.01.2025 22:25:05
xbelightx
Ich würde gerne, nachdem ich die Daten eingefügt habe, noch weitere Makros erstellen z.B. anhand der ausgegeben Daten diverse Wenn Dann Formeln ergänzen und das Ergebnis in eine extra Spalte ausgeben. Am Ende soll das alles auf Knopfdruck geschehen.. dadurch spare ich mir eine Menge Zeit.

Kannst du irgendwas zur Problemlösung beitragen? Wenn nicht, dann danke ich dir für deinen bisherigen Input!
Anzeige
AW: Fehler 438
21.01.2025 22:32:30
Onur
Soll das jetzt eine Antwort auf meinen letzten Post sein?
Hast du es denn überhaupt versucht, so wie ich es beschrieben habe?

Forumthreads zu verwandten Themen

Anzeige