Tratamento de erros do Excel VBA - Tudo o que você precisa saber!

Não importa o quão experiente você tenha com a codificação VBA, os erros sempre farão parte dela.

A diferença entre um programador VBA novato e um especialista em VBA é que os programadores especialistas sabem como lidar e usar erros de maneira eficaz.

Neste tutorial, vou mostrar várias maneiras que você pode usar para lidar com erros de forma eficaz no Excel VBA.

Antes de entrarmos no tratamento de erros do VBA, vamos primeiro entender os diferentes tipos de erros que você provavelmente encontrará ao programar no Excel VBA.

Tipos de erros VBA no Excel

Existem quatro tipos de erros no Excel VBA:

  1. Erros de sintaxe
  2. Erros de compilação
  3. Erros de tempo de execução
  4. Erros Lógicos

Vamos entender rapidamente quais são esses erros e quando é provável que você os encontre.

Erro de sintaxe

Um erro de sintaxe, como o nome sugere, ocorre quando o VBA encontra algo errado com a sintaxe do código.

Por exemplo, se você esquecer uma parte da instrução / sintaxe necessária, verá o erro de compilação.

No código abaixo, assim que pressiono enter após a segunda linha, vejo um erro de compilação. Isso ocorre porque o Declaração IF precisa ter o ‘Então‘Comando, que está faltando no código abaixo.

Observação: Quando você está digitando um código no Excel VBA, ele verifica cada frase assim que você pressiona enter. Se o VBA encontrar algo faltando na sintaxe, ele mostrará instantaneamente uma mensagem com algum texto que pode ajudá-lo a entender a parte que está faltando.

Para ter certeza de ver o erro de sintaxe sempre que houver algo faltando, você precisa certificar-se de que a verificação da sintaxe automática está ativada. Para fazer isso, clique em ‘Ferramentas’ e, em seguida, clique em ‘Opções’. Na caixa de diálogo de opções, certifique-se de que a opção ‘Auto Syntax Check’ esteja habilitada.

Se a opção ‘Verificação automática de sintaxe’ estiver desabilitada, o VBA ainda destacará a linha com o erro de sintaxe em vermelho, mas não mostrará a caixa de diálogo de erro.

Erro de compilação

Erros de compilação ocorrem quando algo está faltando e é necessário para a execução do código.

Por exemplo, no código abaixo, assim que tento executar o código, ele mostrará o seguinte erro. Isso acontece porque usei a instrução IF Then sem fechá-la com o 'End If' obrigatório.

Um erro de sintaxe também é um tipo de erro de compilação. Um erro de sintaxe ocorre assim que você pressiona enter e o VBA identifica que algo está faltando. Um erro de compilação também pode ocorrer quando o VBA não encontra nada faltando durante a digitação do código, mas sim quando o código é compilado ou executado.

O VBA verifica cada linha conforme você digita o código e destaca o erro de sintaxe assim que a linha está incorreta e você pressiona Enter. Os erros de compilação, por outro lado, só são identificados quando todo o código é analisado pelo VBA.

Abaixo estão alguns cenários em que você encontrará o erro de compilação:

  1. Usando uma declaração IF sem o IF final
  2. Usando a instrução For com o Next
  3. Usando a instrução Select sem usar o End Select
  4. Não declarar a variável (isso funciona apenas quando Option Explicit está habilitado)
  5. Chamando uma Sub / Função que não existe (ou com parâmetros errados)
Nota sobre 'Option Explicit': Ao adicionar ‘Option Explicit’, você deverá declarar todas as variáveis ​​antes de executar o código. Se houver alguma variável que não foi declarada, o VBA mostrará um erro. Esta é uma boa prática, pois mostra um erro caso você tenha uma variável digitada incorretamente. Você pode ler mais sobre Option Explicit aqui.

Erros de tempo de execução

Os erros de tempo de execução são aqueles que ocorrem durante a execução do código.

Os erros de tempo de execução ocorrerão apenas quando todos os erros de sintaxe e compilação estiverem sendo cuidados.

