Tipos de erros vba: depuração e solução

Como qualquer outra linguagem de programação, o VBA não tem sorte quando se trata de erros e você tem que lidar com eles de qualquer maneira. Eles podem vir de diferentes fontes, como codificação incorreta, operações impossíveis (como dividir por zero) ou erros inesperados.

A melhor maneira de lidar com isso é ter um bom entendimento de todos os resultados possíveis que você pode alcançar com o código. Veja o exemplo abaixo onde temos um código VBA que calcula a raiz quadrada do número usando o valor que você tem na célula selecionada.

 Sub Square_Root() ActiveCell. Value = ActiveCell. Value ^ (1 / 2) End Sub

Mas se a célula ativa tiver um valor diferente de um número, você receberá um erro de tempo de execução, como abaixo.

erro de tempo de execução

Parâmetros de erro em VBA (captura de erros)

Na opção VBA, você pode definir a configuração para lidar com erros antes de começar a escrever códigos. Para abrir as configurações do VBA, vá para Ferramentas ➤ Opções ➤ Geral ➤ Captura de erros. Aqui você tem três opções que pode usar.

  • Parar em todos os erros : se você tiver habilitado esta opção, o VBA interromperá o código para todos os tipos de erros, mesmo se você tiver usado todos os tipos de técnicas de tratamento de erros.
  • Módulo de Classe de Adulteração : Com esta opção, o VBA irá parar todos os seus códigos que não são tratados por nenhuma técnica. E se você usar objetos como Userforms, ele também irá quebrar esses objetos e destacar a linha exata onde está o erro.
  • Interromper erros não tratados : esta é a configuração padrão que ajuda você a saber sobre todos os erros para os quais você não está usando nenhuma técnica de tratamento de erros e interrompe o código para todos os erros não tratados. (Mas, se você usar objetos como Userforms, isso não destacará a linha que está causando o erro no objeto, mas apenas destacará a linha que faz referência a esse objeto).

Tipos de erros VBA

Para entender os erros do VBA, você pode dividi-los em quatro categorias, e abaixo está a explicação desses tipos de erros.

1. Erros de sintaxe

Ao escrever o código VBA, você deve seguir uma sintaxe específica e, ao ignorá-lo ou não escrevê-lo como deveria, poderá enfrentar um erro de sintaxe (também conhecido como erro de linguagem). É como erros de digitação que você comete ao escrever seus códigos.

Bem, o VBA ajuda você relatando esses erros exibindo uma mensagem de erro. Você só precisa ter certeza de que “Verificação automática de sintaxe” está habilitado em seu editor VB.

Vá para Ferramenta ➤ Opções e certifique-se de marcar a caixa “Verificação automática de sintaxe”. Com isso, sempre que você cometer um erro de SINTAXE, o VBA exibirá uma mensagem de erro.

Mas se a “Verificação automática de sintaxe” estiver desabilitada, o VBA ainda destacará a linha de código com o erro, mas não exibirá a mensagem de erro.

2. Erros de compilação

Isso acontece quando você escreve código para executar uma atividade, mas essa atividade é inválida ou não pode ser executada pelo VBA. O melhor exemplo é onde você tem algum código usando a instrução IF, mas esqueceu de adicionar END IF no final da instrução e agora, ao executar este VBA, você mostra uma mensagem de erro de compilação.

Além disso, existem outros exemplos de erros de compilação:

  • Usando For sem Next ( For Next ).
  • Selecione sem selecionar o final ( Select case ).
  • Não declare uma variável quando você tiver habilitado a “ Opção Explícita ”.
  • Chamando uma sub/função que não existe.

3. Erros de tempo de execução

Um erro de tempo de execução ocorre quando o código é executado. Lembre-se do exemplo que compartilhei com você acima, quando o código calculou a raiz quadrada de um número.

