Execute a seguinte macro.
Sub Macro1() MsgBox "Hello" End Sub
Quando a MsgBox aparecer, pressione as teclas Ctrl+C no teclado.
Abra um arquivo do Bloco de Notas e pressione as teclas Ctrl+V no teclado.
Como você pode ver, você pode copiar do MsgBox e colar no arquivo do Bloco de Notas .
Agora vamos fazer o segundo cenário.
Execute a seguinte macro.
Sub Macro2() Dim myNumber As Integer myNumber = 20 Dim yourNumber As Integer yourNumber = 0 'In mathematics, a number can not be divided by zero. So the following code must throw an error. Dim resultNumber As Integer resultNumber = myNumber / yourNumber End Sub
Quando a MsgBox aparecer, pressione as teclas Ctrl+C no teclado.
Abra um arquivo do Bloco de Notas e pressione as teclas Ctrl+V no teclado.
Como você pode ver, você NÃO consegue copiar do MsgBox e colar no arquivo do Bloco de Notas .
Minha dúvida: Como copiar mensagens de erro enviadas pelo Runtime Engine para a área de transferência do Windows conforme dou um exemplo no segundo cenário.
Bem, você pode copiar uma mensagem de
MsgBox
, mas no segundo caso, não se trata de MsgBox . É uma mensagem enviada pelo compilador mencionando o número e a descrição do erro.Para capturar os respectivos dados você deve adaptar seu código da seguinte forma (colocá-los em uma MsgBox comum):
A adaptação do código acima apenas responde à sua pergunta conforme foi formulada, mas na vida real, com necessidades reais, não consigo entender por que a necessidade de tal problema? Teoricamente, você deve usar um mecanismo de tratamento de erros capaz de resolver possíveis problemas. Você pode usar
Err.Number
para fazer com que o código atue em uma direção adequada, de acordo com ele. Por exemplo,If Err.Number = 5 then MsgBox "The denominator must be different of zero,,,": Exit sub
.A mensagem "divisão por zero" não é enviada pelo compilador , é enviada pelo mecanismo de tempo de execução do VBA . Uma mensagem do compilador (por exemplo, "Variável não encontrada", "Bloquear If sem End If") pode ser copiada com Ctrl+C, um erro de execução não (não me pergunte por quê).
Para entender a diferença: um erro do compilador significa que a sintaxe do seu código é inválida e não pode ser executada. Isso é conhecido antes de o código ser executado. Um erro de tempo de execução é um erro que ocorre durante a execução do código e não pode ser conhecido antecipadamente: um arquivo ausente, um cálculo inválido (como divisão por 0), um estouro numérico, uma variável de objeto não inicializada e assim por diante.
A maneira usual de detectar erros de tempo de execução é usando Error Handler . Isso é feito usando
On Error...
-statements. Quando ocorre um erro de tempo de execução, você pode usar oerr
-object para obter o número e o texto do erro.No seu caso, o erro não é tratado pelo seu código. O tempo de execução do VBA exibirá as informações do erro em uma caixa de mensagem especial e perguntará o que fazer (as opções relevantes são “Finalizar” e “Depurar”).
Ao escolher “Finalizar”, o processo VBA é completamente interrompido e o contexto de programação é perdido. Todas as variáveis são redefinidas, entre elas o
err
-object. Ao escolher "Debug", a execução é pausada na instrução que causou o erro de execução e o contexto de programação permanece. Nesse caso você simplesmente pode usar? err.Number, err.Description
na janela imediata (e depois copiar as informações de lá).Até você responder a essa pergunta, a caixa de mensagem permanece aberta (como uma janela modal) e não há como fazer nada no Excel ou VBA até que você responda à pergunta. A única maneira seria usar ferramentas de terceiros que possam ler o conteúdo de todos os controles de todas as janelas, mas duvido que você queira fazer algo assim.