Por exemplo, se você executar um código que deveria abrir uma pasta de trabalho do Excel, mas essa pasta de trabalho não estiver disponível (excluída ou com o nome alterado), seu código apresentará um erro de tempo de execução.

Quando ocorre um erro de tempo de execução, ele interrompe o código e mostra a caixa de diálogo de erro.

A mensagem na caixa de diálogo Erro em tempo de execução é um pouco mais útil. Ele tenta explicar o problema que pode ajudá-lo a corrigi-lo.

Se você clicar no botão Depurar, ele destacará a parte do código que está levando ao erro.

Se você corrigiu o erro, pode clicar no botão Executar na barra de ferramentas (ou pressionar F5) para continuar executando o código de onde saiu.

Ou você também pode clicar no botão Fim para sair do código.

Importante: Caso você clique no botão Finalizar na caixa de diálogo, o código será interrompido na linha em que for encontrado. No entanto, todas as linhas de código anteriores teriam sido executadas.

Erros Lógicos

Erros lógicos não fariam seu código parar, mas podem levar a resultados errados. Esses também podem ser os tipos de erros mais difíceis de solucionar.

Esses erros não são destacados pelo compilador e precisam ser corrigidos manualmente.

Um exemplo de erro lógico (no qual muitas vezes me vejo preso) é entrar em um loop infinito.

Outro exemplo pode ser quando dá um resultado errado. Por exemplo, você pode acabar usando uma variável errada no código ou adicionar duas variáveis ​​onde uma está incorreta.

Existem algumas maneiras que eu uso para resolver erros lógicos:

  1. Insira a caixa de mensagem em algum lugar do código e realce os valores / dados que podem ajudar a entender se tudo está indo conforme o esperado.
  2. Em vez de executar o código de uma vez, passe por cada linha uma por uma. Para fazer isso, clique em qualquer lugar do código e pressione F8. você notaria que cada vez que pressiona F8, uma linha é executada. Isso permite que você percorra o código uma linha por vez e identifique os erros lógicos.

Usando Debug para Encontrar Erros de Compilação / Sintaxe

Depois de concluir o código, é uma boa prática compilá-lo antes de executá-lo.

Para compilar um código, clique na opção Debug da barra de ferramentas e clique em Compile VBAProject.

Quando você compila um projeto VBA, ele percorre o código e identifica erros (se houver).

Caso encontre um erro, aparecerá uma caixa de diálogo com o erro. Ele encontra os erros um por um. Portanto, se ele encontrar um erro e você o tiver corrigido, será necessário executar a compilação novamente para encontrar outros erros (se houver).

Quando seu código estiver livre de erros, a opção Compilar VBAProject ficará esmaecida.

Observe que a compilação só encontrará erros de "sintaxe" e erros de "compilação". Ele NÃO encontrará os erros de tempo de execução.

Quando você está escrevendo um código VBA, você não quer que os erros apareçam. Para evitar isso, existem muitos métodos de tratamento de erros que você pode usar.

Nas próximas seções deste artigo, abordarei os métodos que você pode usar para o tratamento de erros do VBA no Excel.

Definir as configurações de erro (erros tratados versus erros não tratados)

Antes de começar a trabalhar com seu código, você precisa verificar uma configuração no Excel VBA.

Vá para a barra de ferramentas do VBA e clique em Ferramentas e, em seguida, clique em Opções.

Na caixa de diálogo Opções, clique na guia Geral e certifique-se de que dentro do grupo ‘Trapping de erro’, ‘Interromper em erros não tratados’ esteja marcado.

Deixe-me explicar as três opções:

  1. Interromper em todos os erros: Isso interromperá seu código em todos os tipos de erros, mesmo quando você tiver usado as técnicas para lidar com esses erros.
  2. Módulo de Interrupção da Aula: Isso interromperá seu código em todos os erros não tratados e, ao mesmo tempo, se você estiver usando objetos como Userforms, também interromperá esses objetos e destacará a linha exata que causou o erro.
  3. Interromper em erros não tratados: Isso interromperá seu código apenas para os erros que não são tratados. Esta é a configuração padrão, pois garante que todos os erros não tratados sejam levados ao seu conhecimento. Se você estiver usando objetos como Userforms, isso não destacará a linha que está causando o erro no objeto, mas apenas destacará a linha que se refere a esse objeto.
Observação: Se você trabalha com objetos como Userforms, pode alterar esta configuração para ‘Break on Class Modules’. A diferença entre # 2 e # 3 é que quando você usa Break in Class Module, ele o levará para a linha específica no objeto que está causando o erro. Você também pode escolher ir com isso em vez de "Interromper em erros não tratados".

Resumindo - se você está apenas começando com o Excel VBA, certifique-se de que a opção "Interromper em erros não manipulados" esteja marcada.

Tratamento de erros VBA com declarações 'On Error'

Quando seu código encontra um erro, há algumas coisas que você pode fazer:

  1. Ignore o erro e deixe o código continuar
  2. Tenha um código de tratamento de erros em vigor e execute-o quando ocorrer um erro

Ambos os métodos de tratamento de erros garantem que o usuário final não veja um erro.

Existem algumas declarações ‘On Error’ que você pode usar para fazer isso.

On Error Resume Next

Quando você usa ‘On Error Resume Next’ em seu código, qualquer erro encontrado será ignorado e o código continuará a ser executado.

Este método de tratamento de erros é usado com frequência, mas você precisa ser cauteloso ao usá-lo. Como ele ignora completamente qualquer erro que possa ocorrer, você pode não ser capaz de identificar os erros que precisam ser corrigidos.

Por exemplo, se o código abaixo for executado, ele retornará um erro.

Sub AssignValues ​​() x = 20/4 y = 30/0 End Sub

Isso acontece porque você não pode dividir um número por zero.

Mas se eu usar a instrução ‘On Error Resume Next’ neste código (conforme mostrado abaixo), ele ignorará o erro e não saberei se há um problema que precisa ser corrigido.

Sub AssignValues ​​() On Error Resume Next x = 20/4 y = 30/0 End Sub

On Error Resume Next deve ser usado apenas quando você sabe claramente os tipos de erros que seu código VBA deve gerar e não há problema em ignorá-los.

Por exemplo, abaixo está o código de evento VBA que adicionaria instantaneamente o valor de data e hora na célula A1 de uma planilha recém-inserida (esse código é adicionado na planilha e não em um módulo).

Private Sub Workbook_NewSheet (ByVal Sh As Object) Sh.Range ("A1") = Format (Agora, "dd-mmm-aaaa hh: mm: ss") End Sub

Embora funcione bem na maioria dos casos, seria um erro se eu adicionar uma planilha de gráfico em vez de uma planilha. Como uma planilha de gráfico não possui células, o código geraria um erro.

Portanto, se eu usar a instrução ‘On Error Resume Next’ neste código, ela funcionará conforme o esperado com planilhas e não fará nada com planilhas de gráfico.

Private Sub Workbook_NewSheet (ByVal Sh As Object) On Error Resume Next Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") End Sub

Nota: On Error Resume Next Statement é melhor usado quando você sabe que tipo de erros provavelmente encontrará. E então, se você acha que é seguro ignorar esses erros, você pode usá-lo.

Você pode levar esse código para o próximo nível, analisando se houve um erro e exibindo uma mensagem relevante para ele.

O código a seguir mostraria uma caixa de mensagem que informaria ao usuário que uma planilha não foi inserida.

Private Sub Workbook_NewSheet (ByVal Sh As Object) On Error Resume Next Sh.Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") If Err.Number 0 Then MsgBox "Parece com você inseriu uma planilha de gráfico "& vbCrLf &" Error - "& Err.Description End If End Sub

‘Err.Number’ é usado para obter o número do erro e ‘Err.Description’ é usado para obter a descrição do erro. Eles serão abordados posteriormente neste tutorial.

