Notifications
Clear all

Problema Private Sub Workbook_BeforeClose(Cancel As Boolean)

18 Posts
4 Usuários
0 Reactions
3,450 Visualizações
(@fkleinbley)
Posts: 62
Trusted Member
Topic starter
 

Olá, estou com problema no Private Sub Workbook_BeforeClose(Cancel As Boolean), acredito que seja um problema localizado, só acontece no Office 2016, criei um form para fechar a planilha, onde ele faz a pergunta se deseja sair, sim ou não, até o office 2013 funciona normalmente, mas no 2016 quando ele faz a pergunta se quero sair e clico em não (que faz executar o Cancel=True) ele cancela o fechamento da planilha, mas se eu clicar novamente para fechar a planilha, em vez de executar novamente o código que esta no Private Sub Workbook_BeforeClose(Cancel As Boolean) ele não executa o código e faz a clássica pergunta se quer salvar, não salvar ou cancelar...
Ao meu ver o erro acontece somente quando o Cancel=True é utilizado no Private Sub Workbook_BeforeClose(Cancel As Boolean), e somente no Office 2016, acredito que seja um problema de versão do próprio office.

Segue em anexo o modelo, mas para acontecer o problema teste no office 2016.

Se alguém poder ajudar, obrigado!

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    sairFechar.Show
    
    sairabortar = ThisWorkbook.Worksheets("Planilha1").Range("A1").Value 'ABORTAR
    
    If sairabortar = "ABORTAR" Then
    ThisWorkbook.Worksheets("Planilha1").Range("A1").Value = ""
    Cancel = True
    End
    End If

    For Each w In Application.Workbooks
    w.Save
    Next w
    ThisWorkbook.Application.Quit


End Sub
 
Postado : 11/02/2016 5:57 am
(@robo8268)
Posts: 73
Trusted Member
 

eu não consegui abrir o seu arquivo porque não tem winrar aqui no meu trabalho rsrs... pelo que eu entendi, quando vc escolhe a opção sim ou não, ele atualiza o texto de uma célula, e com base nesse texto a macro executa o Cancel=True

A minha duvida é, o texto dessa célula é alterado quando você clica em sim ou não?

A minha sugestão é usar uma variavel do tipo boolean pra isso, se o usuário clicar em sim, o valor será true, caso contrário será false...

Aí depois só fazer um if para executar a ação.

 
Postado : 11/02/2016 7:38 am
(@mprudencio)
Posts: 2749
Famed Member
 

Tenta usar esses

Sub Fechar()

Dim resposta As String


resposta = MsgBox("Deseja Fechar o Arquivo!!", vbOKCancel, "Fechar Arquivo")


If resposta = vbCancel Then

Exit Sub
Else
ActiveWorkbook.Save
ActiveWorkbook.Close
End If


End Sub



Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 11/02/2016 7:58 am
(@fkleinbley)
Posts: 62
Trusted Member
Topic starter
 

robo8268, o exemplo que passei está funcionando corretamente, altera o texto e fecha tudo certo, o problema é somente o Cancel = True que parece que é tratado de outra forma no Office 2016 (todos os anteriores funcionam), nos anteriores, quando clico no "não" ele não fecha o excel e continua na mesma guia, e quando clico no sim fecha e salva a planilha, o problema é que no Office 2016, quando clico no x para fechar o excel, ele faz a pergunta com o form, sim ou não, se eu clicar em sim ele fecha o excel e salva corretamente, e quando clico no não ele faz corretamente, não fecha o excel e continua na mesma guia, mas ai vem o problema, quando eu clico novamente para fechar o excel, em vez de rodar essa macro novamente, ele apresenta a mensagem clássica, salvar, não salvar ou cancelar, não roda a macro, com isso o usuário pode clicar em não salvar e sair da planilha. Uso esse form justamente para ninguém sair da planilha sem salvar, mas caso clique para sair e desista, ainda pode selecionar sim ou não. Isso só acontece no Office 2016.

MPrudencio, pelo que vi, após clicar no x na janela do excel, a única forma de parar o "fechamento", continuar no excel, é usando o Cancel = True, de outra forma não consigo.

 
Postado : 11/02/2016 10:17 am
(@fkleinbley)
Posts: 62
Trusted Member
Topic starter
 

E a questão não é o form, nem a macro, é o "Cancel = True" no Office 2016, funciona a primeira vez, mas depois parece que desativa o macro do Private Sub Workbook_BeforeClose(Cancel As Boolean)

 
Postado : 11/02/2016 10:19 am
(@mprudencio)
Posts: 2749
Famed Member
 

Testa o codigo assim


Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim resposta As String


resposta = MsgBox("Deseja Fechar o Arquivo!!", vbOKCancel, "Fechar Arquivo")


If resposta = vbCancel Then

Cancel = True

