VBA Excel - Gerenciar Uso de Ctrl+Break Durante Execução de Código - Prevent users CTRL Breaking in your vba code during execution

Inline image 1
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 Single
    
    Let sng = Timer

    Do While sng + 5 > Timer
        'Sai do lanço após cinco segundos.
    Loop

End 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á:

Inline image 2

O Intellisense mostra que é possível atribuir três valores enumerados à EnableCancelKey, que são:

xlDisabled

xlErrorHandler

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.

Seguem exemplos com os valores como xlErrorHandler ou xlInterrupt:

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 Single
    
    Let sng = Timer
    Let Application.EnableCancelKey = xlDisabled

    Do While sng + 5 > Timer
        'Sai do lanço após cinco segundos.
    Loop

End 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 Erro

    Dim sng As Single
    
    Let sng = Timer
    Let Application.EnableCancelKey = xlErrorHandler

    Do While sng + 5 > Timer
        'Sai do lanço após cinco segundos.
    Loop
    Exit Sub
    
Erro:
    If Err.Number = 18 Then
        MsgBox "Espere um momento. Não há problemas, aplicação em processamento..." _
          , vbCritical _
          , ".: Info"
        Resume
    End If

End Sub

Reference:


Tags: VBA, Excel, [CTRL] + [BREAK], Ctrl+Break, EnableCancelKey, xlDisabled, xlErrorHandler, xlInterrupt, interrupted, 

Nenhum comentário:

Postar um comentário

diHITT - Notícias