Capítulo 04: Interação com o Usuário e Sanitização de Strings

🎯 Objetivo da Aula

Nesta aula, você aprenderá a construir interfaces de diálogo interativas com o usuário utilizando as caixas nativas InputBox e MsgBox (com captura de respostas vbYesNo). Além disso, dominará a biblioteca essencial de tratamento e higienização de textos (Strings) no VBA (Trim, UCase, LCase, Left, Right, Mid, InStr, Len, Replace), blindando os cadastros corporativos contra erros de digitação e inconsistências de banco de dados.

Ao final deste capítulo, você terá construído o assistente oficial de cadastro e validação de motoristas da FastLog S.A.


🏢 Cenário Prático (FastLog S.A.)

Empresa: FastLog Transportes & Logística Integrada S.A.
Problema: No Centro de Distribuição (CD), a recepção cadastra dezenas de motoristas autônomos por turno. Por pressa, os recepcionistas digitam nomes com espaços excessivos no início e no fim (" Carlos Silva "), placas de veículos em letras minúsculas sem traço ("abc1d23") e documentos com formatação inconsistente. Quando o sistema tenta integrar esses dados com a Polícia Rodoviária Federal e a seguradora de cargas via webservice, os cadastros são rejeitados, travando os caminhões na balança de pesagem por horas.
Sua Missão: Desenvolver o módulo CadastrarMotorista, que coleta os dados via caixas de diálogo interativas, remove espaços indesejados, converte textos para caixa alta padrão, valida o formato da placa veicular e solicita confirmação de gravação ao operador com botões corporativos Sim / Não.


🧠 Fundamentos: A Teoria Traduzida

1. Diálogos Interativos: InputBox e MsgBox

O VBA disponibiliza duas funções fundamentais para comunicação bidirecional com quem opera a planilha:

flowchart TD
    SUB["Rotina VBA"] --> IB["📥 InputBox('Digite a Placa:', 'Cadastro')<br/>Coleta texto digitado pelo usuário"]
    IB --> PROC["⚙️ Sanitização e Tratamento de String<br/>Trim, UCase, Replace, InStr"]
    PROC --> MB{"❓ MsgBox('Confirma gravação?', vbYesNo)<br/>Captura resposta do usuário"}
    MB -- vbYes --> GRAVA["💾 Grava na Linha da Planilha"]
    MB -- vbNo --> CANCELA["🚫 Cancela Operação sem Alterar Dados"]

    style SUB fill:#1a365d,stroke:#fff,stroke-width:2px,color:#fff
    style IB fill:#2980b9,stroke:#fff,stroke-width:2px,color:#fff
    style PROC fill:#f39c12,stroke:#fff,stroke-width:2px,color:#fff
    style MB fill:#8e44ad,stroke:#fff,stroke-width:2px,color:#fff
    style GRAVA fill:#27ae60,stroke:#fff,stroke-width:2px,color:#fff
    style CANCELA fill:#c0392b,stroke:#fff,stroke-width:2px,color:#fff
  • InputBox: Abre uma janela solicitando que o usuário digite um valor.
    1
    
    strNome = InputBox("Digite o nome completo do motorista:", "FastLog Cadastro")
  • MsgBox com Retorno: Para capturar o clique do operador, usamos parênteses e atribuímos a uma variável do tipo VbMsgBoxResult:
    1
    2
    3
    4
    5
    
    Dim intResposta As VbMsgBoxResult
    intResposta = MsgBox("Deseja confirmar o despacho?", vbYesNo + vbQuestion, "Confirmação")
    If intResposta = vbYes Then
        ' Código para gravar
    End If

2. A Biblioteca de Higienização de Strings do VBA

FunçãoO que ela faz?Exemplo PráticoRetorno Obtido
Trim(texto)Remove espaços inúteis no início e no finalTrim(" FastLog ")"FastLog"
UCase(texto)Converte todas as letras para MAIÚSCULASUCase("scania r450")"SCANIA R450"
LCase(texto)Converte todas as letras para minúsculasLCase("CONTATO@FASTLOG.COM")"contato@fastlog.com"
Len(texto)Retorna o comprimento (número de caracteres)Len("BRA2E19")7
Left(texto, n)Extrai os primeiros n caracteres à esquerdaLeft("BRA2E19", 3)"BRA"
Right(texto, n)Extrai os últimos n caracteres à direitaRight("SP-CAMPINAS", 8)"CAMPINAS"
Mid(texto, ini, n)Extrai n caracteres a partir da posição iniMid("11988887777", 3, 5)"98888"
InStr(texto, busca)Procura a posição onde uma palavra ou caractere surgeInStr("user@fastlog.com", "@")5
Replace(texto, de, para)Substitui ocorrências de um caractere por outroReplace("123.456.789-00", ".", "")"123456789-00"

📖 Exemplo Guiado: Passo a Passo no Laboratório

No Excel, abra o VBE com Alt + F11.

Passo 1: Inserção do Módulo de Tratamento de Dados

  1. No menu superior, clique em Inserir ➔ Módulo.
  2. Na janela de propriedades (F4), renomeie o módulo para: modCadastroMotoristas.
  3. Verifique se o Option Explicit está presente na primeira linha.

Passo 2: Teste Rápido de Sanitização na Janela Imediata

Pressione Ctrl + G e digite a instrução de teste:

1
? UCase(Trim("   carlos eduardo da silva   "))

Pressione Enter. O VBE retornará imediatamente:

1
CARLOS EDUARDO DA SILVA

🛠️ Prática Obrigatória 1: Assistente Interativo de Cadastro com InputBox

Desenvolveremos a rotina que solicita o nome, a placa do caminhão e a CNH do motorista, sanitizando cada campo antes de gravar na primeira linha vazia da planilha.

Passo a Passo no Computador:

  1. No módulo modCadastroMotoristas, digite o seguinte código:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    
    Option Explicit
    
    Sub CadastrarMotorista()
        Dim strNomeBruto As String
        Dim strNomeLimpo As String
        Dim strPlacaBruta As String
        Dim strPlacaLimpa As String
        Dim strCNH As String
        Dim lngProximaLinha As Long
        Dim ws As Worksheet
    
        Set ws = ThisWorkbook.Worksheets(1)
    
        ' 1. Coleta dos Dados via InputBox
        strNomeBruto = InputBox("Digite o Nome Completo do Motorista:", "FastLog - Cadastro Operacional")
        If Trim(strNomeBruto) = "" Then
            MsgBox "Operação cancelada! O nome não pode ficar em branco.", vbExclamation, "Aviso"
            Exit Sub
        End If
    
        strPlacaBruta = InputBox("Digite a Placa do Veículo (ex: ABC1234 ou ABC1D23):", "FastLog - Cadastro Operacional")
        If Trim(strPlacaBruta) = "" Then
            MsgBox "Operação cancelada! A placa é obrigatória.", vbExclamation, "Aviso"
            Exit Sub
        End If
    
        strCNH = InputBox("Digite o número da CNH:", "FastLog - Cadastro Operacional")
    
        ' 2. Processamento e Higienização de Strings
        ' Remove espaços externos e converte para maiúsculas
        strNomeLimpo = UCase(Trim(strNomeBruto))
    
        ' Remove traços, pontos ou espaços da placa e deixa em maiúsculas
        strPlacaLimpa = Replace(strPlacaBruta, "-", "")
        strPlacaLimpa = Replace(strPlacaLimpa, " ", "")
        strPlacaLimpa = UCase(Trim(strPlacaLimpa))
    
        ' Higienização da CNH (apenas números)
        strCNH = Trim(strCNH)
    
        ' 3. Localização da próxima linha livre na coluna A
        lngProximaLinha = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
    
        ' 4. Gravação na Planilha
        ws.Cells(lngProximaLinha, 1).Value = lngProximaLinha - 1   ' ID sequencial
        ws.Cells(lngProximaLinha, 2).Value = strNomeLimpo
        ws.Cells(lngProximaLinha, 3).Value = strPlacaLimpa
        ws.Cells(lngProximaLinha, 4).Value = strCNH
        ws.Cells(lngProximaLinha, 5).Value = Now                   ' Timestamp de registro
    
        ' Formatação
        ws.Cells(lngProximaLinha, 5).NumberFormat = "dd/mm/yyyy hh:mm:ss"
        ws.Columns("A:E").AutoFit
    
        MsgBox "Motorista " & strNomeLimpo & " cadastrado com sucesso na linha " & lngProximaLinha & "!", vbInformation, "FastLog Sucesso"
    End Sub
  2. Preparação dos Cabeçalhos na Planilha:

    • Na linha 1 da primeira planilha, certifique-se de ter os cabeçalhos:
      • A1: ID | B1: Nome_Motorista | C1: Placa_Veiculo | D1: CNH | E1: Data_Hora_Registro
  3. Teste Prático:

    • Pressione F5 no VBE para rodar a macro.
    • Quando o InputBox pedir o nome, digite intencionalmente com erros: " marcos aurelio fonseca ".
    • Quando pedir a placa, digite: " bra-2e19 ".
    • Digite a CNH: "12345678900".
    • Veja o resultado gravado na planilha perfeitamente padronizado!

✅ Resultado Esperado (Prática 1):

A planilha recebe na linha 2:

  • ID: 1
  • Nome: MARCOS AURELIO FONSECA
  • Placa: BRA2E19
  • CNH: 12345678900
  • Data/Hora: Data e hora exatas do registro.

