Ir ao conteúdo

Excel Fechar planilhas abertas por vba


Ir à solução Resolvido por Wendell Menezes,

Posts recomendados

Postado

Tenho a planilha SAP.xlsm que contem macro para exportar arquivos individuais do SAP salvos em xls e no fim de cada exportação do xls o excel abre com xls exportado.

Preciso que após executar a macro do SAP, o xls exportado feche.

Se eu executar Workbooks("xls1_sap").Close SaveChanges:=False funciona porém o nome dos xls são aleatórios.

Postado

@Diegodcr Não tenho esse ambiente SAP aqui para testar o código. Mas em vez de especificar o nome literal, tenta passar a variável nomesalvar para Workbook já que o nome muda de acordo com a coluna E.

 

Workbooks(nomesalvar).Close SaveChanges:=False

 

Postado

@Midori Eu fiz isso antes de postar aqui e deu erro no vba.

 

Erro em tempo de execução '9':

Subscrito fora do intervalo

 

Mesmo você não estando no ambiente, o que preciso é que feche a planilha que vai abrir e terá o nome que estiver em "nomesalvar"

Postado

@Diegodcr O erro pode ser porque na planilha está xls e a extensão é xlsx (o anexo que postou é xlsx). Mas se o literal deu certo sem extensão, tenta remover a extensão do nome na célula ou via código.

Postado

@Midori Os arquivos .xls que esta em anexo é somente exemplo... e na planilha o nome é o que ele vai criar e salvar o arquivo, so foi erro de digitação rs

O arquivo sendo xls ou xlsx vai abrir da mesma forma e a linha Workbooks(nomesalvar).Close SaveChanges:=False exibe o erro:

 

Erro em tempo de execução '9':

Subscrito fora do intervalo

 

To sem ideias de como fechar o segundo arquivo que ele abre

Postado

@Diegodcr Faça um teste com este código no fim da sua Sub fora do loop. Assim vai tentar fechar todas as planilhas abertas.

 

Sub FecharPlanilhas()
    Dim Planilha    As Workbook
    
    For Each Planilha In Workbooks
        If Planilha.Name <> ThisWorkbook.Name Then
            Call Planilha.Close(False)
        End If
    Next Planilha
End Sub

 

Postado

@Midori Deu certo com o código ficando deste forma:

Sub sap()

Dim Application, SapGuiAuto, Connection, session, WScrip
Dim classe, tipo, diretorio, nomesalvar As String
x = 1
Do While x <= Cells(x, 1)
x = x + 1
classe = Cells(x, 3).Value
tipo = Cells(x, 1).Value
diretorio = Cells(x, 4).Value
nomesalvar = Cells(x, 5).Value
If classe = Empty Then
Exit Do
Else

If Not IsObject(Application) Then
   Set SapGuiAuto = GetObject("SAPGUI")
   Set Application = SapGuiAuto.GetScriptingEngine
End If
If Not IsObject(Connection) Then
   Set Connection = Application.Children(0)
End If
If Not IsObject(session) Then
   Set session = Connection.Children(0)
End If
If IsObject(WScript) Then
   WScript.ConnectObject session, "on"
   WScript.ConnectObject Application, "on"
End If

session.findById("wnd[0]").maximize
session.findById("wnd[0]/tbar[0]/okcd").Text = "sap"
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/subCLASS_AND_ECM:SAPLCLSD:0210/ctxtCLSELINPUT-CLASS").Text = classe
session.findById("wnd[0]/usr/subCLASS_AND_ECM:SAPLCLSD:0210/ctxtCLSELINPUT-CLASS").caretPosition = 10
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/usr/subCLASS_AND_ECM:SAPLCLSD:0210/ctxtCLSELINPUT-KLART").Text = tipo
session.findById("wnd[0]/usr/subCLASS_AND_ECM:SAPLCLSD:0210/ctxtCLSELINPUT-KLART").caretPosition = 3
session.findById("wnd[0]").sendVKey 0
session.findById("wnd[0]/tbar[1]/btn[9]").press
session.findById("wnd[0]/shellcont[1]/shell").pressToolbarButton "SEL_CHARAC"
session.findById("wnd[1]/usr/tabsG_TS_ALV/tabpALV_M_R1/ssubSUB_DYN0510:SAPLSKBH:0620/cntlCONTAINER1_LAYO/shellcont/shell").SelectAll
session.findById("wnd[1]/usr/tabsG_TS_ALV/tabpALV_M_R1/ssubSUB_DYN0510:SAPLSKBH:0620/btnAPP_WL_SING").press
session.findById("wnd[1]/usr/tabsG_TS_ALV/tabpALV_M_R1/ssubSUB_DYN0510:SAPLSKBH:0620/cntlCONTAINER2_LAYO/shellcont/shell").selectedRows = "0"
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[0]/shellcont[1]/shell").pressToolbarContextButton "&MB_EXPORT"
session.findById("wnd[0]/shellcont[1]/shell").selectContextMenuItem "&XXL"
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[1]/usr/ctxtDY_PATH").Text = diretorio
session.findById("wnd[1]/usr/ctxtDY_FILENAME").Text = nomesalvar
session.findById("wnd[1]/usr/ctxtDY_FILENAME").caretPosition = 18
session.findById("wnd[1]/tbar[0]/btn[0]").press
session.findById("wnd[0]/tbar[0]/btn[12]").press
Workbooks("xls1_sap").Close SaveChanges:=False
End If

Loop



Dim Planilha As Workbook

For Each Planilha In Workbooks

If Planilha.Name <> ThisWorkbook.Name Then

Call Planilha.Close(False)

End If

Next Planilha 



End Sub

 

Depurando deu certo mas na macro não fecha as planilhas e acredito que sei o motivo.

Quando é salvo e gerado o arquivo .xlsx o excel demora uns 5 segundos pra abrir o .xlsx e nisso a macro ta no loop gerando outro arquivo.

Só daria certo o código fechando tudo do excel aberto que não seja o .xlsm ou executar após abrir o .xlsx

Postado

@Midori

Alterei o código abaixo e deu a msg:

O objeto não aceita esta propriedade ou método

Loop



Call Application.Wait(Now + TimeValue("00:00:05"))



Dim Planilha As Workbook

For Each Planilha In Workbooks

If Planilha.Name <> ThisWorkbook.Name Then

Call Planilha.Close(False)

End If

Next Planilha 



End Sub

 

  • Solução
Postado

Eu também utilizo SAP Script e me deparei com esse problema. Escolhi a solução que previne que o Excel seja aberto em primeiro lugar.

Para isso eu salvo o arquivo com outra extensão, como por exemplo .cmd.

Depois adiciono 2 linhas para deletar o arquivo Excel caso ele já exista e depois renomeio o arquivo .cmd para .xlsx

 

Exemplo:

 

On Error Resume Next
Kill "C:\TEMP\SE16H.xlsx"
Name "C:\TEMP\SE16H.cmd" As "C:\TEMP\SE16H.xlsx"

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!