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
artefinalista, eletrotécnico, programador de CLP (para máquinas
industriais) e analista de sistemas em sistema bancário, programando em
COBOL.
1980, quando teve um MSX e aprendeu a programar em BASIC. É a favor da
disseminação do conhecimento.