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

Excel Sessions bleiben nach Abspielen von Makros offen?

Forumthread: Excel Sessions bleiben nach Abspielen von Makros offen?

Excel Sessions bleiben nach Abspielen von Makros offen?
19.02.2025 13:22:05
Chris
Hallo Zusammen,

mir ist aufgefallen, dass nach Abspielen von Makros, wo ich aus SAP Daten exportiere und in meine Datei kopiere, leere Sessions offen bleiben (trotz Schließen und Löschen der Export-Dateien; das sieht man, wenn man ALT+Tab Tasten drückt:

Userbild

Ich weiß natürlich nicht, ob das was macht und folglich Probleme bereitet - aber kann man das irgendwie verhindern bzw. mit VBA schließen?

Bitte um eure Hilfe, Danke!

Lg,

Chris
Anzeige

23
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
19.02.2025 13:28:33
Onur
DAS wird an deinen Makros liegen.
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
19.02.2025 13:41:39
Chris
ok, wäre super wenn ihr auf den Code mal einen Blick werfen könntet:

Sub Org()

Dim WS1 As Worksheet, WS2 As Worksheet
Dim letzteZeile As Long
Dim tempWorkbook As Workbook
Dim SapGuiAuto As Object, Appl As Object, Connection As Object, session As Object

Set WS1 = ActiveWorkbook.Worksheets("Daten")

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayAlerts = False

WS1.Visible = True

If WS1.Cells(Range("Beginn").Row + 1, Range("Beginn").Column) > "" Then
With WS1
.Activate
' AutoFilter zurücksetzen, falls aktiv
If .AutoFilterMode Then
If .FilterMode Then
.AutoFilter.Sort.SortFields.Clear
.ShowAllData
End If
End If
' Letzte Zeile bestimmen und Inhalte löschen
letzteZeile = .Cells(.Rows.Count, 1).End(xlUp).Row
.Range(.Cells(Range("Beginn").Row + 1, Range("Beginn").Column), _
.Cells(letzteZeile, Range("Ende").Column)).EntireRow.Delete
End With
End If


On Error Resume Next
Set SapGuiAuto = GetObject("SAPGUI")
Set Appl = SapGuiAuto.GetScriptingEngine
Set Connection = Appl.Children(0)
Set session = Connection.Children(0)
On Error GoTo 0

If session Is Nothing Then
MsgBox "SAP-Session konnte nicht gefunden werden!", vbCritical
GoTo Cleanup
End If

With session
.findById("wnd[0]").maximize
.findById("wnd[0]/tbar[0]/okcd").text = "ZQUERY_DATEN"
.findById("wnd[0]").sendVKey 0
.findById("wnd[0]").sendVKey 2
.findById("wnd[1]/usr/cntlOPTION_CONTAINER/shellcont/shell").setCurrentCell 5, "TEXT"
.findById("wnd[1]/usr/cntlOPTION_CONTAINER/shellcont/shell").selectedRows = "5"
.findById("wnd[1]/usr/cntlOPTION_CONTAINER/shellcont/shell").doubleClickCurrentCell
.findById("wnd[0]/tbar[1]/btn[8]").press

' Export als Excel-Datei
.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").pressToolbarContextButton "&MB_EXPORT"
.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").selectContextMenuItem "&XXL"
.findById("wnd[1]/usr/cmbG_LISTBOX").SetFocus
.findById("wnd[1]/usr/cmbG_LISTBOX").Key = "31"
.findById("wnd[1]/tbar[0]/btn[0]").press
.findById("wnd[1]/usr/ctxtDY_PATH").text = "D:\"
.findById("wnd[1]/usr/ctxtDY_FILENAME").text = "temp.xlsx"
.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 9
.findById("wnd[1]/tbar[0]/btn[11]").press
.findById("wnd[0]/tbar[0]/btn[15]").press
.findById("wnd[0]/tbar[0]/btn[15]").press
End With


Set tempWorkbook = Workbooks.Open(Filename:="D:\temp.xlsx")
Set WS2 = tempWorkbook.Worksheets("Sheet1")

With WS2
.Activate
.Range("A2", .Cells(.Rows.Count, .Columns.Count).End(xlUp)).Copy
End With

With WS1
.Activate
.Cells(Range("Org_Beginn").Row + 1, Range("Org_Beginn").Column).PasteSpecial Paste:=xlPasteValues
.Cells.EntireColumn.AutoFit
End With

Application.CutCopyMode = False

tempWorkbook.Close False
Kill "D:\temp.xlsx"

Cleanup:
Set WS1 = Nothing
Set WS2 = Nothing
Set tempWorkbook = Nothing
Set SapGuiAuto = Nothing
Set Appl = Nothing
Set Connection = Nothing
Set session = Nothing


Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.DisplayAlerts = True
End Sub


Danke vorab fürs Checken!

Lg,
Chris
Anzeige
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
19.02.2025 14:24:33
Onur
Du musst noch ein Application.Quit nach dem Close einbauen...
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
20.02.2025 10:14:13
Ulf
Hi,
have it a try
Option Explicit


Sub Org()
Dim WS1 As Worksheet, WS2 As Worksheet
Dim letzteZeile As Long
Dim tempWorkbook As Workbook
Dim SapGuiAuto As Object, Appl As Object, Connection As Object, Session As Object
Set WS1 = ActiveWorkbook.Worksheets("Daten")
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayAlerts = False
WS1.Visible = True
If WS1.Cells(Range("Beginn").Row + 1, Range("Beginn").Column) > "" Then
With WS1
.Activate
' AutoFilter zurücksetzen, falls aktiv
If .AutoFilterMode Then
If .FilterMode Then
.AutoFilter.Sort.SortFields.Clear
.ShowAllData
End If
End If
' Letzte Zeile bestimmen und Inhalte löschen
letzteZeile = .Cells(.Rows.Count, 1).End(xlUp).Row
.Range(.Cells(Range("Beginn").Row + 1, Range("Beginn").Column), .Cells(letzteZeile, Range("Ende").Column)).EntireRow.Delete
End With
End If
On Error Resume Next
'Evtl. separate Instanz nutzen ?
Rem Create the GuiApplication object
'Set Application = CreateObject("Sapgui.ScriptingCtrl.1")
Rem Open a connection in synchronous mode
'Set Connection = Application.OpenConnection("U9C [PUBLIC]", True)
'Set Session = Connection.Children(0)
Set SapGuiAuto = GetObject("SAPGUI")
Set Appl = SapGuiAuto.GetScriptingEngine
Set Connection = Appl.Children(0)
Set Session = Connection.Children(0)
On Error GoTo 0
If Session Is Nothing Then
MsgBox "SAP-Session konnte nicht gefunden werden!", vbCritical
GoTo Cleanup
End If
With Session
.findById("wnd[0]").maximize
.findById("wnd[0]/tbar[0]/okcd").Text = "ZQUERY_DATEN"
.findById("wnd[0]").sendVKey 0
.findById("wnd[0]").sendVKey 2
.findById("wnd[1]/usr/cntlOPTION_CONTAINER/shellcont/shell").setCurrentCell 5, "TEXT"
.findById("wnd[1]/usr/cntlOPTION_CONTAINER/shellcont/shell").selectedRows = "5"
.findById("wnd[1]/usr/cntlOPTION_CONTAINER/shellcont/shell").doubleClickCurrentCell
.findById("wnd[0]/tbar[1]/btn[8]").press
' Export als Excel-Datei
.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").pressToolbarContextButton "&MB_EXPORT"
.findById("wnd[0]/usr/cntlCONTAINER/shellcont/shell").selectContextMenuItem "&XXL"
.findById("wnd[1]/usr/cmbG_LISTBOX").SetFocus
.findById("wnd[1]/usr/cmbG_LISTBOX").Key = "31"
.findById("wnd[1]/tbar[0]/btn[0]").press
.findById("wnd[1]/usr/ctxtDY_PATH").Text = "D:\"
.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = "temp.xlsx"
.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 9
.findById("wnd[1]/tbar[0]/btn[11]").press
.findById("wnd[0]/tbar[0]/btn[15]").press
.findById("wnd[0]/tbar[0]/btn[15]").press
End With
Set Session = Nothing
Connection.CloseSession ("ses[0]")
Rem Wait a bit for the connection to be closed completely
Application.Wait (Now + TimeValue("0:00:10"))
Set Connection = Nothing
Set Appl = Nothing
Application.Wait (Now + TimeValue("0:00:10"))
Set SapGuiAuto = Nothing
Set tempWorkbook = Workbooks.Open(Filename:="D:\temp.xlsx")
Set WS2 = tempWorkbook.Worksheets("Sheet1")
With WS2
.Activate
.Range("A2", .Cells(.Rows.Count, .Columns.Count).End(xlUp)).Copy
End With
With WS1
.Activate
.Cells(Range("Org_Beginn").Row + 1, Range("Org_Beginn").Column).PasteSpecial Paste:=xlPasteValues
.Cells.EntireColumn.AutoFit
End With
Application.CutCopyMode = False
tempWorkbook.Close False
Kill "D:\temp.xlsx"
Cleanup:
Set Session = Nothing
Set Connection = Nothing
Set Appl = Nothing
Set SapGuiAuto = Nothing
Set WS1 = Nothing
Set WS2 = Nothing
Set tempWorkbook = Nothing
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.DisplayAlerts = True
End Sub

hth
Ulf
Anzeige
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
20.02.2025 14:22:46
Chris
Hi Ulf,

danke für deinen Vorschlag, was ich witzig finde ist, dass die Daten aktualisiert werden, ich aber am Schluss die Meldung bekomme, dass File nicht gefunden werden kann - Daten sind aber aktualsiert, aber in D:\ fehlt das File und der Befehl Kill "D:\temp.xlsx" funktioniert nicht mehr.

Vielleicht muss ich auch anders fragen - an alle die SAP scripting verwenden - wie geht ihr damit um, dass das exportierte Excel von SAP autom. geöffnet wird???

Danke

Lg,

Chris
Anzeige
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
19.02.2025 15:02:05
Chris
Aber mit Application.Quit würde ja Excel und somit alles komplett geschlossen werden (ich bekomme jetzt die Meldung ob ich noch speichern möchte) - das will ich ja nicht - die Datei, wohin ich die Daten kopiert habe, soll ja offen bleiben.
Für mich sieht das aus, als bleiben hier eigene Sessions offen und die möchte ich schließen...

Andere Idee?
Anzeige
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
19.02.2025 15:58:38
Onur
SAP-GUI macht die Datei, soweit ich weiss, immer in einer neuen Excel-Instanz auf.
Du wirst wohl nicht drumherum kommen, 2 Excelmappen zu machen, eine die die Daten aus SAP zieht (und sich dann schliesst) und eine, die diese Daten importiert/öffnet und bearbeitet.
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
19.02.2025 16:58:01
volti
Hallo Chris,

wenn es hier, wie zu vermuten ist, verschiedene Excel-Instanzen sind, sollte man diese auch alle durchgehen und die nicht gewünschten Dateien und Instanzen schließen.
Hier in meiner Bastelkiste ist ein VBA-Programm, das ich mal erstellt hatte, um eine offene Datei in allen Instanzen zu suchen. Das kann man sicher leicht umbauen (Sub SucheOffeneExcelmappe), um außer der gewünschten Datei alles zu schließen.

Hier erst mal eine Anregung dazu. Ist viel Code, aber wenn man es öfter braucht und man es nicht selbst erfinden muss, geht es m.E..

Code:


Private Declare PtrSafe Function GetClassNameA Lib "user32" ( _ ByVal hWnd As LongPtr, ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Private Declare PtrSafe Function EnumWindows Lib "user32" ( _ ByVal lpEnumFunc As LongPtr, ByVal lParam As LongPtr) As Long Private Declare PtrSafe Function EnumChildWindows Lib "user32" ( _ ByVal hWndParent As LongPtr, ByVal lpEnumFunc As LongPtr, _ ByVal lParam As LongPtr) As Long Private Declare PtrSafe Sub IIDFromString Lib "ole32.dll" ( _ ByVal lpsz As String, ByRef lpiid As GUID) Private Declare PtrSafe Sub AccessibleObjectFromWindow Lib "oleacc.dll" ( _ ByVal hWnd As LongPtr, ByVal dwId As Long, _ ByRef riid As GUID, ByRef ppvObject As Any) Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type Private Const IID_EXCELWINDOW = "{00020893-0000-0000-C000-000000000046}" Private Const OBJID_NATIVEOM = &HFFFFFFF0 Private hWndChild() As LongPtr, iChildCount As Long Private hWwndMain() As LongPtr, iWindowCount As Long Private sAllHandles As String Private Function GetApplications() As Application() Dim i As Long, iCount As Long Dim udtGuid As GUID, oWin As Window Dim oTmpApplications() As Application ' Variablen zurücksetzen Erase hWndChild: iChildCount = 0 Erase hWwndMain: iWindowCount = 0 ' Konvertiere die IID des Excel-Window-Objektes in die GUID-Struktur Call IIDFromString(StrConv(IID_EXCELWINDOW, vbUnicode), udtGuid) ' Alle geladenen Eltern-Fenster ermitteln Call EnumWindows(AddressOf EnumWindowProc, ByVal 0&) ' Alle gefundenen Eltern-Excelfenster durchgehen For i = LBound(hWwndMain) To UBound(hWwndMain) ' Alle Kinder-Fenster der gefundenen Elternfenster ermitteln Call EnumChildWindows(hWwndMain(i), _ AddressOf EnumChildWindowProc, ByVal 0&) Next i ' Alle Kinder-Fenster durchgehen sAllHandles = "," For i = LBound(hWndChild) To UBound(hWndChild) ' Hole über die Zugriffsnummer das entsprechende Window-Objekt Call AccessibleObjectFromWindow(hWndChild(i), _ OBJID_NATIVEOM, udtGuid, oWin) ' Verweis setzen auf Application-Objekt If Not oWin Is Nothing Then If InStr(sAllHandles, "," & CStr(oWin.Application.hWnd) & ",") = 0 Then ReDim Preserve oTmpApplications(iCount) Set oTmpApplications(iCount) = oWin.Application iCount = iCount + 1 sAllHandles = sAllHandles & CStr(oWin.Application.hWnd) & "," End If End If Next i ' Array über die Functon zurückgeben GetApplications = oTmpApplications End Function Private Function EnumWindowProc(ByVal hWnd As LongPtr, ByVal lParam As Long) As Long 'Durchlaufe alle Fenster und merke Excelfenster Dim sClassname As String * 256 If Left$(sClassname, GetClassNameA(hWnd, sClassname, Len(sClassname))) _ = "XLMAIN" Then 'Ist es ein Excelfenster? ReDim Preserve hWwndMain(iWindowCount) 'Array dimensionieren hWwndMain(iWindowCount) = hWnd 'Fenster-Handle merken iWindowCount = iWindowCount + 1 'Weiterzählen End If EnumWindowProc = 1 End Function Private Function EnumChildWindowProc(ByVal hWnd As LongPtr, ByVal lParam As Long) As Long 'Durchlaufe alle Kinder-Fenster und merke Excelfenster Dim sClassname As String * 256 If Left$(sClassname, GetClassNameA(hWnd, sClassname, Len(sClassname))) _ = "EXCEL7" Then ReDim Preserve hWndChild(iChildCount) 'Array dimensionieren hWndChild(iChildCount) = hWnd 'Fenster-Handle merken iChildCount = iChildCount + 1 'Weiterzählen EnumChildWindowProc = 0 Else EnumChildWindowProc = 1 End If End Function Sub SucheOffeneExcelmappe() Dim oApplications() As Application, WkB As Workbook Dim i As Long Dim sSuch As String sSuch = "Excel-Instanzen.xlsb" oApplications = GetApplications For i = LBound(oApplications) To UBound(oApplications) For Each WkB In oApplications(i).Workbooks If WkB.Name Like sSuch Then 'Mach was..... MsgBox "Workbook " & WkB.Name & " wurde gefunden!", vbInformation, "Excel-Instanzen" ' WkB.Close SaveChanges:=True 'Workbook schließen ' oApplications(i).Quit 'Diese Excel-Instanz beenden Exit Sub End If Next WkB Next i End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz
Anzeige
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
19.02.2025 17:31:23
Chris
Hallo Karl-Heinz,

vielen Dank für den Code der auch funktioniert, sobald die Datei von SAP geöffnet wurde - leider ist das Öffnen zeitverzögert und braucht einmal länger und etwas kürzer - kann man auch noch via einer Schleife solange prüfen und warten bis die Datei, deren Instanz geschlossen werden soll, geöffnet ist?

Danke!

Lg,

Chris
Anzeige
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
19.02.2025 18:31:27
Volti
Könnte man mit z B. APPLIKATION.ONTIME in einer Schleife machen...
Aber warum nicht gezielt nach Abschluss aller Arbeiten z B. per Button oder sonst einem Trigger starten.

Gruß KH
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
19.02.2025 20:56:07
volti
Hallo,

ich habe mich noch an einer deutlich kürzeren Version versucht. Die andere war schon alt.
Konnte ich für mehrere Instanzen aber nicht testen.

Kannst Du ja auch mal testen, wenn Zeit und Lust.:-)


Code:


Private Declare PtrSafe Function GetClassNameA Lib "user32" ( _ ByVal hWnd As LongPtr, ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Private Declare PtrSafe Function EnumWindows Lib "user32" ( _ ByVal lpEnumFunc As LongPtr, ByVal lParam As LongPtr) As Long Private Declare PtrSafe Function EnumChildWindows Lib "user32" ( _ ByVal hWndParent As LongPtr, ByVal lpEnumFunc As LongPtr, _ ByVal lParam As LongPtr) As Long Private Declare PtrSafe Sub IIDFromString Lib "ole32.dll" ( _ ByVal lpsz As String, ByRef lpiid As GUID) Private Declare PtrSafe Sub AccessibleObjectFromWindow Lib "oleacc.dll" ( _ ByVal hWnd As LongPtr, ByVal dwId As Long, _ ByRef riid As GUID, ByRef ppvObject As Any) Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type Private mtGuid As GUID Private Const IID_EXCELWINDOW = "{00020893-0000-0000-C000-000000000046}" Private Const OBJID_NATIVEOM = &HFFFFFFF0 Private miAnz As Long Private msAllHandles As String Private moTmpApplications() As Application Function GetApplications() As Application() ' Alle Kinder-Fenster über die geladenen Eltern-Fenster ermitteln miAnz = 0:: msAllHandles = "," Erase moTmpApplications ' Array zurücksetzen ' Konvertiere die IID des Excel-Window-Objektes in die GUID-Struktur Call IIDFromString(StrConv(IID_EXCELWINDOW, vbUnicode), mtGuid) Call EnumWindows(AddressOf EnumAppsProc, ByVal 0&) GetApplications = moTmpApplications ' Array zurückgeben End Function Private Function EnumAppsProc(ByVal hWnd As LongPtr, ByVal lParam As Long) As Long ' Durchlaufe alle Eltern-Fenster Dim sClassname As String * 256 If Left$(sClassname, GetClassNameA(hWnd, sClassname, 256)) = "XLMAIN" Then EnumChildWindows hWnd, AddressOf EnumXlsProc, ByVal 0& End If EnumAppsProc = 1 ' Nächster Aufruf End Function Private Function EnumXlsProc(ByVal hWnd As LongPtr, ByVal lParam As Long) As Long ' Durchlaufe alle Kinder-Fenster bis EXCEL7 gefunden Dim oWin As Window Dim sClassname As String * 256 If Left$(sClassname, GetClassNameA(hWnd, sClassname, 256)) = "EXCEL7" Then ' Hole über die Zugriffsnummer das entsprechende Window-Objekt Call AccessibleObjectFromWindow(hWnd, OBJID_NATIVEOM, mtGuid, oWin) ' Verweis setzen auf Application-Objekt If Not oWin Is Nothing Then If InStr(msAllHandles, "," & CStr(oWin.Application.hWnd) & ",") = 0 Then ReDim Preserve moTmpApplications(miAnz) Set moTmpApplications(miAnz) = oWin.Application miAnz = miAnz + 1 msAllHandles = msAllHandles & CStr(oWin.Application.hWnd) & "," End If End If Exit Function End If EnumXlsProc = 1 ' Nächster Aufruf End Function Sub SchließeAlleAnderenInstanzen() Dim oApplications() As Application, WkB As Workbook Dim i As Long, bIsThis As Boolean oApplications = GetApplications Debug.Print UBound(oApplications) For i = LBound(oApplications) To UBound(oApplications) bIsThis = False For Each WkB In oApplications(i).Workbooks bIsThis = WkB Is ThisWorkbook If bIsThis Then Exit For Next WkB If bIsThis = False Then ' oApplications(i).Quit 'Diese Excel-Instanz beenden End If Next i End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz
Anzeige
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
20.02.2025 07:47:04
Chris
Guten Morgen Karl-Heinz & Alle,

ich habe nun auch diese Lösung getestet - auch wenn die richtige Instanz gefunden wird - das
oApplications(i).Quit 
würde aber trotzdem Excel komplett schließen und nicht nur eine Instanz.

Ich habe mittlerweile so einiges ausprobiert, stehe aber immer vor dem selben Problem, dass immer Excel komplett geschlossen werden würde...

Weiß jemand Rat? Wäre echt toll wenn wir hier eine Lösung finden würden.

Danke!

Lg,

Chris
Anzeige
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
20.02.2025 09:01:19
Volti
Moin,
Sind es denn wirklich mehrere Instanzen? Ist Ubound(oApplications)>0?

Was steht im Caption der zu schließenden Apps? Immer nur Excel ohne weiteres?
Ggf. hilft hier eine Schließen Message.
Gruß KH
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
20.02.2025 13:08:49
Chris
Hi Karl-Heinz,

ich bin davon ausgegangen, dass da mehrere Instanzen offen bleiben, die ich aber nur sehe, wenn ich Alt+Tab drücke - wenn ich eines der Fenster auswähle wird aber nichts angezeigt. Diese Fenster sind der Rest der von SAP autom. geöffneter Excel, welche ich mit diesem Code schließe:

Public Sub Esperar(Optional ByVal archivo As String)


Dim Wshell As Object
Dim xclapp As Object
Dim xclwbk As Object
Dim xclsheet As Object

On Error Resume Next
Set Wshell = CreateObject("WScript.Shell")

Do
Err.Clear
Set xclapp = GetObject(, "Excel.Application")
If Err.Number = 0 Then Exit Do
DoEvents
Application.Wait Now + TimeValue("00:00:02")
Loop

Do
Err.Clear
Set xclwbk = xclapp.Workbooks.Item(archivo)
If Err.Number = 0 Then Exit Do
DoEvents
Application.Wait Now + TimeValue("00:00:02")
Loop

On Error GoTo 0
Set xclsheet = xclwbk.Worksheets(1)

If Not xclwbk Is Nothing Then
Set xclsheet = xclwbk.Worksheets(1)

xclapp.Visible = False
xclapp.DisplayAlerts = False

xclwbk.Close False
End If


Set xclwbk = Nothing
Set xclsheet = Nothing
Set xclapp = Nothing
Set Wshell = Nothing

End Sub


Nach jedem Export aus SAP und nach durchlaufen dieses Codes gibt es 1 Fenster mehr wie im ersten Post via Screenshot dargestellt...


Lg,

Chris
Anzeige
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
19.02.2025 17:03:11
Chris
Ich habe nun ChatGPT befragt, er soll einen Code schreiben, der die erste Instanz offen lässt (müsste ja meine Datei sein, wo ich die exportierten Daten reinkopiere) und die 2te Instanz die folglich von sap kommen müsste. schließen soll - leider funktioniert der Code nicht - wäre super, wenn Du / Ihr den lauffähig bekommt:

Public Sub SchließeNurZweiteExcelInstanz()

Dim objExcel As Object
Dim objProcesses As Object
Dim objProcess As Object
Dim excelPID As Long
Dim offeneInstanz As Object
Dim workbook As Object
Dim behalteneExcelInstanz As Boolean

Const BehaltenerDateiname As String = "MeinGespeicherterDateiname.xlsx" ' Hier den tatsächlichen Dateinamen eingeben

' Fehlerbehandlung aktivieren
On Error Resume Next

' Alle laufenden Excel-Instanzen prüfen
Set objProcesses = GetObject("winmgmts:\\.\root\cimv2").ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'EXCEL.EXE'")

For Each objProcess In objProcesses
excelPID = objProcess.ProcessId
Set objExcel = GetObject(, "Excel.Application")
If Err.Number = 0 Then
behalteneExcelInstanz = False

' Prüfen, ob die Excel-Instanz die Datei enthält, die offen bleiben soll
For Each workbook In objExcel.Workbooks
If workbook.Name = BehaltenerDateiname Then
behalteneExcelInstanz = True
Exit For
End If
Next workbook

' Falls es nicht die gewünschte Instanz ist, schließen
If Not behalteneExcelInstanz Then
objExcel.DisplayAlerts = False
objExcel.Quit
Set objExcel = Nothing
Exit For
End If
End If
On Error GoTo 0
Next objProcess

' Speicher bereinigen
Set objProcesses = Nothing
Set objProcess = Nothing
Set objExcel = Nothing
End Sub


Danke!
Anzeige
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
20.02.2025 09:25:45
Volti
Diese Version sieht mir plausibel aus und listet alle Excels.
ExcelPID wird gesetzt aber nicht verwendet.
Auch weiß ich nicht, ob GetObject nicht immer das Gleiche holt.
Was passiert bei Dir hier genau?
Funktioniert nicht Aussage ist nicht zielführend.
Gruß KH
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
20.02.2025 13:22:31
Chris
Naja - was hier genau passiert kann ich aufgrund zu geringer Kenntnisse nicht genau sagen, aber soweit ich sehe wird nur eine Excel-Instanz durchlaufen, dann gehts schon zur 2ten Schleife wo die Workbooks durchlaufen werden und beim 2ten das Workbook gefunden wird, welches nicht geschlossen werden soll (behalteneExcelInstanz = True)...

Und wie Du auch bemerkt hast, wird excelPID nicht verwendet - daher halte ich den Code von ChatGPT nicht durchdacht und somit fehlerhaft...

Anzeige
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
20.02.2025 14:09:31
volti
So,

ich habe jetzt die ChatGPT Version bei mehreren Instanzen geprüft. Das funktioniert nicht. Es wird wie schon vermutet immer wieder die gleiche Instanz gefunden.
Noch ersetzt dieses ChatGPT nicht uns Fachleute :-)

Diese u.a. leicht modifizierte Version (lief vorher aber auch schon) schließt bei mir nun definitiv alle Instanzen, außer der, die die aktuelle Datei enthält.
Das heißt, dass u.U. mehrere Workbooks offen bleiben, nämlich alle die in der aktuellen Instanz sind und alle anderen werden bei mir beendet.

Wenn das bei Dir jetzt nicht passiert, sind es auch nicht mehrere Instanzen. Da wird es dann mit der Ferndiagnose schwierig.

Code:


Private Declare PtrSafe Function GetClassNameA Lib "user32" ( _ ByVal hwnd As LongPtr, ByVal lpClassName As String, _ ByVal nMaxCount As Long) As Long Private Declare PtrSafe Function EnumWindows Lib "user32" ( _ ByVal lpEnumFunc As LongPtr, ByVal lParam As LongPtr) As Long Private Declare PtrSafe Function EnumChildWindows Lib "user32" ( _ ByVal hWndParent As LongPtr, ByVal lpEnumFunc As LongPtr, _ ByVal lParam As LongPtr) As Long Private Declare PtrSafe Sub IIDFromString Lib "ole32.dll" ( _ ByVal lpsz As String, ByRef lpiid As GUID) Private Declare PtrSafe Sub AccessibleObjectFromWindow Lib "oleacc.dll" ( _ ByVal hwnd As LongPtr, ByVal dwId As Long, _ ByRef riid As GUID, ByRef ppvObject As Any) Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte End Type Private mtGuid As GUID Private Const IID_EXCELWINDOW As String = "{00020893-0000-0000-C000-000000000046}" Private Const OBJID_NATIVEOM As Long = &HFFFFFFF0 Private moTmpApplications() As Application Private miAnz As Long Private msAllHWnd As String, msClassname As String * 16 Function GetApplications() As Application() ' Alle Kinder-Fenster über die geladenen Eltern-Fenster ermitteln miAnz = 1 Erase moTmpApplications: msAllHWnd = "," ' Array zurücksetzen ' Konvertiere die IID des Excel-Window-Objektes in die GUID-Struktur Call IIDFromString(StrConv(IID_EXCELWINDOW, vbUnicode), mtGuid) Call EnumWindows(AddressOf EnumAppsProc, ByVal 0&) GetApplications = moTmpApplications ' Array zurückgeben End Function Private Function EnumAppsProc(ByVal hwnd As LongPtr, ByVal lParam As Long) As Long ' Durchlaufe alle Eltern-Fenster If Left$(msClassname, GetClassNameA(hwnd, msClassname, 16)) = "XLMAIN" Then EnumChildWindows hwnd, AddressOf EnumXlsProc, ByVal 0& End If EnumAppsProc = 1 ' Nächster Aufruf End Function Private Function EnumXlsProc(ByVal hwnd As LongPtr, ByVal lParam As Long) As Long ' Durchlaufe alle Kinder-Fenster bis EXCEL7 gefunden Dim oWin As Window, hWndApp As LongPtr If Left$(msClassname, GetClassNameA(hwnd, msClassname, 16)) = "EXCEL7" Then ' Hole über die Zugriffsnummer das entsprechende Window-Objekt Call AccessibleObjectFromWindow(hwnd, OBJID_NATIVEOM, mtGuid, oWin) ' Verweis setzen auf Application-Objekt If Not oWin Is Nothing Then hWndApp = oWin.Application.hwnd If InStr(msAllHWnd, "," & hWndApp & ",") = 0 Then ReDim Preserve moTmpApplications(miAnz) Set moTmpApplications(miAnz) = oWin.Application msAllHWnd = msAllHWnd & hWndApp & "," miAnz = miAnz + 1 End If End If Exit Function ' Fertig mit Job End If EnumXlsProc = 1 ' Nächster Aufruf End Function Sub SchließeAlleAnderenInstanzen() ' Sub beendet alle anderen Excel-Instanzen außer der Aktuellen Dim oApps() As Application, WkB As Workbook Dim i As Long, bIsThis As Boolean oApps = GetApplications ' Hole die Excel-Instanzen For i = 1 To UBound(oApps) bIsThis = False For Each WkB In oApps(i).Workbooks bIsThis = WkB Is ThisWorkbook ' Beinhaltet Instanz diese Datei? If bIsThis Then Exit For ' Wenn ja => raus Next WkB oApps(i).DisplayAlerts = False If bIsThis = False Then oApps(i).DisplayAlerts = False oApps(i).Quit ' Diese Excel-Instanz beenden End If Next i End Sub

_________________________
viele Grüße aus Freigericht 😊
Karl-Heinz
Anzeige
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
20.02.2025 14:53:36
Chris
Hi Karl-Heinz,

der Code funktioniert - vielen Dank dafür - aber es stellt sich raus, dass die "Geister-Fenster" (siehe Screenshot im ersten Posting) anscheinend in keiner eigenen Instanz bestehen. Was ist das und wie kann man das schließen? Ich bin echt ratlos...

Danke

Lg,

Chris
Anzeige
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
20.02.2025 15:11:51
Volti
SAP ist out bei mir.
Habe ich 20 Jahre R2 und ein paar Jahre R3 mit gearbeitet, aber seit 15 Jahren nicht mehr.
Viel Erfolg noch...
Gruß Karl-Heinz
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
20.02.2025 15:26:01
heli
Hi,

ist schon ein paar Jahre her aber ich habe bei SAP immer nur mit den Text-Exporten gearbeitet da es immer mal wieder Probleme bei der Konvertierung zu Excel gab. Befehle dazu kann ich leider nicht mehr sagen da ich nicht mehr mit SAP arbeite.

Servus, heli
Anzeige
AW: Excel Sessions bleiben nach Abspielen von Makros offen?
20.02.2025 15:24:33
Chris
Gibt es sonst noch SAP-User die ein ähnliches Verhalten beobachten?
Anzeige
Anzeige
Live-Forum - Die aktuellen Beiträge
Datum
Titel
14.05.2026 13:31:09
14.05.2026 09:50:42
13.05.2026 19:14:18