Validando a Entrada do Usuário
Deslize para mostrar o menu
O botão Salvar do capítulo anterior irá gravar tranquilamente um Nome da Empresa em branco ou um e-mail inválido na tabela Customers, porque nada em cmdSave_Click verifica os dados antes. Validação é a etapa que ocorre antes de salvar — identificando problemas enquanto ainda são fáceis de corrigir, em vez de depois que já se tornaram dados ruins em uma planilha.
Campos obrigatórios
A verificação mais simples: este TextBox ainda está vazio?
If Trim(txtCompanyName.Value) = "" Then
MsgBox "Company Name is required."
txtCompanyName.SetFocus
Exit Sub
End If
Trim é importante aqui mais do que parece — um usuário que digita apenas alguns espaços e nada mais passaria em uma verificação simples = "", já que " " tecnicamente não é uma string vazia, mas é tão inutilizável quanto o verdadeiro vazio. SetFocus move o cursor piscante diretamente para o controle com problema, assim o usuário não precisa procurar qual campo precisa ser corrigido — um detalhe que torna o formulário visivelmente mais refinado.
Validação numérica
IsNumeric verifica se um valor pode ser convertido em número, sem realmente tentar a conversão e correr o risco de erro:
If Not IsNumeric(txtReorderLevel.Value) Then
MsgBox "Reorder Level must be a number."
txtReorderLevel.SetFocus
Exit Sub
End If
Esta é a verificação que teria identificado "twenty" digitado em um campo numérico, exatamente como mostrado na captura de tela acima. Só depois que essa verificação passa é seguro escrever código como CInt(txtReorderLevel.Value) mais adiante na Sub — validar primeiro e converter depois garante que a conversão nunca falhe de forma inesperada.
Validação de data
IsDate segue a mesma ideia, aplicada a datas em vez de números:
If Not IsDate(txtOrderDate.Value) Then
MsgBox "Order Date must be a valid date."
txtOrderDate.SetFocus
Exit Sub
End If
Mensagens de erro que reúnem todos os problemas de uma vez
As três verificações acima todas usam Exit Sub assim que encontram um problema — adequado para um formulário curto, mas frustrante em um mais longo, onde o usuário corrige um erro apenas para encontrar o próximo imediatamente. Um padrão mais refinado acumula uma lista de todos os problemas antes de exibir uma única mensagem combinada:
Private Sub cmdSave_Click()
Dim errors As String
If Trim(txtCompanyName.Value) = "" Then
errors = errors & "- Company Name is required" & vbNewLine
End If
If Not IsNumeric(txtReorderLevel.Value) Then
errors = errors & "- Reorder Level must be a number" & vbNewLine
End If
If errors <> "" Then
MsgBox "Please fix the following:" & vbNewLine & errors, _
vbExclamation
Exit Sub
End If
' ... all checks passed, safe to save now
End Sub
Esta é a mesma técnica de construção de string do macro de alerta de estoque do último capítulo — errors começa vazio, e cada verificação que falha acrescenta mais uma linha em vez de sair imediatamente. Só depois que todas as verificações são executadas é que a Sub verifica se errors ficou vazio ou não, o que permite ao usuário ver todos os problemas de uma vez em vez de uma ida e volta frustrante para cada erro.
Tarefa
- Reescrever
cmdSave_Clickda tarefa do capítulo anterior para construir uma string de erros, verificando se Nome da Empresa, Contato e Email não estão em branco. - Adicionar uma quarta TextBox, txtReorderLevel, apenas para este exercício, e validá-la com IsNumeric.
- Exibir uma única MsgBox listando todos os problemas, usando vbExclamation como ícone, e só prosseguir para o código ListRows.Add quando a variável de erros estiver vazia.
- Testar deixando todos os campos em branco e clicando em Salvar — confirmar se todas as linhas de erro esperadas aparecem em uma única mensagem.
1. Construindo uma string de erros
- Declarar uma variável
String(errors) no início decmdSave_Click, começando vazia. - Para cada um dos três campos, usar a mesma verificação
Trim(...) = ""da seção 5.3 — se estiver em branco, adicionar uma linha à variávelerrorsao invés de exibir umMsgBoximediatamente ou sair do Sub. vbNewLineao final de cada linha adicionada mantém cada problema em uma linha separada na mensagem final.
2. Adicionando txtReorderLevel
- Esta é uma TextBox apenas para praticar validação numérica — ela não corresponde a uma coluna real em
tblCustomers, então não tente gravá-la emnewRowdepois. - Adicione-a ao formulário no modo Design (Shift+F7) com um Label correspondente, da mesma forma que adicionou as outras três TextBoxes.
IsNumericverifica o texto bruto em.Value— se falhar, adicione uma linha à variávelerrorsassim como nas verificações de campos em branco.
3. Uma MsgBox combinada, depois prosseguir
- Tudo da explicação da seção 5.3 se aplica diretamente aqui — verifique
If errors <> "" Then, exiba umaMsgBoxcomvbExclamatione useExit Sub. - O código
ListRows.Addsó será executado se esse blocoIfnão sair — ou seja, ele precisa estar fisicamente após todo o bloco de validação, não dentro de umElse.
4. Testando com tudo em branco
- Clique em Salvar sem digitar nada.
- Você deve ver exatamente uma
MsgBox, listando todos os quatro problemas (Nome da Empresa, Contato, Email, Nível de Reposição) ao invés de parar no primeiro — essa mensagem combinada é o objetivo deste exercício, em comparação com a versão anterior que saía após a primeira falha.
Private Sub cmdSave_Click()
Dim tbl As ListObject
Dim newRow As ListRow
Dim errors As String
' --- Validation ---
If Trim(txtCompanyName.Value) = "" Then
errors = errors & "- Company Name is required" & vbNewLine
End If
If Trim(txtContact.Value) = "" Then
errors = errors & "- Contact is required" & vbNewLine
End If
If Trim(txtEmail.Value) = "" Then
errors = errors & "- Email is required" & vbNewLine
End If
If Not IsNumeric(txtReorderLevel.Value) Then
errors = errors & "- Reorder Level must be a number" & vbNewLine
End If
If errors <> "" Then
MsgBox "Please fix the following:" & vbNewLine & errors, vbExclamation
Exit Sub
End If
' --- All checks passed — safe to save now ---
Set tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")
Set newRow = tbl.ListRows.Add
newRow.Range(1, 1).Value = "C0" & (tbl.ListRows.Count + 100)
newRow.Range(1, 2).Value = txtCompanyName.Value
newRow.Range(1, 3).Value = txtContact.Value
newRow.Range(1, 4).Value = txtEmail.Value
newRow.Range(1, 5).Value = cboCity.Value
newRow.Range(1, 6).Value = cboStatus.Value
MsgBox txtCompanyName.Value & " was added successfully."
Unload Me
End Sub
Execute o formulário, deixe todos os campos em branco e clique em Salvar — você deve ver uma única MsgBox com um ícone de aviso listando todos os quatro campos ausentes/inválidos de uma vez, e nenhuma linha será adicionada a tblCustomers até que todos os campos estejam preenchidos corretamente.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo