Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Validando a Entrada do Usuário | Interação com o Usuário
VBA do Excel para Automação Empresarial

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:

Exemplo de Validação
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

  1. Reescrever cmdSave_Click da 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.
  2. Adicionar uma quarta TextBox, txtReorderLevel, apenas para este exercício, e validá-la com IsNumeric.
  3. 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.
  4. Testar deixando todos os campos em branco e clicando em Salvar — confirmar se todas as linhas de erro esperadas aparecem em uma única mensagem.
Dica
expand arrow

1. Construindo uma string de erros

  • Declarar uma variável String (errors) no início de cmdSave_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ável errors ao invés de exibir um MsgBox imediatamente ou sair do Sub.
  • vbNewLine ao 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 em newRow depois.
  • Adicione-a ao formulário no modo Design (Shift+F7) com um Label correspondente, da mesma forma que adicionou as outras três TextBoxes.
  • IsNumeric verifica o texto bruto em .Value — se falhar, adicione uma linha à variável errors assim 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 uma MsgBox com vbExclamation e use Exit Sub.
  • O código ListRows.Add só será executado se esse bloco If não sair — ou seja, ele precisa estar fisicamente após todo o bloco de validação, não dentro de um Else.

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.
Solução
expand arrow
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.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 5. Capítulo 3

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Seção 5. Capítulo 3
some-alt