<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Question Re: VBA does not close spreadsheet generated by SAP in Technology Q&amp;A</title>
    <link>https://community.sap.com/t5/technology-q-a/vba-does-not-close-spreadsheet-generated-by-sap/qaa-p/14179391#M4922818</link>
    <description>Hello &lt;a href="https://community.sap.com/t5/user/viewprofilepage/user-id/2225088"&gt;@LeonelVargas&lt;/a&gt; ... just an idea, not a guarantee for a solution: Would it be possible to create your own standard excel template, containing your Sub Close() and which then is already included in the workbook of the second instance? Maybe you can find a solution in this direction? BR, Martin</description>
    <pubDate>Wed, 13 Aug 2025 08:46:03 GMT</pubDate>
    <dc:creator>MKreitlein</dc:creator>
    <dc:date>2025-08-13T08:46:03Z</dc:date>
    <item>
      <title>VBA does not close spreadsheet generated by SAP</title>
      <link>https://community.sap.com/t5/technology-q-a/vba-does-not-close-spreadsheet-generated-by-sap/qaq-p/14176262</link>
      <description>&lt;P&gt;I was wondering if anyone could help me, as I use a script that generates files in SAP and merges the documents into one.&lt;/P&gt;&lt;P&gt;The problem is that I can't get the generated files to close automatically, or at least not with another macro that does that. If I close the generated spreadsheets and reopen them, the macro closes, but I can't close them after they're generated by SAP. I've tried fixing the code using AI, but without success.&lt;/P&gt;&lt;P&gt;Below is my code to check: the main code and the one I use to try to close:&lt;/P&gt;&lt;P&gt;Sub EXP()&lt;/P&gt;&lt;P&gt;Dim Inicio As Date&lt;BR /&gt;Dim SapGuiAuto, SApplication, Connection, session, WScript&lt;BR /&gt;Dim i As Integer&lt;BR /&gt;Dim empresa, LOC_NEG, Periodo, ICMS_LAYOUT, ICMS_NOME_ARQUIVO&lt;BR /&gt;Dim IPI_LAYOUT, IPI_NOME_ARQUIVO, statusBarText&lt;BR /&gt;Dim caminho As String&lt;BR /&gt;Dim periodoConsolidado As String&lt;BR /&gt;Dim caminho_BR01 As String&lt;BR /&gt;Dim caminho_BR02 As String&lt;/P&gt;&lt;P&gt;Inicio = Now&lt;BR /&gt;caminho_BR01 = Sheets(1).Range("C2").Text&lt;BR /&gt;caminho_BR02 = Sheets(1).Range("C3").Text&lt;/P&gt;&lt;P&gt;' SAP Conexï¿½o&lt;BR /&gt;If Not IsObject(SApplication) Then&lt;BR /&gt;Set SapGuiAuto = GetObject("SAPGUI")&lt;BR /&gt;Set SApplication = SapGuiAuto.GetScriptingEngine&lt;BR /&gt;End If&lt;BR /&gt;If Not IsObject(Connection) Then&lt;BR /&gt;Set Connection = SApplication.Children(0)&lt;BR /&gt;End If&lt;BR /&gt;If Not IsObject(session) Then&lt;BR /&gt;Set session = Connection.Children(0)&lt;BR /&gt;End If&lt;BR /&gt;If IsObject(WScript) Then&lt;BR /&gt;WScript.ConnectObject session, "on"&lt;BR /&gt;WScript.ConnectObject SApplication, "on"&lt;BR /&gt;End If&lt;/P&gt;&lt;P&gt;i = 6&lt;BR /&gt;Do&lt;BR /&gt;If Sheets(1).Cells(i, 1) = "" Then Exit Do&lt;/P&gt;&lt;P&gt;empresa = Sheets(1).Cells(i, 1)&lt;BR /&gt;LOC_NEG = Sheets(1).Cells(i, 2)&lt;BR /&gt;Periodo = Sheets(1).Cells(i, 3)&lt;BR /&gt;ICMS_LAYOUT = Sheets(1).Cells(i, 4)&lt;BR /&gt;ICMS_NOME_ARQUIVO = Sheets(1).Cells(i, 5)&lt;BR /&gt;IPI_LAYOUT = Sheets(1).Cells(i, 6)&lt;BR /&gt;IPI_NOME_ARQUIVO = Sheets(1).Cells(i, 7)&lt;/P&gt;&lt;P&gt;' Define o caminho de acordo com a empresa&lt;BR /&gt;If empresa = "BR01" Then&lt;BR /&gt;caminho = caminho_BR01&lt;BR /&gt;ElseIf empresa = "BR02" Then&lt;BR /&gt;caminho = caminho_BR02&lt;BR /&gt;Else&lt;BR /&gt;caminho = "C:\Temp"&lt;BR /&gt;End If&lt;/P&gt;&lt;P&gt;'--------- ICMS ----------&lt;BR /&gt;ICMS_NOME_ARQUIVO = GeraNomeUnicoArquivo(caminho, ICMS_NOME_ARQUIVO)&lt;BR /&gt;session.findById("wnd[0]").maximize&lt;BR /&gt;session.findById("wnd[0]/tbar[0]/okcd").Text = "/N/FHG/AII07"&lt;BR /&gt;session.findById("wnd[0]").sendVKey 0&lt;BR /&gt;session.findById("wnd[0]").sendVKey 4&lt;BR /&gt;session.findById("wnd[1]/tbar[0]/btn[17]").press&lt;BR /&gt;session.findById("wnd[1]/usr/tabsG_SELONETABSTRIP/tabpTAB001/ssubSUBSCR_PRESEL:SAPLSDH4:0220/sub:SAPLSDH4:0220/ctxtG_SELFLD_TAB-LOW[1,24]").Text = empresa&lt;BR /&gt;session.findById("wnd[1]/usr/tabsG_SELONETABSTRIP/tabpTAB001/ssubSUBSCR_PRESEL:SAPLSDH4:0220/sub:SAPLSDH4:0220/ctxtG_SELFLD_TAB-LOW[2,24]").Text = LOC_NEG&lt;BR /&gt;session.findById("wnd[1]/usr/tabsG_SELONETABSTRIP/tabpTAB001/ssubSUBSCR_PRESEL:SAPLSDH4:0220/sub:SAPLSDH4:0220/txtG_SELFLD_TAB-LOW[3,24]").Text = Periodo&lt;BR /&gt;session.findById("wnd[1]/usr/tabsG_SELONETABSTRIP/tabpTAB001/ssubSUBSCR_PRESEL:SAPLSDH4:0220/sub:SAPLSDH4:0220/txtG_SELFLD_TAB-LOW[3,24]").SetFocus&lt;BR /&gt;session.findById("wnd[1]/usr/tabsG_SELONETABSTRIP/tabpTAB001/ssubSUBSCR_PRESEL:SAPLSDH4:0220/sub:SAPLSDH4:0220/txtG_SELFLD_TAB-LOW[3,24]").caretPosition = 6&lt;BR /&gt;session.findById("wnd[1]/tbar[0]/btn[0]").press&lt;BR /&gt;session.findById("wnd[1]/usr/lbl[12,3]").SetFocus&lt;BR /&gt;session.findById("wnd[1]/usr/lbl[12,3]").caretPosition = 3&lt;BR /&gt;session.findById("wnd[1]").sendVKey 2&lt;BR /&gt;session.findById("wnd[0]/usr/ctxtP_LAYOUT").Text = ICMS_LAYOUT&lt;BR /&gt;session.findById("wnd[0]/usr/ctxtP_LAYOUT").SetFocus&lt;BR /&gt;session.findById("wnd[0]/usr/ctxtP_LAYOUT").caretPosition = 12&lt;BR /&gt;session.findById("wnd[0]/tbar[1]/btn[8]").press&lt;BR /&gt;session.findById("wnd[0]/usr/cntlCC_ALV/shellcont/shell").currentCellColumn = "ITEM-ATRDIN-DOCDAT"&lt;BR /&gt;session.findById("wnd[0]/usr/cntlCC_ALV/shellcont/shell").selectedRows = "0"&lt;BR /&gt;session.findById("wnd[0]/usr/cntlCC_ALV/shellcont/shell").contextMenu&lt;BR /&gt;session.findById("wnd[0]/usr/cntlCC_ALV/shellcont/shell").selectContextMenuItem "&amp;amp;XXL"&lt;BR /&gt;session.findById("wnd[1]/tbar[0]/btn[20]").press&lt;BR /&gt;session.findById("wnd[1]/usr/ctxtDY_PATH").Text = caminho&lt;BR /&gt;session.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = ICMS_NOME_ARQUIVO&lt;BR /&gt;session.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 5&lt;BR /&gt;session.findById("wnd[1]/tbar[0]/btn[0]").press&lt;BR /&gt;session.findById("wnd[0]/tbar[0]/btn[3]").press&lt;/P&gt;&lt;P&gt;'--------- IPI ----------&lt;BR /&gt;IPI_NOME_ARQUIVO = GeraNomeUnicoArquivo(caminho, IPI_NOME_ARQUIVO)&lt;BR /&gt;session.findById("wnd[0]/usr/ctxtP_LAYOUT").Text = IPI_LAYOUT&lt;BR /&gt;session.findById("wnd[0]/usr/ctxtP_LAYOUT").SetFocus&lt;BR /&gt;session.findById("wnd[0]/usr/ctxtP_LAYOUT").caretPosition = 11&lt;BR /&gt;session.findById("wnd[0]/tbar[1]/btn[8]").press&lt;BR /&gt;session.findById("wnd[0]/usr/cntlCC_ALV/shellcont/shell").contextMenu&lt;BR /&gt;session.findById("wnd[0]/usr/cntlCC_ALV/shellcont/shell").selectContextMenuItem "&amp;amp;XXL"&lt;BR /&gt;session.findById("wnd[1]/tbar[0]/btn[20]").press&lt;BR /&gt;session.findById("wnd[1]/usr/ctxtDY_PATH").Text = caminho&lt;BR /&gt;session.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = IPI_NOME_ARQUIVO&lt;BR /&gt;session.findById("wnd[1]/usr/ctxtDY_PATH").SetFocus&lt;BR /&gt;session.findById("wnd[1]/usr/ctxtDY_PATH").caretPosition = 8&lt;BR /&gt;session.findById("wnd[1]/tbar[0]/btn[0]").press&lt;BR /&gt;session.findById("wnd[0]/tbar[0]/btn[3]").press&lt;BR /&gt;session.findById("wnd[0]/tbar[0]/btn[3]").press&lt;/P&gt;&lt;P&gt;statusBarText = session.findById("wnd[0]/sbar").Text&lt;/P&gt;&lt;P&gt;If statusBarText = "" Then&lt;BR /&gt;Sheets(1).Cells(i, &lt;span class="lia-unicode-emoji" title=":smiling_face_with_sunglasses:"&gt;😎&lt;/span&gt; = "Executed Successfully"&lt;BR /&gt;Else&lt;BR /&gt;Sheets(1).Cells(i, &lt;span class="lia-unicode-emoji" title=":smiling_face_with_sunglasses:"&gt;😎&lt;/span&gt; = statusBarText&lt;BR /&gt;session.findById("wnd[0]/tbar[0]/btn[12]").press&lt;BR /&gt;End If&lt;/P&gt;&lt;P&gt;i = i + 1&lt;BR /&gt;Loop&lt;/P&gt;&lt;P&gt;' Considera que o perï¿½odo a consolidar ï¿½ o da C3 da planilha Script&lt;BR /&gt;periodoConsolidado = Replace(Replace(Trim(Sheets(1).Range("C6").Text), "/", "."), "-", ".")&lt;BR /&gt;periodoConsolidado = Replace(periodoConsolidado, " ", "")&lt;BR /&gt;If Not (periodoConsolidado Like "##.####" Or periodoConsolidado Like "#.####") Then periodoConsolidado = "SEM_DATA"&lt;/P&gt;&lt;P&gt;' Consolidaï¿½ï¿½o SEPARADA:&lt;BR /&gt;ConsolidaApenasUltimoSufixo "ICMS", caminho_BR01, periodoConsolidado, "BR01"&lt;BR /&gt;ConsolidaApenasUltimoSufixo "IPI", caminho_BR01, periodoConsolidado, "BR01"&lt;BR /&gt;ConsolidaApenasUltimoSufixo "ICMS", caminho_BR02, periodoConsolidado, "BR02"&lt;BR /&gt;ConsolidaApenasUltimoSufixo "IPI", caminho_BR02, periodoConsolidado, "BR02"&lt;/P&gt;&lt;P&gt;MsgBox "Processo finalizado com sucesso! Tempo de execuï¿½ï¿½o: " &amp;amp; VBA.Format(Now - Inicio, "hh:mm:ss")&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;End Sub&lt;/P&gt;&lt;P&gt;' Nome ï¿½nico sem FSO&lt;BR /&gt;Function GeraNomeUnicoArquivo(ByVal pasta As String, ByVal baseFile As String) As String&lt;BR /&gt;Dim i As Integer, ponto As Integer, nomeNovo As String&lt;BR /&gt;nomeNovo = baseFile&lt;BR /&gt;i = 1&lt;BR /&gt;Do While Len(Dir(pasta &amp;amp; "\" &amp;amp; nomeNovo)) &amp;gt; 0&lt;BR /&gt;ponto = InStrRev(baseFile, ".")&lt;BR /&gt;If ponto = 0 Then&lt;BR /&gt;nomeNovo = baseFile &amp;amp; "_" &amp;amp; i&lt;BR /&gt;Else&lt;BR /&gt;nomeNovo = Left(baseFile, ponto - 1) &amp;amp; "_" &amp;amp; i &amp;amp; Mid(baseFile, ponto)&lt;BR /&gt;End If&lt;BR /&gt;i = i + 1&lt;BR /&gt;Loop&lt;BR /&gt;GeraNomeUnicoArquivo = nomeNovo&lt;BR /&gt;End Function&lt;/P&gt;&lt;P&gt;' Agora com empresa informada!&lt;BR /&gt;Sub ConsolidaApenasUltimoSufixo(tipo As String, caminho As String, Periodo As String, empresa As String)&lt;BR /&gt;Dim NomePadrao As String, arq As String, pos As Integer, nomeFinal As String&lt;BR /&gt;Dim sufixoAtual As String, sufixoNum As Long&lt;BR /&gt;Dim grupoDict As Object, maiorSufixo As Long&lt;BR /&gt;Dim sufixosArr() As String, idx As Integer&lt;BR /&gt;Dim grupoArqs As String, NomeConsFinal As String, linhas As Long&lt;BR /&gt;Dim wbCons As Workbook, wsCons As Worksheet, wbTemp As Workbook, wsTemp As Worksheet&lt;/P&gt;&lt;P&gt;Set grupoDict = CreateObject("Scripting.Dictionary")&lt;BR /&gt;maiorSufixo = 0&lt;/P&gt;&lt;P&gt;If tipo = "ICMS" Then&lt;BR /&gt;NomePadrao = "Livro ICMS"&lt;BR /&gt;Else&lt;BR /&gt;NomePadrao = "Livro IPI"&lt;BR /&gt;End If&lt;/P&gt;&lt;P&gt;arq = Dir(caminho &amp;amp; "\" &amp;amp; NomePadrao &amp;amp; "*.xls*")&lt;BR /&gt;Do While arq &amp;lt;&amp;gt; ""&lt;BR /&gt;If Left(arq, Len(NomePadrao)) = NomePadrao Then&lt;BR /&gt;pos = InStrRev(arq, "-")&lt;BR /&gt;If pos &amp;gt; 0 Then&lt;BR /&gt;nomeFinal = Trim(Mid(arq, pos + 1))&lt;BR /&gt;nomeFinal = Left(nomeFinal, InStrRev(nomeFinal, ".") - 1)&lt;BR /&gt;Else&lt;BR /&gt;nomeFinal = Left(arq, InStrRev(arq, ".") - 1)&lt;BR /&gt;End If&lt;/P&gt;&lt;P&gt;If InStrRev(nomeFinal, "_") &amp;gt; 0 Then&lt;BR /&gt;sufixoAtual = Mid(nomeFinal, InStrRev(nomeFinal, "_") + 1)&lt;BR /&gt;If IsNumeric(sufixoAtual) Then&lt;BR /&gt;sufixoNum = CLng(sufixoAtual)&lt;BR /&gt;If sufixoNum &amp;gt; maiorSufixo Then maiorSufixo = sufixoNum&lt;BR /&gt;If Not grupoDict.Exists(sufixoAtual) Then&lt;BR /&gt;grupoDict.Add sufixoAtual, caminho &amp;amp; "\" &amp;amp; arq&lt;BR /&gt;Else&lt;BR /&gt;grupoDict(sufixoAtual) = grupoDict(sufixoAtual) &amp;amp; "|" &amp;amp; caminho &amp;amp; "\" &amp;amp; arq&lt;BR /&gt;End If&lt;BR /&gt;End If&lt;BR /&gt;Else&lt;BR /&gt;sufixoAtual = ""&lt;BR /&gt;If Not grupoDict.Exists(sufixoAtual) Then&lt;BR /&gt;grupoDict.Add sufixoAtual, caminho &amp;amp; "\" &amp;amp; arq&lt;BR /&gt;Else&lt;BR /&gt;grupoDict(sufixoAtual) = grupoDict(sufixoAtual) &amp;amp; "|" &amp;amp; caminho &amp;amp; "\" &amp;amp; arq&lt;BR /&gt;End If&lt;BR /&gt;End If&lt;BR /&gt;End If&lt;BR /&gt;arq = Dir&lt;BR /&gt;Loop&lt;/P&gt;&lt;P&gt;If maiorSufixo &amp;gt; 0 And grupoDict.Exists(CStr(maiorSufixo)) Then&lt;BR /&gt;grupoArqs = grupoDict(CStr(maiorSufixo))&lt;BR /&gt;ElseIf grupoDict.Exists("") Then&lt;BR /&gt;grupoArqs = grupoDict("")&lt;BR /&gt;Else&lt;BR /&gt;MsgBox "Nenhum arquivo para consolidar do tipo " &amp;amp; tipo, vbExclamation&lt;BR /&gt;Exit Sub&lt;BR /&gt;End If&lt;/P&gt;&lt;P&gt;sufixosArr = Split(grupoArqs, "|")&lt;/P&gt;&lt;P&gt;If maiorSufixo &amp;gt; 0 Then&lt;BR /&gt;NomeConsFinal = empresa &amp;amp; " - " &amp;amp; tipo &amp;amp; "_Consolidado." &amp;amp; Periodo &amp;amp; "_" &amp;amp; maiorSufixo &amp;amp; ".xlsx"&lt;BR /&gt;Else&lt;BR /&gt;NomeConsFinal = empresa &amp;amp; " - " &amp;amp; tipo &amp;amp; "_Consolidado." &amp;amp; Periodo &amp;amp; ".xlsx"&lt;BR /&gt;End If&lt;/P&gt;&lt;P&gt;NomeConsFinal = GeraNomeUnicoArquivo(caminho, NomeConsFinal)&lt;/P&gt;&lt;P&gt;Set wbCons = Workbooks.Add&lt;BR /&gt;Set wsCons = wbCons.Sheets(1)&lt;BR /&gt;wsCons.Name = tipo &amp;amp; " Consolidado"&lt;BR /&gt;linhas = 1&lt;/P&gt;&lt;P&gt;For idx = LBound(sufixosArr) To UBound(sufixosArr)&lt;BR /&gt;Set wbTemp = Workbooks.Open(sufixosArr(idx))&lt;BR /&gt;Set wsTemp = wbTemp.Sheets(1)&lt;BR /&gt;If idx = LBound(sufixosArr) Then&lt;BR /&gt;wsTemp.UsedRange.Copy wsCons.Cells(linhas, 1)&lt;BR /&gt;linhas = wsCons.Cells(wsCons.Rows.Count, 1).End(xlUp).Row + 1&lt;BR /&gt;Else&lt;BR /&gt;If wsTemp.UsedRange.Rows.Count &amp;gt; 1 Then&lt;BR /&gt;wsTemp.Rows("2:" &amp;amp; wsTemp.UsedRange.Rows.Count).Copy wsCons.Cells(linhas, 1)&lt;BR /&gt;linhas = wsCons.Cells(wsCons.Rows.Count, 1).End(xlUp).Row + 1&lt;BR /&gt;End If&lt;BR /&gt;End If&lt;BR /&gt;wbTemp.Close False&lt;BR /&gt;Next idx&lt;/P&gt;&lt;P&gt;Application.DisplayAlerts = False&lt;BR /&gt;wbCons.SaveAs caminho &amp;amp; "\" &amp;amp; NomeConsFinal&lt;BR /&gt;wbCons.Close False&lt;BR /&gt;Application.DisplayAlerts = True&lt;BR /&gt;End Sub&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;================== ================ ================= =============== ==================&lt;/P&gt;&lt;P&gt;&amp;gt;&amp;gt;&amp;gt;&amp;nbsp; This is the one I use to close, which only works if I close Excel and reopen it:&lt;/P&gt;&lt;P&gt;Sub Close()&lt;BR /&gt;Dim wb As Workbook&lt;BR /&gt;For Each wb In Application.Workbooks&lt;BR /&gt;If wb.Name &amp;lt;&amp;gt; ThisWorkbook.Name Then&lt;BR /&gt;wb.Close SaveChanges:=False&lt;BR /&gt;End If&lt;BR /&gt;Next wb&lt;BR /&gt;End Sub&lt;/P&gt;&lt;P&gt;============= ======================= ====================== =========================&lt;/P&gt;&lt;P&gt;From what I've researched, it seems to be because the Excel opened by SAP is in a second instance, and therefore the closing code doesn't execute.&lt;/P&gt;&lt;P&gt;I've tried several methods (which the AI suggested), but nothing worked; it always opens in a different instance.&lt;/P&gt;&lt;P&gt;Does anyone have a solution or know what can be done to help? I'd be incredibly grateful!&lt;/P&gt;</description>
      <pubDate>Fri, 08 Aug 2025 18:02:01 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/vba-does-not-close-spreadsheet-generated-by-sap/qaq-p/14176262</guid>
      <dc:creator>LeonelVargas</dc:creator>
      <dc:date>2025-08-08T18:02:01Z</dc:date>
    </item>
    <item>
      <title>Re: VBA does not close spreadsheet generated by SAP</title>
      <link>https://community.sap.com/t5/technology-q-a/vba-does-not-close-spreadsheet-generated-by-sap/qaa-p/14179391#M4922818</link>
      <description>Hello &lt;a href="https://community.sap.com/t5/user/viewprofilepage/user-id/2225088"&gt;@LeonelVargas&lt;/a&gt; ... just an idea, not a guarantee for a solution: Would it be possible to create your own standard excel template, containing your Sub Close() and which then is already included in the workbook of the second instance? Maybe you can find a solution in this direction? BR, Martin</description>
      <pubDate>Wed, 13 Aug 2025 08:46:03 GMT</pubDate>
      <guid>https://community.sap.com/t5/technology-q-a/vba-does-not-close-spreadsheet-generated-by-sap/qaa-p/14179391#M4922818</guid>
      <dc:creator>MKreitlein</dc:creator>
      <dc:date>2025-08-13T08:46:03Z</dc:date>
    </item>
  </channel>
</rss>

