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

Problem beim einfachen schließen via VBA

Forumthread: Problem beim einfachen schließen via VBA

Problem beim einfachen schließen via VBA
09.03.2022 09:36:46
marv
Hallo zusammen,
kämpfe jetzt seit zwei Tagen gegen ein Problem und komme allein nicht weiter. Brauche Hilfe.
Im Folgenden wird eine Datei " "bvtaeglichms.xlsx" erzeugt, diese soll kurz geöffnet werden um Daten rauszukopieren.
Anschließend soll die Datei geschlossen und gelöscht werden. Wobei nicht mal das schließen klappt.
Die Datei geht am Ende immer nochmal auf... Ich dreh noch durch, weiß nicht warum.
Wenn ich erst lösche meckert er das die Datei nicht mehr existieren würde und öffnet mir einfach eine neue Blanko Excel.
Das möchte ich alles nicht...
Einfach zu machen und löschen.

Option Explicit
Public SapGuiAuto, WScript, msgcol
Public objGui  As GuiApplication
Public objConn As GuiConnection
Public session As GuiSession
Public objSheet As Worksheet
Sub DatenHolen()
Set SapGuiAuto = GetObject("SAPGUI")
Set objGui = SapGuiAuto.GetScriptingEngine
Set objConn = objGui.Children(0)
Set session = objConn.Children(0)
Dim selectedBetrieb As String
Dim selectedDatum As String
Dim selectedPfad As String
selectedBetrieb = ThisWorkbook.Worksheets("BV").Range("N23").Value
selectedDatum = ThisWorkbook.Worksheets("BV").Range("N24").Value
selectedPfad = ThisWorkbook.Path
session.FindById("wnd[0]").Maximize
session.FindById("wnd[0]/tbar[0]/okcd").Text = "/nmb51"
session.FindById("wnd[0]").SendVKey 0
session.FindById("wnd[0]/tbar[1]/btn[17]").Press
session.FindById("wnd[1]/usr/txtV-LOW").Text = "BVTAEGLICHMS"
session.FindById("wnd[1]/usr/txtENAME-LOW").Text = ""
session.FindById("wnd[1]/usr/txtV-LOW").CaretPosition = 12
session.FindById("wnd[1]/tbar[0]/btn[8]").Press
session.FindById("wnd[0]/usr/ctxtWERKS-LOW").Text = selectedBetrieb
session.FindById("wnd[0]/usr/ctxtBUDAT-LOW").Text = selectedDatum
session.FindById("wnd[0]/usr/ctxtBUDAT-LOW").SetFocus
session.FindById("wnd[0]/usr/ctxtBUDAT-LOW").CaretPosition = 6
session.FindById("wnd[0]").SendVKey 0
session.FindById("wnd[0]/tbar[1]/btn[8]").Press
session.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell").SetCurrentCell 9, "MENGE"
session.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell").SelectedRows = "9"
session.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell").ContextMenu
session.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell").SelectContextMenuItem "&XXL"
session.FindById("wnd[1]/tbar[0]/btn[0]").Press
session.FindById("wnd[1]/usr/ctxtDY_PATH").Text = ThisWorkbook.Path
session.FindById("wnd[1]/usr/ctxtDY_FILENAME").Text = "bvtaeglichms.xlsx"
session.FindById("wnd[1]/usr/ctxtDY_FILENAME").CaretPosition = 17
session.FindById("wnd[1]/tbar[0]/btn[11]").Press
ThisWorkbook.Worksheets("BV").Range("A6:I9999").ClearContents
Dim ext_wb As Workbook
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set ext_wb = Workbooks.Open(ThisWorkbook.Path & "\bvtaeglichms.xlsx")
ext_wb.Sheets("Sheet1").Range("A1:I9999").Copy
ThisWorkbook.Sheets("BV").Range("A5").PasteSpecial
Application.DisplayAlerts = False
Application.ScreenUpdating = False
ext_wb.Close SaveChanges:=True
'Kill ThisWorkbook.Path & "\bvtaeglichms.xlsx"
End Sub
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Problem beim einfachen schließen via VBA
09.03.2022 10:38:30
UweD
Hallo
den oberen Teil kann ich nicht testen.
Der Rest ab "ThisWorkbook.Worksheets("BV").Range("A6:I9999").ClearContents"
klappt.
Auch das Löschen der Datei
Das "SaveChanges:=True" kannst du dir sparen, da die Datei ja danach sowieso gelöscht wird.
LG UweD
AW: Problem beim einfachen schließen via VBA
09.03.2022 10:51:54
marv
Wenn ich SaveChanges:=True auf False setze habe ich das selbe Problem.
Gibt es die Möglichkeit eine Zeitschleife zu bauen, sodass der close und kill befehl 10sek später ausgeführt wird als der copy&paste teil?
Anzeige
AW: Problem beim einfachen schließen via VBA
09.03.2022 10:55:50
UweD
Hi