🛠️ Prática Obrigatória 2: Validação de Placa e Confirmação com MsgBox(vbYesNo)

Agora adicionaremos uma camada de validação inteligente: verificaremos se a placa possui exatamente 7 caracteres (padrão Brasil/Mercosul) e exigiremos confirmação do operador antes de persistir os dados na planilha.

Passo a Passo no Computador:

  1. No mesmo módulo, atualize o procedimento adicionando o bloco de validação e confirmação:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    
    Sub CadastrarMotoristaComValidacao()
        Dim strNome As String
        Dim strPlaca As String
        Dim strCNH As String
        Dim intResp As VbMsgBoxResult
        Dim lngLinha As Long
        Dim ws As Worksheet
    
        Set ws = ThisWorkbook.Worksheets(1)
    
        ' Coleta e sanitização inicial
        strNome = UCase(Trim(InputBox("Nome Completo:", "Recepção FastLog")))
        If strNome = "" Then Exit Sub
    
        strPlaca = UCase(Replace(Replace(InputBox("Placa do Veículo:", "Recepção FastLog"), "-", ""), " ", ""))
        If strPlaca = "" Then Exit Sub
    
        ' Validação do comprimento da placa brasileira (exatamente 7 caracteres)
        If Len(strPlaca) <> 7 Then
            MsgBox "ERRO DE FORMATO: A placa '" & strPlaca & "' possui " & Len(strPlaca) & _
                   " caracteres. Uma placa válida deve conter exatamente 7 caracteres!", _
                   vbCritical, "Validação de Frotas FastLog"
            Exit Sub
        End If
    
        strCNH = Trim(InputBox("Número da CNH:", "Recepção FastLog"))
    
        ' Confirmação interativa com vbYesNo
        intResp = MsgBox("Confirma o cadastro do veículo e motorista?" & vbCrLf & vbCrLf & _
                         "• Motorista: " & strNome & vbCrLf & _
                         "• Placa Higienizada: " & strPlaca & vbCrLf & _
                         "• CNH: " & strCNH, _
                         vbYesNo + vbQuestion, "Homologação de Entrada")
    
        If intResp = vbYes Then
            lngLinha = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
            ws.Cells(lngLinha, 1).Value = lngLinha - 1
            ws.Cells(lngLinha, 2).Value = strNome
            ws.Cells(lngLinha, 3).Value = strPlaca
            ws.Cells(lngLinha, 4).Value = strCNH
            ws.Cells(lngLinha, 5).Value = Now
            ws.Cells(lngLinha, 5).NumberFormat = "dd/mm/yyyy hh:mm:ss"
            ws.Columns("A:E").AutoFit
    
            MsgBox "Registro gravado com sucesso!", vbInformation, "Concluído"
        Else
            MsgBox "Cadastro descartado pelo operador.", vbInformation, "Cancelado"
        End If
    End Sub
  2. Execute a macro com F5:
    • Teste digitar uma placa com tamanho inválido ("ABC12"). O sistema deve travar e exibir o alerta vermelho vbCritical.
    • Teste com uma placa válida de 7 caracteres ("RIO2A18"). O sistema apresentará a caixa de confirmação com resumo dos dados e botões Sim e Não.
    • Ao clicar em Não, nada é gravado. Ao clicar em Sim, a linha é preenchida!

✅ Resultado Esperado (Prática 2):

O operador é guiado por uma interface amigável, prevenindo inserções incompletas e confirmando os dados antes de gravar.


📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_04_VBA_SeuNome_SeuSobrenome.xlsm.
  2. Acesse a plataforma Microsoft Teams.
  3. Abra a tarefa: “VBA - Cap 04: Sanitização de Strings e Diálogos”.
  4. Anexe o arquivo .xlsm e envie.

💡 Checkpoint de Gestão & TI

Em arquitetura de TI corporativa, vigora o axioma GIGO (Garbage In, Garbage Out): se dados inválidos entrarem no sistema, relatórios gerenciais e inteligência artificial produzirão resultados corrompidos. Ao implementar sanitização na camada de interface com funções como Trim, Replace e validações de tamanho com Len, o desenvolvedor garante a integridade dos dados na origem, poupando custos exorbitantes de saneamento de dados na TI central.


🔥 Desafio de Fixação: Máscara Automática de Placa e Validação de E-mail

Incremente a rotina com mais duas sanitizações profissionais:

  1. Se a placa digitada possuir o padrão antigo (3 letras seguidas de 4 números), formate-a com o hífen oficial no meio utilizando as funções Left e Right:
    1
    2
    
    Dim strPlacaFormatada As String
    strPlacaFormatada = Left(strPlaca, 3) & "-" & Right(strPlaca, 4)
  2. Adicione a coleta do e-mail do motorista e valide se ele contém o caractere @ utilizando a função InStr:
    1
    2
    3
    
    If InStr(strEmail, "@") = 0 Then
        MsgBox "E-mail corporativo inválido!", vbCritical, "Aviso"
    End If

🔑 Revelar Gabarito Oficial de Laboratório (Clique para expandir)
💡 Incentivo Pedagógico: Tente resolver as práticas e o desafio de fixação por conta própria antes de abrir o gabarito. Seus erros e tentativas durante o laboratório são a chave para a consolidação real do aprendizado!

Código Oficial do Assistente (modCadastroMotoristas):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Option Explicit

Sub CadastrarMotoristaFinal()
    Dim strNome As String
    Dim strPlaca As String
    Dim strCNH As String
    Dim strEmail As String
    Dim intResp As VbMsgBoxResult
    Dim lngLinha As Long
    Dim ws As Worksheet
    
    Set ws = ThisWorkbook.Worksheets(1)
    
    ' 1. Entrada e Limpeza de Nome
    strNome = UCase(Trim(InputBox("Nome Completo do Motorista:", "Cadastro FastLog")))
    If strNome = "" Then Exit Sub
    
    ' 2. Entrada e Limpeza da Placa
    strPlaca = UCase(Replace(Replace(Trim(InputBox("Placa do Veículo:", "Cadastro FastLog")), "-", ""), " ", ""))
    If Len(strPlaca) <> 7 Then
        MsgBox "Placa inválida! Deve possuir exatamente 7 caracteres.", vbCritical, "Erro de Validação"
        Exit Sub
    End If
    
    ' 3. Entrada da CNH
    strCNH = Trim(InputBox("Número da CNH:", "Cadastro FastLog"))
    If strCNH = "" Then Exit Sub
    
    ' 4. Validação de E-mail com InStr (Desafio de Fixação)
    strEmail = LCase(Trim(InputBox("E-mail para comprovante:", "Cadastro FastLog")))
    If InStr(strEmail, "@") = 0 Or InStr(strEmail, ".") = 0 Then
        MsgBox "Formato de e-mail inválido! Deve conter '@' e ponto.", vbCritical, "Erro de Validação"
        Exit Sub
    End If
    
    ' 5. Confirmação
    intResp = MsgBox("Confirma a inclusão do motorista?" & vbCrLf & vbCrLf & _
                     "Nome: " & strNome & vbCrLf & _
                     "Placa: " & strPlaca & vbCrLf & _
                     "CNH: " & strCNH & vbCrLf & _
                     "E-mail: " & strEmail, _
                     vbYesNo + vbQuestion, "Confirmar Gravação")
                     
    If intResp = vbYes Then
        lngLinha = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row + 1
        ws.Cells(lngLinha, 1).Value = lngLinha - 1
        ws.Cells(lngLinha, 2).Value = strNome
        ws.Cells(lngLinha, 3).Value = strPlaca
        ws.Cells(lngLinha, 4).Value = strCNH
        ws.Cells(lngLinha, 5).Value = strEmail
        ws.Cells(lngLinha, 6).Value = Now
        ws.Cells(lngLinha, 6).NumberFormat = "dd/mm/yyyy hh:mm:ss"
        
        ws.Columns("A:F").AutoFit
        MsgBox "Motorista gravado com sucesso no registro " & (lngLinha - 1) & "!", vbInformation, "Sucesso"
    End If
End Sub

📝 Atividade Extra: Questionário de Fixação (Caderno)

Instruções: Responda no caderno, de próprio punho, as 10 perguntas abaixo com base no que você estudou neste capítulo. Ao concluir, apresente o caderno ao professor para visto.

  1. Qual é a principal diferença entre a função InputBox e a função MsgBox no VBA?
  2. Como fazemos para capturar o botão exato clicado pelo usuário em uma caixa de mensagem configurada com vbYesNo?
  3. O que a função Trim faz com uma string e por que ela é indispensável em formulários corporativos?
  4. Qual é a utilidade prática das funções UCase e LCase na padronização de cadastros de clientes e motoristas?
  5. O que a função Len retorna e como ela foi usada no laboratório para validar a placa veicular?
  6. Explique o funcionamento da função Replace e cite um exemplo em que ela remove caracteres indesejados.
  7. Para que serve a função Mid(texto, inicio, tamanho) e como ela difere das funções Left e Right?
  8. Qual valor a função InStr retorna quando o caractere pesquisado (por exemplo, @) não é encontrado dentro da string?
  9. O que representa a constante de sistema vbCrLf na montagem de mensagens formatadas na caixa de diálogo?
  10. O que significa o conceito de TI “Garbage In, Garbage Out” (GIGO) e de que forma a sanitização de strings previne problemas na empresa?