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.RaiseVeja 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 |