Exit Sub
Else
ActiveWorkbook.Save
ActiveWorkbook.Close
End If
End Sub



Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 11/02/2016 11:52 am
(@fkleinbley)
Posts: 62
Trusted Member
Topic starter
 

MPrudencio

Nesse seu exemplo, é o mesmo caso que descrevi, digamos, clico no fechar, pede para dar ok ou cancelar, se dou ok ele fecha, e cancelar ele fica aberto.
Se você ter o Office 2016 ai, testa, depois de clicar em cancelar, altere qualquer valor de uma célula e depois clique no x da janela para fechar, ele não vai rodar novamente essa macro (devia rodar), vai aparecer a mensagem clássica, salvar, não salvar ou cancelar...
Testei essa macro que enviou e aconteceu a mesma coisa, já testei em várias máquinas, todas com o office 2016 acontece isso....

 
Postado : 11/02/2016 12:12 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Tenta forçar o *religue dos eventos, antes da última linha da sub coloque:

Application.ENABLEEvents=True

Eu não vi esse comportamento no 2016 ainda, mas concordo q algum estagiário na MS está destruindo o Excel aos poucos!

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 11/02/2016 1:39 pm
(@fkleinbley)
Posts: 62
Trusted Member
Topic starter
 

Fernando, não deu certo, continua a mesma situação.

Tenho assinatura do Office, sempre atualizado, só acontece no 2016, ele realmente parece que desativa o evento Workbook_BeforeClose depois de usar o Cancel = True e fazer alguma alteração na planilha....
Isso no momento não me preocupa, pois tenho muitos clientes que usam um sistema que montei com vba, mas a maioria (se não todos) utiliza versões entre 2007 e 2013, mas a tendência será mudar esse panorama, dai vai ser um problema bem chato...

Com quem poderia entrar em contato da Microsoft? Algum canal especifico para esse tipo de problema?

 
Postado : 11/02/2016 1:52 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Não faço ideia amigo !
Mas então, se ele parece fazer alguma alteração na planilha, mude tb a propriedade .Saved para true...
Ao final da rotina escreva:

'Vai zerar e impedir a pergunta de salvamento na sequência...
ThisWorkbook.Saved = True

Esses problemas são uma bosta mesmo, sugiro tentar publicar o problema no MSDN, algum forum que a MS acesse e/ou que tenha muitos MVPs...

Eu abri seu arquivo, não identifiquei o comportamento descrito por você, tudo funcionou perfeitamente nos dois cenários *(sim e não)...

Eu também dei uma editada no seu código, e como eu deixei, também funcionou adequadamente.
Sim, meu Office é 2016, mais precisamente versão 16.0.06366.2062

Tente usar esse código assim, e se não der certo, dispare atualização, vai que já perceberam e corrigiram...

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    
    Cancel = False                      'Incluí este linha só pra forçar algo que já deveria ser falso
    sairFechar.Show
    With ThisWorkbook.Worksheets("Planilha1").Range("A1")
        sairabortar = .Value 'ABORTAR
        
        If sairabortar = "ABORTAR" Then
            .Value = ""                 'Aqui houve alteração no arquivo e a pergunta de salvamento aparecerá
            ThisWorkbook.Saved = True   'Aqui vc informa que não, não houve alteração
            Cancel = True               'Aqui róla o cancelamento
            End
        End If
    End With
    
    For Each w In Application.Workbooks
        w.Save
    Next w
    ThisWorkbook.Application.Quit

End Sub

p.s.: eu não dispararia o quit dentro de um evento. não gosto da ideia de fechar a aplicação que ainda está rodando um código... não que não funcione, eu só não gosto da ideia !

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 11/02/2016 2:39 pm
(@fkleinbley)
Posts: 62
Trusted Member
Topic starter
 

Continua igual, acontece a mesma coisa.

Não sei se você tentou da mesma forma:

Utilize o mesmo modelo que me enviou:

1-Abra a planilha de modelo
2-Clique para fechar a planilha
3-Vai aparecer o form para confirmar a saída, clique em não (ele vai impedir corretamente o fechamento da planilha)
4-Altere qualquer valor de qualquer célula (não salve)
5-Clique novamente no fechar (é nessa parte que ocorre o problema, em vez de novamente "rodar" o evento, ele não faz nada, só aparece a pergunta clássica, salvar, não salvar ou cancelar)

Poderia testar dessa forma e ver se o problema ocorre?

Testei na versão 16.0.06366.2068
e na versão 16.0.6568.2016 Insider

Esse modelo que enviei é uma pequena parte do macro que tenho no Workbook_BeforeClose, no que uso tem diversos fechamentos, logs, validações, posicionamento, etc... Portanto é muito importante funcionar isso para não dar a possibilidade do usuário sair da planilha sem salvar.

 
Postado : 11/02/2016 3:14 pm
(@mprudencio)
Posts: 2749
Famed Member
 

Se a questão é somente o usuario nao sair sem salvar a solução é mais simples do que parece.

Primeiro nao precisa de confirmação se deseja mesmo sair, não faz o menor sentido ter isso no codigo.

Segundo vc precisa salvar e nao perguntar ao usuario se ele quer salvar ele tem que confirmar sempre, entao e so vc salvar o arquivo sempre que for fechado ou sempre que executar alguma macro.

Eu uso sempre salvar na execução das macros assim nao me preocupo se o usuario vai salvar ou nao.

Juro que nao entendi pq perguntar se o usuario quer salvar ou nao se ele tem que salvar sempre.

Salva atraves do codigo e assunto resolvido

Marcelo Prudencio
Microsoft Excel Brasil no Facebook

"Começar já é a metade do caminho."
Autor Desconhecido

Simplifica que simples fica.
Nicole Tomazella.

"O Simples é Sempre Melhor Que o Complicado"
Jorge Paulo Lemann.

 
Postado : 11/02/2016 3:34 pm
(@fkleinbley)
Posts: 62
Trusted Member
Topic starter
 

É que assim, tenho digamos que um "sistema" em vba excel, ele contem muita coisa, bastante imagens também, o arquivo dele chega a 113mb, em uma máquina boa, ele leva 20/25 segundos para abrir (atualiza arquivos pela internet, faz verificações, verifica mensagens, etc.... se a máquina for fraca, pode levar até 40 segundos), depois de aberto o sistema todo flui muito bem, sem erros, tudo funciona certo (e tem bastante coisa), ai que se encaixa a pergunta ao sair, ela não é para perguntar se deseja salvar ou não o arquivo, mas sim se deseja sair ou não do "sistema", o usuário pode clicar sem querer no fechar, com essa opção ele pode clicar em não, dai não precisa esperar fechar o sistema (leva uns 25 segundos, pois envia logs, posiciona abas, etc...), essa é uma situação que relatei.... Dentro desse mesmo Workbook_BeforeClose tenho outras situações que usam o Cancel = True, como por exemplo, após determinada quantidade de vezes que o usuário entra no sistema ele pergunta se ele quer enviar um feedback sobre o mesmo, também quando existe atualização ele faz a mesma pegunta, se deseja atualizar, tudo isso usa o Cancel = True para barrar o fechamento e direcionar para a ação desejada...

 
Postado : 11/02/2016 3:48 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

fkleinbley
Fiz como vc sugeriu, passo a passo, e reproduzi o erro no 2016. Infelizmente, consegui reproduzir o erro.

Bom, segue minha opinião, nas versões anteriores se não me engano havia uma clara distinção sobre em qual X clicar, o do arquivo ou o da aplicação.
O X disponível no Excel 2016 é mais complexo que isso. Ele se comporta de maneira diferente. Como assim?
Quando há mais de um arquivo aberto, ele se comporta como Fechar Workbook e assim, dispara o Workbook_BeforeClose. Porém quando não há outro arquivo aberto ele se comporta como Fechar a aplicação. E neste caso o código perguntando se é pra salvar ou não o arquivo não passa pelo Workbook_BeforeClose, é um código da aplicação, direto da aplicação.

Eu enxerguei isso pq tentei fechar o arquivo de diversas maneiras e identifiquei o comportamento diferente quando uso Ctrl+F4 (fechar aquivo) ou o Alt+F4 (fechar programa).
Todas as vezes, sem exceção, que eu usei o Ctrl+F4, o arquivo disparou o evento corretamente.

Algumas das vezes que usei o Alt+F4, esbarrei no problema reportado.
Assim, acaba de abrir o arquivo, usa Alt+F4, aparece sua msg.
Responde não. Altera algo. Alt+F4 de novo, aí sim a pergunta se quer salvar, como se não entrasse no evento.

To falando, algum estagiário está querendo colocar melhorias onde não precisa, e está fodendo o Excel...

O arquivo que usei foi este em anexo, e a versão em que testei, após atualizar, foi: 16.0.6366.2068

Não sei o que mais dizer, mas pelo menos acho que te direcionei no caminho para vc ver o que dá pra fazer...

algo do tipo, criar uma classe para capturar eventos em nivel de aplicação, aquela "public withEvents AppEvents as application", para capturar a tentativa de fechar o Excel... Não sei se daria certo, mas eu tentaria ir por lá, de repente colocar no outro evento que em teoria é o mesmo que o seu:
Num mõdulo de classe:

Option Explicit

Public WithEvents AppEvent As Application

Private Sub AppEvent_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)

End Sub

verifique o se wb.name é igual o thisworkbook.name e só assim dispara o código ali dentro, ... pode ser uma saída...

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 11/02/2016 4:55 pm
Fernando Fernandes
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Era tipo isso, mas tb não deu certo... merda....

Existem mil maneiras de preparar Neston. Invente a sua!
http://www.youtube.com/ExpressoExcel

 
Postado : 11/02/2016 5:20 pm
Página 1 / 2