VBA - Artigo 011 - Evitando erros

Evitando erros

Quando a planilha será utilizada apenas pelo desenvolvedor que está codificando, a parte de tratamento de erros não é tão prioritária, pois o próprio usuário será quem codificou e saberá como agir na eventualidade de algum erro não tratado. Porém, quando se trata de planilhas que serão utilizadas por outras pessoas, o tratamento de erros passa a ser algo essencial. Em caso de planilhas profissionais, que serão comercializadas, isso é mandatório.

Tratar erros adequadamente é uma tarefa árdua (talvez até ingrata) em qualquer linguagem de programação e requer muitos testes para que tudo funcione adequadamente. No VBA não é diferente. Felizmente, há meios de descobrirmos onde os erros aparecem.

Há dois tipos de erros que ocorrem: entrada de dados inválida e codificação inadequada. A primeira é mais fácil de tratar, com uma codificação que valida se o dado recebido pode ser utilizado ou não. Sem validação a possibilidade de erros aumenta muito. Já a segunda pode ser um pouco mais complicada de encontrar, pois pode ser um erro na lógica. Felizmente temos como encontrar os erros. Vejamos o exemplo abaixo:

    Idade = InputBox("Qual a sua idade?")

Sem uma validação adequada, o usuário pode inserir qualquer valor que não seja uma idade. Pode inserir letras ou quaisquer outros caracteres que não sejam números. Também pode inserir números negativos ou absurdamente grandes. A maneira mais comum de validar um valor é utilizando uma estrutura de verificação simples.

    Dim Idade As Variant
    
ObterIdade:
    Idade = InputBox("Qual a sua idade?")

    If IsNumeric(Idade) Then
        If CDbl(Idade) = CInt(Idade) Then
            If Idade <= 0 Or Idade > 120 Then
                GoTo ObterIdade
            End If
        Else
            GoTo ObterIdade
        End If
    Else
        GoTo ObterIdade
    End If

Em primeiro lugar, a variável Idade foi declarada como Variant, não como Integer. Isso porque se for digitado algum dado que não seja um número inteiro irá dar uma mensagem de erro do Excel e é justamente isso que estamos evitando que aconteça com a validação de erro.

Perceba que há várias estruturas de verificação encadeadas. Se a resposta for o desejado, irá para a próxima validação, caso contrário o código irá pedir novamente uma entrada. Podemos colocar um MsgBox dizendo que a entrada era inválida em cada uma das estruturas de verificação antes de retornar à solicitação de entrada, mas não coloquei para manter o código mais enxuto para fins didáticos.

Note também que o comando GoTo está sendo utilizado, enviando para um rótulo chamado ObterIdade. Os rótulos são pontos de referência no código, para onde o desenvolvedor pode fazer desvios. O GoTo é um comando que muita gente não recomenda porque deixa o código cheio de desvios e difícil de entender. No exemplo acima dá para entender bem porque é um exemplo bem simples.

Há a alternativa de usar uma estrutura de repetição com verificação ao final do processo. Veja como ficaria o mesmo exemplo abaixo:

    Dim Idade As Variant
    Dim ValorValido As Boolean
    ValorValido = False
    
    Do
        Idade = InputBox("Qual a sua idade?")
        
        If IsNumeric(Idade) Then
            If CDbl(Idade) = CInt(Idade) Then
                If Idade > 0 Or Idade <= 120 Then
                    ValorValido = True
                End If
            End If
        End If
    Loop Until ValorValido = True

Neste código colocamos a solicitação de entrada e as validações dentro de uma estrutura de repetição Do... Loop Until. Se não conhece ou não entende o que faz sugiro que leia meu décimo artigo, que trata de estruturas de repetição. Com a validação ao final da estrutura de repetição é garantido que o processamento irá passar pelo menos uma vez para requerer o valor.

Perceba que inseri uma variável ValorValido para controlar se o valor recebido em Idade é válido e também que o processo só sairá da estrutura de repetição quando for digitado um valor válido. Todas as validações continuam encadeadas, mas os procedimentos em caso negativo (Else) com os comandos GoTo não são mais necessários. Por isto mesmo este último exemplo é o mais recomendado de acordo com os paradigmas de programação.

Se em sua planilha os dados são inseridos através de um formulário fica mais fácil controlar a entrada. Em meu sétimo artigo demonstrei como efetuar o tratamento e validação de dados nos próprios códigos dos campos do formulário. Se ainda não leu, vale a pena ler antes de prosseguir. O botão de confirmação dos dados deve ser usado primeiramente para validar se todos os dados exigidos foram digitados e se são válidos, para só então prosseguir com o processamento dos dados fornecidos.

Seguindo as dicas acima temos como evitar erros por causa de entrada de dados inválidos. Porém, erros de codificação são muito difíceis de evitar se não conhecermos as melhores ferramentas para ajudar nos testes. Certamente você deve conhecer que é possível depurar o código com a tecla de atalho F8, que executa o código linha a linha, para que possamos acompanhar o processamento e verificar se está tudo fluindo bem. Também deve saber que parar o mouse em cima de uma variável irá exibir o valor atual dela, o que nos permite acompanhar os valores das variáveis sempre que necessário.

Muita gente ensina a exibir MsgBox para exibir valores de variáveis para acompanhar o processamento. Porém, há o risco de esquecer de remover e ir para a planilha o usuário assim, obrigando-o a apertar Ok cada vez que aparecer a janela. Há uma maneira bem melhor onde é possível colocar mensagens para acompanhar a depuração do código durante os testes: o método Debug.Print. Ao invés de exibir um MsgBox com uma mensagem, esta é colocada na área de Verificação imediata da janela do Editor VBA. Assim, esquecer de remover o Debug.Print não causará transtorno ao usuário, pois ele não deverá estar com a janela do Editor VBA aberta. Esse comando já foi visto em artigos anteriores e não deve ser novidade.

Há também o método Debug.Assert, que deve ser usado com uma condição. Se essa condição for falsa, a execução do código para na linha desse comando para que o desenvolvedor possa verificar o que está acontecendo. O exemplo mais comum para entender o funcionamento é o seguinte:

Debug.Assert Divisor <> 0

Se a variável Divisor estiver com o valor 0, a execução para, evitando que seja feita uma divisão por 0. Como deve ser óbvio, este é um recurso para ser usado enquanto estiver depurando o código, ou seja, deve-se remover todos os Debug.Assert antes de encaminhar a planilha para o usuário.

Trabalhando com o que foi explicado neste artigo é possível evitar uma grande quantidade de erros possíveis. Entretanto, há casos em que algum erro pode acontecer e que seja necessário usar um outro recurso do VBA, o On Error. Ele será tratado no próximo artigo.

Pedro Martins


Formado em Tecnologia em Eletrônica Digital, já trabalhou como artefinalista, eletrotécnico, programador de CLP (para máquinas industriais) e analista de sistemas em sistema bancário, programando em COBOL.
Mexe com computadores e programação desde a segunda metade dos anos 1980, quando teve um MSX e aprendeu a programar em BASIC. É a favor da disseminação do conhecimento.





Catálogo de aulas (NOVIDADE)

Criei um catálogo de aulas para ajudar você em seus estudos. Acesse clicando na imagem abaixo ou clique aqui.


Postagem Anterior Próxima Postagem