Quando ocorre um erro de tempo de execução durante a execução do código, ele interrompe o código e mostra a caixa de diálogo de erro e esta caixa de erro fala sobre a natureza do erro que você possui. Suponha que você escreveu um código que abre uma pasta de trabalho no local especificado, mas essa pasta de trabalho agora foi movida ou excluída por alguém.

Portanto, quando você executar o código, o VBA mostrará um erro de tempo de execução porque não consegue encontrar este arquivo neste local. A mensagem que você recebe em um erro de tempo de execução descreve o motivo, o que ajuda a entender o motivo do erro.

E quando ocorre um erro de tempo de execução, ele interrompe a execução do código. Se você clicar no botão “Depurar”, ele mostra a linha de código que contém esse erro, destacando-a em amarelo. Ou você pode clicar no botão “Finalizar” para interromper a execução do código e fechar a mensagem de erro.

4. Erro lógico

Isto não é um erro, mas um erro ao escrever o código. Às vezes, esses tipos de erros podem causar problemas para localizá-los e corrigi-los.

Suponha que você esteja escrevendo algum código e, ao declarar uma variável, use o tipo de dados errado ou tenha usado as etapas de cálculo erradas. Neste caso seu código funcionará bem e você não encontrará esse erro facilmente. A melhor maneira de lidar com esse tipo de problema é executar cada linha de código, uma por uma.

Usando ferramentas de depuração em VBA

O VBA fornece um conjunto de ferramentas para depurar seu código e remover bugs de seus códigos.

1. Compile o projeto VBA

No Editor do Visual Basic, existe uma opção que você pode usar instantaneamente após terminar seu código. Essas opções de compilação analisam cada linha do seu código e exibem uma caixa de mensagem se houver algum erro no seu código.

Nota: A opção Compilar VBA rastreia apenas erros de sintaxe e compilação, não erros de tempo de execução, porque esses erros ocorrem apenas quando um código está em execução. Para usar Compile VBA Project, vá para ➤ Debug ➤ Compile VBA Project.

Depois de executar “Compile VBA Project” e não houver erros em seu código, as opções ficarão esmaecidas.

2. Execute cada linha de código, uma por uma

É assim que eu faço. Quando completo um código, simplesmente o executo linha por linha para verificar se há algum erro. Isso pode levar algum tempo, mas ajuda a resolver todos os erros (sintaxe, compilação e execução).

Na “Barra de ferramentas de depuração” há um botão “Step In” que você pode usar para executar o código linha por linha ou simplesmente pressionar F8 para executar uma única linha e pressioná-lo novamente para executar a próxima linha do código.

Usando a instrução “On ERROR” para lidar com erros VBA

É importante verificar seus códigos e encontrar possíveis erros em todos os métodos de depuração disponíveis. Mas a melhor e mais eficiente maneira é criar instruções de tratamento de erros que possam lidar com um erro e tornar seu código perfeito quando executado. Vamos explorar essas afirmações. Quando ocorre um erro em um código VBA, as melhores maneiras de lidar com esse erro podem ser:

  • Deixe o VBA ignorar o erro e executar o código
  • Deixe um conjunto especial de instruções ser executado quando ocorrer um erro.

Em ambas as soluções, você pode usar instruções “On Error”. Abaixo estão quatro declarações “On Error” que você pode usar. E agora vamos examinar cada afirmação, uma por uma.

1. Se você cometer um erro, comece de novo

Esta simples linha de código permite que o VBA continue executando o código apesar da ocorrência de um erro. A IDÉIA é simples: vá para a próxima linha de código se um erro for detectado em algum lugar durante a execução.

No código abaixo, você tem duas linhas de código:

  • A primeira linha indica que o valor na célula A1 é 25 dividido por 0
  • E a segunda linha diz que o valor da célula A2 é 10 dividido por 5