No erro GoTo 0

‘On Error GoTo 0’ irá parar o código na linha que causa o erro e mostra uma caixa de mensagem que descreve o erro.

Em termos simples, ele ativa o comportamento de verificação de erro padrão e mostra a mensagem de erro padrão.

Então, por que usá-lo?

Normalmente, você não precisa usar 'On Error Goto 0', mas pode ser útil quando você o usa em conjunto com 'On Error Resume Next'

Deixe-me explicar!

O código abaixo selecionaria todas as células em branco na seleção.

Sub SelectFormulaCells () Selection.SpecialCells (xlCellTypeBlanks) .Select End Sub

Mas mostraria um erro quando não houvesse células em branco nas células selecionadas.

Então, para evitar mostrar o erro, você pode usar On Error Resume next ’

Agora, ele também mostrará qualquer erro quando você executar o código abaixo:

Sub SelectFormulaCells () On Error Resume Next Selection.SpecialCells (xlCellTypeBlanks) .Select End Sub

Até agora tudo bem!

O problema surge quando há uma parte do código onde o erro pode ocorrer e, como você está usando "On Error Resume Next", o código simplesmente o ignora e passa para a próxima linha.

Por exemplo, no código a seguir, não haveria prompt de erro:

Sub SelectFormulaCells () On Error Resume Next Selection.SpecialCells (xlCellTypeBlanks) .Selecione '… mais código que pode conter o erro End Sub

No código acima, existem dois lugares onde um erro pode ocorrer. O primeiro lugar é onde estamos selecionando todas as células em branco (usando Selection.SpecialCells) e o segundo está no código restante.

Embora o primeiro erro seja esperado, nenhum erro depois disso é.

É aqui que On Error Goto 0 vem para resgatar.

Ao usá-lo, você redefine a configuração de erro para o padrão, onde começará a mostrar erros quando o encontrar.

Por exemplo, no código abaixo, não haveria erro no caso de não haver células em branco, mas haveria um prompt de erro por causa de '10 / 0 ′

Sub SelectFormulaCells () On Error Resume Next Selection.SpecialCells (xlCellTypeBlanks) .Select On Error GoTo 0 '… mais código que pode conter o erro End Sub

No erro, vá para [Label]

Os dois métodos acima - ‘On Error Resume Next’ e ‘On Error Goto 0’ - não nos permitem realmente lidar com o erro. Um faz o código ignorar o erro e o segundo retoma a verificação de erros.

On Error Go [Label] é uma maneira com a qual você pode especificar o que deseja fazer caso seu código tenha um erro.

Abaixo está a estrutura de código que usa este manipulador de erros:

Sub Test () On Error GoTo Label: X = 10/0 'esta linha causa um erro'… .seu código restante vai aqui Exit Sub Label: 'code to handle the error End Sub

Observe que antes do tratamento de Erro 'Etiqueta', há um Sub de Saída. Isso garante que, caso não haja erros, o sub é encerrado e o código 'Etiqueta' não é executado. Caso você não use o Exit Sub, ele sempre executará o código ‘Label’.

No código de exemplo abaixo, quando ocorre um erro, o código salta e executa o código na seção do manipulador (e mostra uma caixa de mensagem).

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Exit Sub ErrMsg: MsgBox "Parece haver um erro" & vbCrLf & Err.Description End Sub

Observe que, quando ocorre um erro, o código já foi executado e executado as linhas antes da linha que causou o erro. No exemplo acima, o código define o valor de X como 12, mas como o erro ocorre na próxima linha, ele não define os valores de Y e Z.

Depois que o código pula para o código do manipulador de erros (ErrMsg neste exemplo), ele continuará a executar todas as linhas dentro e abaixo do código do manipulador de erros e sairá do sub.

No erro, vá para -1

Este é um pouco complicado e, na maioria dos casos, é improvável que você o use.

Mas ainda irei abordar isso, pois enfrentei uma situação em que isso era necessário (sinta-se à vontade para ignorar e pular para a próxima seção se estiver procurando apenas o básico).

