Tratando entradas em formulários
Como você deve saber, podemos usar caixas de texto em formulários para
digitação, que são muito úteis para obter dados pelo usuário. Porém,
muitas vezes também precisamos impor restrições, para que a entrada do
usuário não seja inválida e possa gerar erros no código.
do texto. Isto pode ser um problema, por exemplo, quando for preciso
comparar a entrada com um dado existente, a fim de evitar duplicidade de
dados. Assim sendo, é uma boa prática sempre usar o método
Trim quando receber entradas do usuário. Veja o exemplo
abaixo:
Debug.Print “[” & frmCadastro.txtNome &
“]”
Trim(frmCadastro.txtNome)
“]”
End Sub
txtNome. Executando um teste colocando ”
Fulano ” (três espaços de cada lado), teremos a seguinte
saída na Verificação imediata:
apenas para melhor visualizar os espaços extras) e a segunda linha
mostra o resultado após usar o Trim. Porém, o usuário também pode
colocar espaços a mais entre as palavras da entrada. Neste caso, será
necessário deixar o código um pouco mais sofisticado:
Debug.Print “[” & frmCadastro.txtNome &
“]”
Trim(frmCadastro.txtNome)
Replace(frmCadastro.txtNome, ” “, ” “)
“]”
End Sub
consecutivos. Se não houver, nem entrará na estrutura. Se houver, ele
executará a ação de substituir dois espaços por um até que não haja mais
ocorrências. Veja um exemplo da execução desse código:
UCase e LCase caso precise que a entrada seja toda em
maiúsculas ou minúsculas, respectivamente.
é feito utilizando a propriedade MaxLength da caixa de texto.
Pode ser feito diretamente nas propriedades do objeto no formulário ou
via código:
txtNome, sendo a melhor forma de cumprir um limite de tamanho,
pois o usuário não conseguirá digitar além dessa quantidade. Use quando
houver restrição de espaço. Em campos de nome provavelmente não haverá
restrição, mas há outros casos em que é necessário.
Você pode preferir alterar nas propriedades do formulário, mas há casos
em que pode ser necessário fazer isso via código. Por exemplo, você tem
um campo que pode receber o número de CPF ou CNPJ. Neste caso, você
precisará também de botões de opção para selecionar se é pessoa física
ou jurídica e, com base nessa seleção, estipular se o limite de
caracteres será 11 ou 14. Observe o código a seguir:
txtCPFCNPJ.Enabled = True
End Sub
txtCPFCNPJ.Enabled = True
End Sub
txtCPFCNPJ será habilitada, terá o tamanho máximo definido e
receberá o foco do cursor. Note que para funcionar adequadamente a
propriedade Enabled de txtCPFCNPJ deve ser definida como
False por padrão, evitando que entre no campo sem selecionar o
tipo de pessoa antes.
números, evitando que o usuário digite letras, sinais de pontuação ou
outros símbolos. Para isso precisamos editar o evento KeyPress da
caixa de texto, que trata exatamente disso:
MSForms.ReturnInteger)
Select Case KeyAscii
Asc(“9”)
KeyAscii = 0
End Sub
caractere digitado. Só precisamos validar o que está sendo recebido e
permitir ou não o valor digitado. Asc permite que você possa usar
a própria representação do caractere entre aspas ao invés do código
associado ao caractere. É bem mais fácil entender
Case Asc(“0”) To Asc(“9”) do que Case 48 To 57, certo?
Perceba que não há nenhuma instrução após essa linha, logo em seguida
vem Case Else. Mesmo sem instrução, o Excel vai sair do
Select Case e vai prosseguir quando se o caractere digitado
estiver entre 0 e 9. Qualquer outro caractere que for digitado entrará
no Case Else, que irá descartar esse caractere.
Perceba que você pode permitir outros caracteres, adicionando um
Case antes do Case Else. Assim você pode permitir traços,
pontos, parênteses etc quando for preciso. Mas o usuário poderá digitar
em posições erradas, o que vai comprometer a integridade do dado. Há uma
forma melhor de colocar pontos, traços etc quando eles são fixos.
Vejamos este exemplo de caixa de texto para telefone:
MSForms.ReturnInteger)
txtTelefone.MaxLength = 13
Select Case KeyAscii
Asc(“9”)
txtTelefone.SelStart = 0 Then
txtTelefone.SelText = “(“
ElseIf txtTelefone.SelStart = 3 Then
txtTelefone.SelText = “)”
ElseIf txtTelefone.SelStart = 8 Then
txtTelefone.SelText = “-“
End If
KeyAscii = 0
End Sub
digitado um número. A propriedade SelStart é um índice, determina
a posição do texto onde o cursor está. Fique atento que o índice inicia
em zero. SelText irá acrescentar um caractere na posição se for o
caso. Há ainda a propriedade SelLength, que trata do comprimento
do texto selecionado, mas não precisamos usá-lo aqui. Experimente o
código e veja como fica muito prático deixar a própria caixa de texto
colocando os parênteses e o traço do número de telefone. Note que o
limite está em 13 caracteres, para números de celular com 9 dígitos é
preciso aumentar o limite e alterar a posição do hífen.
anterior? Podemos melhorar o código, codificando a mesma validação para
as posições de cada um. Neste exemplo vou ainda acrescentar uma enumeração (se não conhece veja meu artigo 6) para determinar o tipo de pessoa:
Pessoa = Fisica
End Sub
Pessoa = Juridica
End Sub
MSForms.ReturnInteger)
Select Case KeyAscii
Asc(“9”)
Select Case Pessoa
Case Fisica
If txtCPFCNPJ.SelStart = 3 Or txtCPFCNPJ.SelStart = 7 Then
txtCPFCNPJ.SelText = “.”
ElseIf txtCPFCNPJ.SelStart = 11 Then
txtCPFCNPJ.SelText = “-“
End If
Case Juridica
If txtCPFCNPJ.SelStart = 2 Or txtCPFCNPJ.SelStart = 6 Then
txtCPFCNPJ.SelText = “.”
ElseIf txtCPFCNPJ.SelStart = 10 Then
txtCPFCNPJ.SelText = “/”
ElseIf txtCPFCNPJ.SelStart = 15 Then
txtCPFCNPJ.SelText = “-“
End If
End Select
KeyAscii = 0
End Sub
Pessoa, bem como esvaziar o campo txtCPFCNPJ quando a
seleção for trocada, porque senão os caracteres separadores permanecerão
nas posições anteriores e acaba gerando uma confusão. Se o usuário
digitar alguns números e depois voltar para o começo para acrescentar
algum zero, os pontos não irão ficar no lugar. Assim, o usuário pode
deixar os dados com problemas. Para sanar isso temos duas alternativas:
verificar e atualizar enquanto digita o dado, o que é muito complexo e
trabalhoso, ou verificar após o cursor sair da caixa de texto. Esta
opção parece mais fácil de fazer. Analise o código abaixo:
MSForms.ReturnBoolean)
If Len(txtCPFCNPJ) > 0 Then
Case Fisica
If Len(txtCPFCNPJ) < 14 Or Mid(txtCPFCNPJ, 4, 1) <> “.” Or
_
Mid(txtCPFCNPJ, 8, 1) <> “.” Or Mid(txtCPFCNPJ, 11, 1) <>
“-” Then
txtCPFCNPJ = Trim(Replace(Replace(Replace(txtCPFCNPJ.Value, _
“.”, “”), “-“, “”), “/”, “”))
txtCPFCNPJ = String(11 – Len(txtCPFCNPJ), “0”) &
txtCPFCNPJ
txtCPFCNPJ = Left(txtCPFCNPJ, 3) & “.” & Mid(txtCPFCNPJ, 4, 3)
& _
“.” & Mid(txtCPFCNPJ, 7, 3) & “-” & Right(txtCPFCNPJ, 2)
End If
Case Juridica
If Len(txtCPFCNPJ) < 18 Or Mid(txtCPFCNPJ, 3, 1) <> “.” Or
_
Mid(txtCPFCNPJ, 7, 1) <> “.” Or Mid(txtCPFCNPJ, 11, 1) <>
“/” Or _
Mid(txtCPFCNPJ, 16, 1) <> “-” Then
txtCPFCNPJ = Trim(Replace(Replace(Replace(txtCPFCNPJ.Value, _
“.”, “”), “-“, “”), “/”, “”))
txtCPFCNPJ = String(14 – Len(txtCPFCNPJ), “0”) & txtCPFCNPJ
txtCPFCNPJ = Left(txtCPFCNPJ, 2) & “.” & Mid(txtCPFCNPJ, 3, 3)
& _
“.” & Mid(txtCPFCNPJ, 6, 3) & “/” & Mid(txtCPFCNPJ, 9, 4) & _
“-” & Right(txtCPFCNPJ, 2)
End If
End Sub
txtCPFCNPJ, que executa logo que o cursor sai da caixa de texto.
A primeira validação serve para verificar se há conteúdo, se algum
número foi digitado. Se nada foi digitado, nada acontece e o campo
continua vazio. Se algo foi digitado, é verificado se a pessoa é física
ou jurídica, para verificar se o comprimento está no limite e se
os separadores estão nas posições corretas. Caso isso haja algo errado,
o número é reformatado, tirando os símbolos não numéricos e depois
recompondo os separadores nas posições corretas.
formulário já existente. Pratique outras formas também, use o código
como inspiração para outros modelos existentes.
Adendo:
O Excel tem um bug quando recebe datas pelo formulário. Acontece muito
de datas como 04/12 serem transformadas em 12/04. Aparentemente, ele
considera datas mm/dd/yyyy a menos que o mm seja maior do que 12,
quando considera como dd/mm/yyyy. A solução que encontrei é usar
DateValue() para converter a data apropriadamente. Esse comando
deve ser usado quando você estiver trazendo o valor do campo do
formulário, como no exemplo abaixo:
DataNascimento = DateValue(txtDataNascimento.Text)
Espero ter contribuído.
Pedro Martins
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.