Agora há um problema com o código que você tem online. Como você sabe, se dividir qualquer coisa por 0, o resultado será um erro. Portanto, quando você executa esse código, o VBA exibe uma mensagem de erro “Erro de tempo de execução ’11’ Dividir por zero” e interrompe a execução.

Mas quando você adiciona “On Error Resume Next” no início do código e executa o código, o VBA simplesmente ignora a linha de código onde o erro ocorre e continua com a segunda linha e adiciona esse valor na célula A2.

 Sub myDivide() On Error Resume Next Range ("A1"). Value = 25 / 0 Range ("A2"). Value = 10 / 5 End Sub

Portanto, sempre que você quiser que seu código seja executado apesar de um erro ocorrer em qualquer lugar, basta usar a instrução “On Error Resume Next” em seu código.

Mas aqui está mais uma coisa que você deve observar: ele ignorará apenas os erros que ocorrerem posteriormente.

Digamos que ocorreu um erro na linha 5 e você adicionou “On Error Resume Next” na linha 8, isso não ignoraria esse erro. Portanto, a melhor forma é adicioná-lo como a primeira linha de código do procedimento.

2. Em caso de erro GoTo 0

Este é o comportamento padrão do VBA: quando ocorre um erro, ele interrompe a execução do código.

Bem, usar “On Error GoTo 0″ não faz diferença no seu código. O VBA simplesmente interromperá o código e exibirá uma mensagem com uma descrição do erro. Então, por que eu deveria me preocupar em usá-lo? Pergunta inteligente. Vamos usar o exemplo que você usou acima em ” On Error Resume Next “.

Neste código, sempre que ocorre um erro, o VBA pega a próxima linha de código e a executa e você não verá nenhuma mensagem de erro. Mas digamos que você tenha mais linhas em seu código e não queira exceder essas linhas se houver um erro no código.

Portanto, se você inserir “On Error GoTo 0” após a segunda linha de código, ele restaurará o manipulador de erros padrão do VBA, que exibe mensagens de erro sempre que ocorre um erro.

3. Em caso de erro GoTo [Label]

Pense em um lugar em um prédio onde você possa ir em caso de emergência. Da mesma forma, usando “On Error GoTo [Label]”, você pode simplesmente criar um bloco de código separado em seu código principal para lidar com um erro.

Na verdade, “On Error GoTo [Label]” é uma maneira muito melhor e mais conveniente de lidar com erros. No código abaixo você tem “On Error GoTo Oh!” Erro” agora nesta declaração de linha, a palavra “Oh!” Erro” é o rótulo.

Se você olhar no final do código onde você tem um início específico com o nome do rótulo e depois um código para uma caixa de mensagem com uma mensagem no código.

Agora o que acontece se ocorrer um erro, o VBA irá pular para o rótulo “Oh! Erro” e executará o bloco de código que você possui após esse rótulo.

Mas há uma coisa que você precisa cuidar: se nenhum erro ocorrer, o rótulo que você tem no seu código será executado. Há duas coisas que você precisa fazer:

  • Primeiro, certifique-se de adicionar sua tag de erro no final do código.
  • Segundo, adicione um “Exit Sub” antes do rótulo de erro.

Com isso, você será beneficiado em ambas as situações. Digamos que se ocorrer um erro e o VBA mudar para o rótulo que você especificou, haverá apenas código do próprio rótulo para o código. E se não ocorrer um erro, a instrução “Exit Sub” que você tem antes do rótulo sairá do procedimento sem executar o rótulo de erro.

4. Em caso de erro GoTo -1

Antes de entrarmos nisso, deixe-me compartilhar algo com você. Quando ocorre um erro em um código, o VBA armazena esse log de erros em sua memória e só o limpa quando a rotina é concluída.

Ó VBA! Viva no presente

Para tratar o segundo erro no código VBA, você deve limpar o primeiro erro da memória do VBA. No código abaixo, você tem duas instruções “On Error GoTo [Label]” que tratam de erros de dois blocos de código diferentes.

