O que acontece as suas aplicações quando um usuário mais 'avançado' pressiona o [CTRL] + [BREAK] durante um processamento ?
Seus dados são corrompidos travando indefinidamente a sua aplicação?
Suponha que tenho código abaixo rodando e algum usuário dê um [CTRL] + [BREAK]:
Sub Interrupter()Dim sng As SingleLet sng = TimerDo While sng + 5 > Timer'Sai do lanço após cinco segundos.LoopEnd Sub
No código abaixo, preparará o seu código para que o comportamento das teclas de interrupção mudem.
O código é a Propriedade EnableCancelKey do Objeto Application. Ao escrever Let application.EnableCancelKey =, perceba o que aparecerá:
O Intellisense mostra que é possível atribuir três valores enumerados à EnableCancelKey, que são:
xlDisabled,xlErrorHandler exlInterrupt.
Seguem exemplos com os valores como xlErrorHandler ou xlInterrupt:O valor padrão é xlInterrupt, quando a propriedade está atribuída à esse valor, o comportamento do VBE ao se pressionar Ctrl+Break em execução é: A execução do código foi interrompida.Se desejar usar um valor diferente de xlInterrupt para essa propriedade, deverá explicitar isso no seu código porque seu valor será resetado para xlInterrupt toda vez que iniciar a execução de um código na sua Aplicação. Poderá alterar o valor dessa propriedade quantas vezes desejar. Configurando-o para que no início seja xlDisabled e depois xlErrorHandler, por exemplo.
Desativando a funcionalidade da Combinação [CTRL] + [BREAK]
Diferentemente do exemplo da Introdução, o VBE ignorará a combinação Ctrl+Break e o código será executado até o fim.Recomendo o uso desse código em fragmentos críticos que, se não executados, podem comprometer a funcionalidade da aplicação. Caso sua aplicação entre num loop infinito, só poderá finalizá-la através do Gerenciador de Tarefas, talvez perdendo algumas alterações.Sub Interrupter()Dim sng As SingleLet sng = TimerLet Application.EnableCancelKey = xlDisabledDo While sng + 5 > Timer'Sai do lanço após cinco segundos.LoopEnd Sub
Outra alternativa interessante:
Gerenciar a interrupção do código
O exemplo abaixo prescindo um conhecimento básico de rotinas de tratamento de erro. Quando o valor da Propriedade EnableCancelKey for xlErrorHandler, durante o pressionamento do Ctrl+Break, o VBA levantará um erro cujo código é 18. então, a rotina de tratamento de erro mostrará uma mensagem ao usuário:
Sub Interrupter()On Error GoTo ErroDim sng As SingleLet sng = TimerLet Application.EnableCancelKey = xlErrorHandlerDo While sng + 5 > Timer'Sai do lanço após cinco segundos.LoopExit SubErro:If Err.Number = 18 ThenMsgBox "Espere um momento. Não há problemas, aplicação em processamento..." _, vbCritical _, ".: Info"ResumeEnd IfEnd Sub
Reference:
Tags: VBA, Excel, [CTRL] + [BREAK], Ctrl+Break, EnableCancelKey, xlDisabled, xlErrorHandler, xlInterrupt, interrupted,