Antes de entrar na mecânica disso, deixe-me tentar explicar onde pode ser útil.

Suponha que você tenha um código em que um erro seja encontrado. Mas tudo está bem, pois você tem um manipulador de erros no local. Mas o que acontece quando há outro erro no código do manipulador de erros (sim … um pouco como o filme inicial).

Nesse caso, você não pode usar o segundo manipulador, pois o primeiro erro não foi eliminado. Então, embora você tenha tratado o primeiro erro, na memória do VBA ele ainda existe. E a memória VBA só tem lugar para um erro - não dois ou mais que isso.

Nesse cenário, você pode usar On Error Goto -1.

Ele limpa o erro e libera memória do VBA para lidar com o próximo erro.

Chega de conversa!

Deixe-me explicar agora usando exemplos.

Suponha que eu tenha o código abaixo. Isso gerará um erro, pois há divisão por zero.

Sub Errorhandler () X = 12 Y = 20/0 Z = 30 End Sub

Então, para lidar com isso, eu uso um código de tratamento de erro (com o nome ErrMsg) conforme mostrado abaixo:

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Exit Sub ErrMsg: MsgBox "Parece haver um erro" & vbCrLf & Err.Description End Sub

Tudo está bem agora de novo. Assim que o erro ocorre, o manipulador de erros é usado e mostra uma caixa de mensagem conforme mostrado abaixo.

Agora, eu expando o código para ter mais código no ou após o manipulador de erros.

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Exit Sub ErrMsg: MsgBox "Parece haver um erro" & vbCrLf & Err.Description A = 10/2 B = 35/0 End Sub

Como o primeiro erro foi tratado, mas o segundo não, vejo novamente um erro conforme mostrado abaixo.

Ainda está tudo bem. O código está se comportando da maneira que esperávamos.

Portanto, para lidar com o segundo erro, uso outro manipulador de erros (ErrMsg2).

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Exit Sub ErrMsg: MsgBox "Parece haver um erro" & vbCrLf & Err.Description On Error GoTo ErrMsg2 A = 10/2 B = 35 / 0 Exit Sub ErrMsg2: MsgBox "Parece haver um erro novamente" & vbCrLf & Err.Description End Sub

E é aqui que não funciona conforme o esperado.

Se você executar o código acima, ele ainda apresentará um erro em tempo de execução, mesmo depois de ter o segundo manipulador de erros no lugar.

Isso acontece porque não eliminamos o primeiro erro da memória do VBA.

Sim, nós tratamos disso! Mas ainda permanece na memória.

E quando o VBA encontra outro erro, ele ainda está preso com o primeiro erro e, portanto, o segundo manipulador de erro não é usado. O código pára na linha que causou o erro e mostra o prompt do erro.

Para limpar a memória do VBA e limpar o erro anterior, você precisa usar 'On Error Goto -1'.

Portanto, se você adicionar esta linha no código abaixo e executá-lo, ele funcionará conforme o esperado.

Sub Errorhandler () On Error GoTo ErrMsg X = 12 Y = 20/0 Z = 30 Exit Sub ErrMsg: MsgBox "Parece haver um erro" & vbCrLf & Err.Description On Error GoTo -1 On Error GoTo ErrMsg2 A = 10 / 2 B = 35/0 Exit Sub ErrMsg2: MsgBox "Parece haver um erro novamente" & vbCrLf & Err.Description End Sub
Observação: O erro é eliminado automaticamente quando uma sub-rotina termina.Então, ‘On Error Goto -1’ pode ser útil quando você está recebendo dois ou mais de dois erros na mesma sub-rotina.

O Objeto Err

Sempre que ocorre um erro com um código, é o objeto Err que é usado para obter os detalhes sobre o erro (como o número do erro ou a descrição).

Err Object Properties

O Err Object tem as seguintes propriedades:

Propriedade Descrição
Número Um número que representa o tipo de erro. Quando não há erro, este valor é 0
Descrição Uma breve descrição do erro
Fonte Nome do projeto em que ocorreu o erro
HelpContext O ID do contexto de ajuda para o erro no arquivo de ajuda
HelpFile Uma string que representa a localização da pasta e o nome do arquivo de ajuda

Embora na maioria dos casos você não precise usar o objeto Err, às vezes pode ser útil ao lidar com erros no Excel.

Por exemplo, suponha que você tenha um conjunto de dados conforme mostrado abaixo e para cada número, na seleção, você deseja calcular a raiz quadrada na célula adjacente.

O código abaixo pode fazer isso, mas como há uma string de texto na célula A5, ele mostra um erro assim que isso ocorre.

Sub FindSqrRoot () Dim rng As Range Set rng = Seleção para cada célula In rng cell.Offset (0, 1) .Value = Sqr (cell.Value) Próxima célula End Sub

O problema com esse tipo de mensagem de erro é que ele não fornece informações sobre o que deu errado e onde o problema ocorreu.

Você pode usar o objeto Err para tornar essas mensagens de erro mais significativas.

Por exemplo, se eu agora usar o código VBA abaixo, ele interromperá o código assim que o erro ocorrer e mostrará uma caixa de mensagem com o endereço da célula onde há um problema.

Sub FindSqrRoot () Dim rng As Range Set rng = Seleção para cada célula In rng On Error GoTo ErrHandler cell.Offset (0, 1) .Value = Sqr (cell.Value) Próxima célula ErrHandler: MsgBox "Número do erro:" & Err .Number & vbCrLf & _ "Descrição do erro:" & Err.Description & vbCrLf & _ "Erro em:" & cell.Address End Sub

O código acima forneceria muito mais informações do que o simples ‘Tipo Incompatível’, especialmente o endereço da célula para que você saiba onde ocorreu o erro.

Você pode refinar ainda mais esse código para garantir que seu código seja executado até o fim (em vez de interromper a cada erro) e, em seguida, forneça uma lista de endereços de células onde o erro ocorre.

O código abaixo faria isso:

Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Seleção para cada célula In rng cell.Offset (0, 1) .Value = Sqr (cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address On Error GoTo -1 End If Next cell MsgBox "Erro nas seguintes células" & ErrorCells Exit Sub End Sub

O código acima é executado até o final e fornece a raiz quadrada de todas as células que contêm números (na coluna adjacente). Em seguida, mostra uma mensagem que lista todas as células onde houve um erro (conforme mostrado abaixo):

Err métodos de objeto

Embora as propriedades Err sejam úteis para mostrar informações úteis sobre os erros, também existem dois métodos Err que podem ajudá-lo no tratamento de erros.

Método Descrição
Claro Limpa todas as configurações de propriedade do objeto Err
Levantar Gera um erro em tempo de execução

Vamos aprender rapidamente o que são e como / por que usá-los com o VBA no Excel.

Método Err Clear

Suponha que você tenha um conjunto de dados conforme mostrado abaixo e deseja obter a raiz quadrada de todos esses números na coluna adjacente.

O código a seguir obterá as raízes quadradas de todos os números na coluna adjacente e mostrará uma mensagem de que ocorreu um erro nas células A5 e A9 (já que elas contêm texto).

Sub FindSqrRoot2 () Dim ErrorCells As String Dim rng As Range On Error Resume Next Set rng = Seleção para cada célula In rng cell.Offset (0, 1) .Value = Sqr (cell.Value) If Err.Number 0 Then ErrorCells = ErrorCells & vbCrLf & cell.Address Err.Clear End If Next cell MsgBox "Erro nas seguintes células" & ErrorCells End Sub

Observe que usei o método Err.Clear na instrução If Then.

Depois que um erro ocorre e é interceptado pela condição If, o método Err.Clear redefine o número do erro de volta para 0. Isso garante que a condição IF apenas intercepte os erros para as células em que é gerado.

Se eu não tivesse usado o método Err.Clear, uma vez que o erro ocorresse, ele sempre seria verdadeiro na condição IF, e o número do erro não teria sido redefinido.

Outra maneira de fazer isso funcionar é usando On Error Goto -1, que redefine o erro completamente.

Observação: Err.Clear é diferente de On Error Goto -1. Err.Clear limpa apenas a descrição e o número do erro. não o redefine completamente. Isso significa que se houver outra instância de erro no mesmo código, você não será capaz de lidar com isso antes de redefini-lo (o que pode ser feito com ‘On Error Goto -1’ e não por ‘Err.Clear’).

Método Err Raise

O método Err.Raise permite que você gere um erro em tempo de execução.

Abaixo está a sintaxe de uso do método Err.Raise:

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

Todos esses argumentos são opcionais e você pode usá-los para tornar sua mensagem de erro mais significativa.

Mas por que você iria querer levantar um erro sozinho?

Boa pergunta!

Você pode usar este método quando houver uma instância de um erro (o que significa que haverá um erro de qualquer maneira) e então usar este método para informar ao usuário mais sobre o erro (em vez da mensagem de erro menos útil que o VBA mostra por padrão).

Por exemplo, suponha que você tenha um conjunto de dados conforme mostrado abaixo e deseja que todas as células tenham apenas valores numéricos.

Sub RaiseError () Dim rng As Range Set rng = Seleção em erro GoTo ErrHandler para cada célula em rng If Not (IsNumeric (Cell.Value)) Then Err.Raise vbObjectError + 513, Cell.Address, "Not a number", " Test.html "End If Next Cell ErrHandler: MsgBox Err.Description & vbCrLf & Err.HelpFile End Sub

O código acima mostraria uma mensagem de erro com a descrição especificada e o arquivo de contexto.

Pessoalmente, nunca usei Err.Raise porque trabalho principalmente apenas com Excel. Mas para alguém que usa o VBA para trabalhar com o Excel junto com outros aplicativos como Outlook, Word ou PowerPoint, isso pode ser útil.

Aqui está um artigo detalhado sobre o método Err.Raise, caso você queira saber mais.

Práticas recomendadas de tratamento de erros VBA

Não importa o quão habilidoso você consiga escrever um código VBA, os erros sempre farão parte dele. Os melhores programadores são aqueles que têm as habilidades para lidar com esses erros de maneira adequada.

Aqui estão algumas práticas recomendadas que você pode usar quando se trata de tratamento de erros no Excel VBA.

  1. Use ‘On Error Go [Label]’ no início do código. Isso garantirá que qualquer erro que possa ocorrer a partir daí seja tratado.
  2. Use ‘On Error Resume Next’ SOMENTE quando tiver certeza sobre os erros que podem ocorrer. Use-o apenas com o erro esperado. No caso de você usá-lo com erros inesperados, ele simplesmente irá ignorá-lo e seguir em frente. Você pode usar 'On Error Resume Next' com 'Err.Raise' se quiser ignorar um certo tipo de erro e pegar o resto.
  3. Ao usar manipuladores de erros, certifique-se de usar Exit Sub antes dos manipuladores. Isso garantirá que o código do manipulador de erros seja executado apenas quando houver um erro (caso contrário, ele sempre será executado).
  4. Use vários manipuladores de erro para interceptar diferentes tipos de erros. Ter vários manipuladores de erro garante que um erro seja corrigido adequadamente. Por exemplo, você gostaria de lidar com um erro de 'incompatibilidade de tipo' diferente de um erro de tempo de execução de 'Divisão por 0'.

Espero que você tenha achado este artigo do Excel útil!

Aqui estão mais alguns tutoriais do Excel VBA de que você pode gostar:

  • Tipos de dados do Excel VBA - um guia completo
  • Loops VBA do Excel - para o próximo, faça enquanto, faça até, para cada
  • Eventos do Excel VBA - um guia fácil (e completo)
  • Editor do Excel Visual Basic - Como abrir e usar no Excel

Você vai ajudar o desenvolvimento do site, compartilhando a página com seus amigos

wave wave wave wave wave