Mas se você executar esse código, quando ocorrer o segundo erro, o VBA não irá pular para o rótulo que você definiu e, em vez disso, mostrará a mensagem de erro “Tipo incompatível”.

 Sub Square_Root() On Error GoTo myError1 Range ("A1"). Value = Range ("A1"). Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo myError2 Range ("A2"). Value = Range ("A2"). Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub

Para resolver esse problema, você pode usar “On Error GoTo -1” que permite ao VBA remover o erro atual de seu armazenamento.

 Sub Square_Root() On Error GoTo myError1 Range("A1").Value = Range("A1").Value ^ (1 / 2) myError1: MsgBox "There's some problem with the value you have in the cell A1." On Error GoTo -1 On Error GoTo myError2 Range("A2").Value = Range("A2").Value ^ (1 / 2) myError2: MsgBox "There's some problem with the value you have in the cell A2." End Sub

Agora, quando você executa este código, “On Error GoTo -1” remove o erro da memória e o VBA trata o erro na segunda instrução conforme desejado.

O que mais preciso saber para lidar com erros no VBA?

Além de usar técnicas de tratamento de erros, existem algumas outras coisas que você pode usar para lidar melhor com os erros.

Erro de objeto

Quando ocorreu um erro durante a execução do código, você pode usar o objeto Err para obter detalhes sobre o erro. Existem algumas propriedades e métodos que você pode usar com o objeto Err. Vamos aprendê-los um por um.

Propriedades

Aqui estão as propriedades que você pode usar com o objeto Err:

  • Err.Number : Quando ocorre um erro, um número é armazenado no objeto Err. No código abaixo, quando isso ocorre, a caixa de mensagem exibe o número do erro.
  • Err.Description : Esta propriedade exibe a descrição do erro que pode ajudá-lo a entender o motivo do erro.
  • Err.Source: Esta propriedade informa em qual projeto ocorreu o erro.
  • Err.HelpContext: esta propriedade retorna o ID do contexto de ajuda para o erro no arquivo de ajuda.
  • Err.HelpContext: Este é um valor de string para o local do arquivo de ajuda.

Normalmente, quando você lida com erros usando técnicas de tratamento de erros, você não usa muito o objeto Err em seus códigos. Mas abaixo está um exemplo simples de usá-lo.

 Sub Square_Root() On Error GoTo myError1    Range("A1").Value = Sqr(Range("A1").Value) Exit Sub myError1:    MsgBox "There's some problem with the value you have in the cell A1." & vbCrLf & _                "Error Number: " & Err.Number  & vbCrLf & _                "Error Description: " & Err.Description End Sub

Ao executar o código acima, e se ocorrer um erro, será exibida uma caixa de mensagem com o número e a descrição do erro.

Métodos

Com Err Object você também pode usar dois métodos.

  • Err.Clear: Este método limpa o número do erro e a descrição do erro da memória VBA (isso é diferente de “On Error GoTo -1” porque não redefine completamente o erro).
  • Err.Raise: Com este método, você pode gerar intencionalmente um erro de tempo de execução em seu código, e aqui está a sintaxe a seguir:

Err .Raise [número], [fonte], [descrição], [arquivo de ajuda], [contexto de ajuda]

Dicas rápidas sobre tratamento de erros

Aqui estão algumas dicas rápidas que você pode usar para lidar melhor com erros de VBA.

  • Use “On Error Resume Next” somente quando você tiver certeza de que um erro está ocorrendo e for aceitável pular a linha de código com um erro e ser seguro passar para a próxima linha.
  • A melhor maneira de lidar com erros de tempo de execução é usar “Error Handler” com “On Error GoTo [Label]”. Isso garante que sempre que o erro ocorrer, você será notificado, mas não exibirá aquela mensagem de erro desagradável.
  • Cada vez que você usar o manipulador de erros, certifique-se de usar “Exit Sub” primeiro.

Adicione um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *