VBA em caso de erro - Práticas recomendadas de tratamento de erros

Folha de dicas de erros VBA

Erros

DescriçãoCódigo VBAOn Error - Código de parada e erro de exibiçãoNo erro, vá para 0Em caso de erro - pule o erro e continue executandoOn Error Resume NextEm caso de erro - Vá para uma linha de código [Label]No erro, vá para [Label]Limpa (Reinicia) ErroOn Error GoTo -1Mostrar número do erroMsgBox Err.NumberMostrar descrição do erroMsgBox Err.DescriptionFunção para gerar o próprio erroErr.Raise

Veja mais “Cheat Sheets” do VBA e downloads de PDF gratuitos

Tratamento de erros VBA

Tratamento de erros VBA refere-se ao processo de antecipar, detectar e resolver erros de tempo de execução do VBA. O processo de tratamento de erros do VBA ocorre durante a escrita do código, antes que quaisquer erros realmente ocorram.

Erros de tempo de execução VBA são erros que ocorrem durante a execução do código. Exemplos de erros de tempo de execução incluem:

  • Fazer referência a uma pasta de trabalho, planilha ou outro objeto inexistente
  • Dados inválidos, ex. referenciar uma célula do Excel contendo um erro
  • Tentando dividir por zero

VBA na declaração de erro

A maior parte do tratamento de erros do VBA é feita com o Na declaração de erro. A declaração On Error informa ao VBA o que fazer se encontrar um erro. Há três Em declarações de erro:

  • No erro GoTo 0
  • On Error Resume Next
  • On Error GoTo Linha

No erro GoTo 0

No erro GoTo 0 é a configuração padrão do VBA. Você pode restaurar essa configuração padrão adicionando a seguinte linha de código:

1 No erro GoTo 0

Quando ocorre um erro com No erro GoTo 0, O VBA interromperá a execução do código e exibirá sua caixa de mensagem de erro padrão.

Freqüentemente, você adicionará um No erro GoTo 0 depois de adicionar On Error Resume Next tratamento de erros (próxima seção):

123456789 Sub ErrorGoTo0 ()On Error Resume NextActiveSheet.Shapes ("Start_Button"). DeleteNo erro GoTo 0'Executar mais códigoEnd Sub

On Error Resume Next

On Error Resume Next diz ao VBA para pular quaisquer linhas de código que contenham erros e prosseguir para a próxima linha.

1 On Error Resume Next

Observação: On Error Resume Next não corrige um erro nem o resolve de outra forma. Ele simplesmente informa ao VBA para proceder como se a linha de código que contém o erro não existisse. Uso impróprio de On Error Resume Next pode resultar em consequências indesejadas.

Um ótimo momento para usar On Error Resume Next é quando se trabalha com objetos que podem ou não existir. Por exemplo, você deseja escrever algum código que excluirá uma forma, mas se executar o código quando a forma já foi excluída, o VBA gerará um erro. Em vez disso, você pode usar On Error Resume Next para dizer ao VBA para excluir a forma, se ela existir.

123 On Error Resume NextActiveSheet.Shapes ("Start_Button"). DeleteNo erro GoTo 0

Observe que adicionamos No erro GoTo 0 após a linha de código que contém o erro potencial. Isso redefine o tratamento de erros.

Na próxima seção, mostraremos como testar se ocorreu um erro usando Err.Number, oferecendo opções mais avançadas de tratamento de erros …

Err.Number, Err.Clear e Catching Errors

Em vez de simplesmente pular uma linha que contém um erro, podemos pegar o erro usando On Error Resume Next e Err.Number.

Err.Number retorna um número de erro correspondente ao tipo de erro detectado. Se não houver erro, Err.Number = 0.

Por exemplo, este procedimento retornará "11" porque o erro que ocorre é Erro em tempo de execução '11'.

1234567 Sub ErrorNumber_ex ()On Error Resume NextActiveCell.Value = 2/0MsgBox Err.NumberEnd Sub

Tratamento de erros com Err.Number

O verdadeiro poder de Err.Number reside na capacidade de detectar se ocorreu um erro (Err.Number 0). No exemplo abaixo, criamos uma função que testará se uma planilha existe usando Err.Number.

12345678910111213141516171819 Sub TestWS ()MsgBox DoesWSExist ("teste")End SubFunção DoesWSExist (wsName As String) As BooleanDim ws como planilhaOn Error Resume NextDefinir ws = Folhas (wsName)'Se o WS de erro não existirIf Err.Number 0 ThenDoesWSExist = FalseOutroDoesWSExist = TrueFim seOn Error GoTo -1Função Final

Nota: Nós adicionamos um On Error GoTo -1 ao final que redefine Err.Number para 0 (consulte as duas seções abaixo).

Com On Error Resume Next e Err.Number, você pode replicar o “Experimente” e “Pegue” funcionalidade de outras linguagens de programação.

On Error GoTo Linha

On Error GoTo Linha diz ao VBA para “ir para” uma linha de código rotulada quando um erro é encontrado. Você declara a instrução Go To assim (onde errHandler é o rótulo da linha para onde ir):

1 On Error GoTo errHandler

e crie um rótulo de linha como este:

1 errHandler:

Observação: este é o mesmo rótulo que você usaria com uma declaração GoTo VBA regular.

Abaixo iremos demonstrar usando On Error GoTo Linha para sair de um procedimento.

Em Erro, Sair do Sub

Você pode usar On Error GoTo Line para sair de um sub quando ocorrer um erro.

Você pode fazer isso colocando o rótulo da linha do manipulador de erros no final do seu procedimento:

12345678 Sub ErrGoToEnd ()On Error GoTo endProc'Algum códigoendProc:End Sub

ou usando o comando Exit Sub:

123456789101112131415 Sub ErrGoToEnd ()On Error GoTo endProc'Algum códigoGoTo skipExitendProc:Sair do SubskipExit:'Um pouco mais de códigoEnd Sub

Err.Clear, On Error GoTo -1 e Resetting Err.Number

Depois que um erro é tratado, geralmente você deve eliminá-lo para evitar problemas futuros com o tratamento de erros.

Depois que um erro ocorre, Ambas Err.Clear e On Error GoTo -1 pode ser usado para reiniciar Err.Number para 0. Mas há uma diferença muito importante: Err.Clear não redefine o erro real em si, ele apenas redefine o Err.Number.

O que isso significa? UsandoErr.Clear, você não poderá alterar a configuração de tratamento de erros. Para ver a diferença, teste este código e substitua On Error GoTo -1 com Err.Clear:

123456789101112131415161718192021 Sub ErrExamples ()No erro GoTo errHandler:'Erro "definido pelo aplicativo"Erro (13)Sair do SuberrHandler:'Limpar erroOn Error GoTo -1No erro GoTo errHandler2:'Erro de "incompatibilidade de tipo"Erro (1034)Sair do SuberrHandler2:Debug.Print Err.DescriptionEnd Sub

Normalmente, eu recomendo sempre usar On Error GoTo -1, a menos que você tenha um bom motivo para usar Err.Clear em vez de.

VBA em erro MsgBox

Você também pode exibir uma caixa de mensagem em caso de erro. Este exemplo exibirá diferentes caixas de mensagem, dependendo de onde o erro ocorre:

12345678910111213141516171819202122232425262728 Sub ErrorMessageEx ()Dim errMsg As StringOn Error GoTo errHandler'Estágio 1errMsg = "Ocorreu um erro durante o estágio de Copiar e Colar."'Err.Raise (11)'Estágio 2errMsg = "Ocorreu um erro durante o estágio de Validação de Dados."'Err.Raise (11)'Estágio 3errMsg = "Ocorreu um erro durante o estágio de P & L-Building e Copy-Over."Err.Raise (11)'Estágio 4errMsg = "Ocorreu um erro ao tentar registrar a importação na página de configuração"'Err.Raise (11)GoTo endProcerrHandler:MsgBox errMsgendProc:End Sub

Aqui, você substituiria Err.Raise (11) pelo seu código real.

VBA IsError

Outra maneira de lidar com os erros é testá-los com a função VBA IsError. A função IsError testa a existência de erros em uma expressão, retornando TRUE ou FALSE se ocorrer um erro.

123 Sub IsErrorEx ()MsgBox IsError (Range ("a7"). Value)End Sub

If Error VBA

Você também pode controlar erros no VBA com a função IfError do Excel. A função IfError deve ser acessada usando o WorksheetFunction Class:

1234567 Sub IfErrorEx ()Dim n As Longn = WorksheetFunction.IfError (Range ("a10"). Value, 0)MsgBox nEnd Sub

Isso produzirá o valor do Intervalo A10; se o valor for um erro, ele emitirá 0 em vez disso.

Tipos de erro VBA

Erros de tempo de execução

Conforme declarado acima:

Erros de tempo de execução VBA são erros que ocorrem durante a execução do código. Exemplos de erros de tempo de execução incluem:

  • Fazer referência a uma pasta de trabalho, planilha ou outro objeto inexistente
  • Dados inválidos, ex. referenciar uma célula do Excel contendo um erro
  • Tentando dividir por zero

Você pode "manipular erros" em tempo de execução usando os métodos discutidos acima.

Erros de sintaxe

Erros de sintaxe VBA são erros na escrita do código. Exemplos de erros de sintaxe incluem:

  • Erro de ortografia
  • Pontuação ausente ou incorreta

O Editor VBA identifica muitos erros de sintaxe com destaque em vermelho:

O Editor VBA também tem uma opção para “Verificação automática de sintaxe”:

Quando esta opção está marcada, o VBA Editor irá gerar uma caixa de mensagem alertando sobre os erros de sintaxe depois que você inserir uma linha de código:

Eu pessoalmente acho isso extremamente irritante e desabilito o recurso.

Erros de compilação

Antes de tentar executar um procedimento, o VBA irá “compilar” o procedimento. Compilar transforma o programa do código-fonte (que você pode ver) em forma executável (você não pode ver).

Erros de compilação VBA são erros que impedem a compilação do código.

Um bom exemplo de erro de compilação é uma declaração de variável ausente:

Outros exemplos incluem:

  • Para sem Próximo
  • Selecione sem End Select
  • Se sem Fim se
  • Chamando um procedimento isso não existe

Erros de sintaxe (seção anterior) são um subconjunto de Erros de compilação.

Depurar> Compilar

Erros de compilação aparecerão quando você tentar executar um procedimento. Mas, idealmente, você identificaria erros de compilação antes de tentar executar o procedimento.

Você pode fazer isso compilando o projeto com antecedência. Para fazer isso, vá para Depurar> Compilar Projeto VBA.

O compilador “irá para” o primeiro erro. Depois de corrigir esse erro, compile o projeto novamente. Repita até que todos os erros sejam corrigidos.

Você pode dizer que todos os erros foram corrigidos porque Projeto de compilação de VBA ficará esmaecido:

Erro OverFlow

o VBA OverFlow Error ocorre quando você tenta colocar um valor em uma variável que é muito grande. Por exemplo, Variáveis ​​Inteiras só pode conter valores entre -32.768 a 32.768. Se você inserir um valor maior, receberá um erro de estouro:

Em vez disso, você deve usar o Variável Longa para armazenar o número maior.

Outros termos de erro VBA

VBA Catch Error

Ao contrário de outras linguagens de programação, no VBA não há Declaração de captura. No entanto, você pode replicar uma instrução Catch usando On Error Resume Next e If Err.Number 0 Then. Isso é abordado acima em Tratamento de erros com Err.Number.

VBA Ignorar Erro

Para ignorar erros no VBA, basta usar o On Error Resume Next demonstração:

1 On Error Resume Next

No entanto, como mencionado acima, você deve ter cuidado ao usar essa instrução, pois ela não corrige um erro, ela simplesmente ignora a linha de código que contém o erro.

VBA Throw Error / Err.Raise

Para resolver um erro no VBA, você usa o Err.Raise método.

Esta linha de código gerará erro em tempo de execução '13': Tipo incompatível:

1 Err.Raise (13)

VBA Error Trapping

VBA Error Trapping é apenas outro termo para Tratamento de erros do VBA.

Mensagem de erro VBA

UMA Mensagem de erro VBA se parece com isso:

Ao clicar em "Depurar", você verá a linha de código que está gerando o erro:

Tratamento de erros VBA em um loop

A melhor maneira de lidar com erros em um Loop é usando On Error Resume Next junto com Err.Number para detectar se ocorreu um erro (lembre-se de usar Err.Clear para limpar o erro após cada ocorrência).

O exemplo abaixo dividirá dois números (Coluna A pela Coluna B) e produzirá o resultado na Coluna C. Se houver um erro, o resultado será 0.

12345678910111213141516 Subteste ()Dim cell como rangeOn Error Resume NextPara cada célula no intervalo ("a1: a10")'Definir valor da célulacell.Offset (0, 2) .Value = cell.Value / cell.Offset (0, 1) .Value'Se Cell.Value for Error, então o padrão é 0If Err.Number 0 Thencell.Offset (0, 2) .Value = 0Err.ClearFim sePróximoEnd Sub

Tratamento de erros VBA no Access

Todos os exemplos acima funcionam exatamente da mesma forma no Access VBA e no Excel VBA.

123456789101112131415161718 Função DelRecord (frm As Form)'esta função é usada para deletar um registro em uma tabela de um formulárioEm erro GoTo finalizandoCom frmIf .NewRecord Then.DesfazerFunção de saídaFim seTerminar comCom frm.RecordsetClone.Bookmark = frm.Bookmark.Excluirfrm.RequeryTerminar comFunção de saídafinal:FimFunção Final

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

wave wave wave wave wave