Brito,
Você não precisa inibir o cancelamento, pode apenas tratá-lo.
O
xlErrorHandler faz com que qualquer tentativa de interrupção seja tratado como erro, e a macro abaixo desvia qualquer erro para a sub-rotina de tratamento. Se for interrupção (Esc ou Cntr-Break), mostra no Debug.print, e se não for interrupção (erro mesmo) exibe mensagem de erro.
O Loop vai até 8000 apenas para não correr o risco da macro não encerrar mais, ou demorar muito. Aumente ou diminua para seus testes.
Código: Selecionar todosSub NaoInterrompe()
On Error GoTo TrataErro
Application.EnableCancelKey = xlErrorHandler
For B = 1 To 8000
a = 55
Range("A1").Value = a
Calculate
Next
a = 1 / 0 'Erro simulado para ativa a rotina que trata erros
Exit Sub
TrataErro:
If Err.Number = 18 Then
Debug.Print "Tentou " & Now()
Resume
Else
MsgBox "Erro " & Err.Number & vbnerline & vbCrLf & _
"Descrição: " & Err.Description, vbCritical, _
"ERRO"
Exit Sub
End If
End Sub
Atenção para o fato de que, se houver um erro mesmo, será exibida uma mensagem. Se o operador teclar CTRL-Break na tela dessa mensagem, o código para e permite debug. É claro que mensagens assim não devem ocorrer com frequência, porque seriam resultado de um código mal feito, mas sempre é possível. Se não quiser essa possibilidade, arranje outra forma de avisar ao operador que o erro ocorreu.
Se esta mensagem colabora para a solução do problema, peço que dê um Like, clicando no botão com o "positivo", acima e a direita.
Jimmy San Juan