Application.Wait (Now + TimeValue("0:00:10"))

AW: Problem beim einfachen schließen via VBA
09.03.2022 11:02:49
marv
Danke für den Tipp, leider bringt auch die Zeitschleife nichts....excel geht am ende trotzdem nochmal auf...
Workbooks.Close dieser befehl geht bei mir auch nicht? sollte aber gehen?
AW: Problem beim einfachen schließen via VBA
09.03.2022 17:34:54
onur
Wenn du etwas in SAP als Excel-Sheet exportierst, wird das Sheet erstellt und GEÖFFNET aber nicht gespeichert.
Wozu also nochmal versuchen, es zu öffnen ? Zumal es eigentlich auch nicht von SAP gespeichert wird, bis DU das machst.
Anzeige
AW: Problem beim einfachen schließen via VBA
09.03.2022 10:38:47
Pierre
Hallo Marv,

Ich dreh noch durch, weiß nicht warum.
Wahrscheinlich, weil es nicht klappt? ;-)
Spaß beiseite...
Du willst die Datei direkt wieder löschen? Warum dann SaveChanges = True?
Versuch mal mit False.
Weiß aber nicht, ob das schon reicht.
Gruß Pierre
Anzeige
;
Anzeige
Anzeige

Infobox / Tutorial

Problem beim Schließen einer Excel-Datei via VBA


Schritt-für-Schritt-Anleitung

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Ein neues Modul erstellen: Klicke mit der rechten Maustaste auf dein Projekt im Projekt-Explorer und wähle "Einfügen" > "Modul".

  3. Code einfügen: Kopiere den folgenden Code in das Modul:

    Option Explicit
    Public SapGuiAuto, WScript, msgcol
    Public objGui  As GuiApplication
    Public objConn As GuiConnection
    Public session As GuiSession
    Public objSheet As Worksheet
    
    Sub DatenHolen()
       Set SapGuiAuto = GetObject("SAPGUI")
       Set objGui = SapGuiAuto.GetScriptingEngine
       Set objConn = objGui.Children(0)
       Set session = objConn.Children(0)
    
       Dim selectedBetrieb As String
       Dim selectedDatum As String
       Dim selectedPfad As String
       selectedBetrieb = ThisWorkbook.Worksheets("BV").Range("N23").Value
       selectedDatum = ThisWorkbook.Worksheets("BV").Range("N24").Value
       selectedPfad = ThisWorkbook.Path
    
       session.FindById("wnd[0]").Maximize
       session.FindById("wnd[0]/tbar[0]/okcd").Text = "/nmb51"
       session.FindById("wnd[0]").SendVKey 0
       session.FindById("wnd[0]/tbar[1]/btn[17]").Press
       session.FindById("wnd[1]/usr/txtV-LOW").Text = "BVTAEGLICHMS"
       session.FindById("wnd[1]/usr/txtENAME-LOW").Text = ""
       session.FindById("wnd[1]/tbar[0]/btn[8]").Press
       session.FindById("wnd[0]/usr/ctxtWERKS-LOW").Text = selectedBetrieb
       session.FindById("wnd[0]/usr/ctxtBUDAT-LOW").Text = selectedDatum
       session.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell").SetCurrentCell 9, "MENGE"
       session.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell").SelectedRows = "9"
       session.FindById("wnd[0]/usr/cntlGRID1/shellcont/shell").SelectContextMenuItem "&XXL"
       session.FindById("wnd[1]/usr/ctxtDY_PATH").Text = ThisWorkbook.Path
       session.FindById("wnd[1]/usr/ctxtDY_FILENAME").Text = "bvtaeglichms.xlsx"
       session.FindById("wnd[1]/tbar[0]/btn[11]").Press
    
       ThisWorkbook.Worksheets("BV").Range("A6:I9999").ClearContents
    
       Dim ext_wb As Workbook
       Application.DisplayAlerts = False
       Set ext_wb = Workbooks.Open(ThisWorkbook.Path & "\bvtaeglichms.xlsx")
       ext_wb.Sheets("Sheet1").Range("A1:I9999").Copy
       ThisWorkbook.Sheets("BV").Range("A5").PasteSpecial
    
       Application.Wait (Now + TimeValue("0:00:10")) ' Warte 10 Sekunden
       ext_wb.Close SaveChanges:=False
       Kill ThisWorkbook.Path & "\bvtaeglichms.xlsx"
    End Sub
  4. Anpassungen vornehmen: Stelle sicher, dass die Pfade und Zellreferenzen in deinem Code korrekt sind.

  5. Makro ausführen: Schließe den VBA-Editor und führe das Makro aus.


Häufige Fehler und Lösungen

  • Excel öffnet die Datei erneut: Wenn Excel die Datei nach dem Schließen erneut öffnet, könnte dies an der Verwendung von SaveChanges:=True liegen. Setze diesen Wert auf False, um die Datei nicht zu speichern, bevor du sie schließt.
  • Datei lässt sich nicht löschen: Stelle sicher, dass die Datei nicht mehr geöffnet ist, bevor du den Kill-Befehl ausführst. Eine kurze Wartezeit (z.B. 10 Sekunden) kann hier helfen.

Alternative Methoden

  1. Application.Wait: Verwende Application.Wait, um eine Pause einzufügen, bevor du den Schließ- und Löschbefehl aufrufst.

    Application.Wait (Now + TimeValue("0:00:10"))
  2. Sleep-Funktion: Eine andere Möglichkeit, eine Wartezeit einzufügen, ist die Verwendung der Sleep-Funktion aus der kernel32-Bibliothek.


Praktische Beispiele

Hier ist ein Beispiel, wie du den session.findbyid Befehl verwenden kannst, um bestimmte SAP-Funktionen anzusprechen und Daten zu extrahieren. Achte darauf, dass du den richtigen Pfad und die richtigen IDs nutzt.

session.FindById("wnd[0]/tbar[0]/okcd").Text = "/nmb51"

Tipps für Profis

  • Debugging: Verwende das Debug.Print-Statement, um Werte während der Ausführung zu überwachen.
  • Fehlermeldungen abfangen: Setze einen On Error Resume Next-Befehl, um Fehler abzufangen und weiterzuarbeiten, falls nötig.
  • VBA-Referenzen: Stelle sicher, dass du alle notwendigen Verweise im VBA-Editor gesetzt hast, um mit SAP-Scripting zu arbeiten.

FAQ: Häufige Fragen

1. Warum öffnet Excel die Datei nach dem Schließen erneut? Das kann passieren, wenn SaveChanges:=True verwendet wird. Setze es auf False, um dies zu verhindern.

2. Wie kann ich eine Wartezeit in mein Makro einfügen? Du kannst Application.Wait oder die Sleep-Funktion verwenden, um eine Verzögerung zu implementieren.

3. Was sind die häufigsten Fehler beim Arbeiten mit VBA und SAP? Häufige Fehler sind falsche ID-Verweise oder das Vergessen, die Datei vor dem Löschen zu schließen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige