Lista de Desafios de Fixação e Gabaritos (20 Capítulos)

Estes desafios espelham exatamente o "🔥 Desafio de Fixação" apresentado ao final de cada capítulo do curso de Lógica de Programação & Automação com VBA (Visual Basic for Applications). Eles servem como consulta rápida para o professor ou como material de aprofundamento para alunos que concluem as práticas de laboratório antes do tempo previsto.


🧱 Módulo 1: O Ambiente VBE, Modelo de Objetos & Fundamentos (Cap 01 a 04)

Capítulo 01 - Notificação Conclusiva com Caixa de Mensagem (MsgBox)

  • Enunciado: Incremente o procedimento FormatarRelatorioPortaria adicionando um alerta sonoro e visual oficial do Windows ao final da formatação, avisando o operador que a automação foi concluída com sucesso com o ícone de informação (vbInformation).
  • Gabarito:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Sub FormatarRelatorioPortaria()
    With Range("A1:E1")
        .Font.Name = "Segoe UI"
        .Font.Size = 11
        .Font.Bold = True
        .Font.Color = RGB(255, 255, 255)
        .Interior.Color = RGB(0, 51, 102)
        .HorizontalAlignment = xlCenter
    End With
    Columns("A:E").AutoFit
    MsgBox "Relatório da Portaria FastLog formatado com sucesso!", vbInformation, "Automação Concluída"
End Sub

Capítulo 02 - Cálculo de Pedágios Rodoviários com Operadores Especiais

  • Enunciado: Na macro CalcularFreteExpedicao, adicione uma constante TAXA_PEDAGIO_POR_EIXO As Currency = 9.8. Leia a quantidade de eixos do caminhão na célula J2 e calcule o custo total de pedágio considerando uma praça de pedágio a cada 100 km inteiros rodados ((dblDistanciaKm \ 100) * (lngEixos * TAXA_PEDAGIO_POR_EIXO)). Some o pedágio ao total do frete e grave na célula K2.
  • Gabarito:
1
2
3
4
5
6
7
8
9
Const TAXA_PEDAGIO_POR_EIXO As Currency = 9.8
Dim lngEixos As Long, curValorPedagio As Currency

lngEixos = IIf(Range("J2").Value = "", 3, CLng(Range("J2").Value))
curValorPedagio = (dblDistanciaKm \ 100) * (lngEixos * TAXA_PEDAGIO_POR_EIXO)
curFreteTotal = curFreteTotal + curValorPedagio

Range("K2").Value = curValorPedagio
Range("K2").NumberFormat = "R$ #,##0.00"

Capítulo 03 - Proteção de Abas com Senha Corporativa

  • Enunciado: No gerador automático de abas regionais GerarEstruturaFiliais, aplique a proteção de planilhas com senha em cada aba criada para impedir que operadores alterem acidentalmente os cabeçalhos institucionais.
  • Gabarito:
1
wsNova.Protect Password:="FastLog2026", DrawingObjects:=True, Contents:=True, Scenarios:=True

Capítulo 04 - Máscara Automática de Placa e Validação de E-mail

  • Enunciado: No assistente de cadastro de motoristas, verifique se o e-mail digitado contém os caracteres obrigatórios @ e . utilizando a função InStr. Caso contrário, exiba um alerta vbCritical e interrompa a rotina com Exit Sub.
  • Gabarito:
1
2
3
4
5
strEmail = LCase(Trim(InputBox("Digite o e-mail corporativo:", "Cadastro")))
If InStr(strEmail, "@") = 0 Or InStr(strEmail, ".") = 0 Then
    MsgBox "Formato de e-mail inválido! O endereço deve conter '@' e ponto.", vbCritical, "Erro de Validação"
    Exit Sub
End If

⚙️ Módulo 2: Estruturas de Decisão, Laços e Otimização (Cap 05 a 08)

Capítulo 05 - Sobretaxa Adicional de Risco Aduaneiro

  • Enunciado: Adicione ao motor de regras de negócio uma variável curTaxaRisco As Currency. Se a categoria for ELETRONICOS e o valor ultrapassar R$ 300.000, aplique taxa de R$ 1.800,00; se for QUIMICA, aplique R$ 1.200,00; para as demais, zero. Grave o valor calculado na célula G2.
  • Gabarito:
1
2
3
4
5
6
7
Select Case strCategoria
    Case "QUIMICA", "COMBUSTIVEL": curTaxaRisco = 1200
    Case "ELETRONICOS": curTaxaRisco = IIf(curValor > 300000, 1800, 750)
    Case Else: curTaxaRisco = 0
End Select
Range("G2").Value = curTaxaRisco
Range("G2").NumberFormat = "R$ #,##0.00"

Capítulo 06 - Totalizador de Juros Recuperados na Auditoria

  • Enunciado: Durante a varredura determinística de cálculo de atrasos, acumule apenas a diferença gerada de juros na variável curJurosAcumulados As Currency. Ao final, grave o valor na célula H1 da planilha como resumo executivo.
  • Gabarito:
1
2
3
4
5
6
curJurosAcumulados = curJurosAcumulados + (curValorFinal - curValor)
' Ao término do For i = 2 To lngUltimaLinha:
Range("G1").Value = "Total Juros Recuperados:"
Range("H1").Value = curJurosAcumulados
Range("G1:H1").Font.Bold = True
Range("H1").NumberFormat = "R$ #,##0.00"

Capítulo 07 - Rodapé Contábil Automatizado no Extrato

  • Enunciado: Ao concluir a conciliação bancária com Do While, aproveite o índice da primeira linha livre lngLinha para gravar a linha de fechamento: coluna B com "SALDO LÍQUIDO CONCILIADO:", coluna E com curSaldoAcumulado e aplique bordas duplas contábeis (xlDouble).
  • Gabarito:
1
2
3
4
5
6
7
8
With ws.Range(ws.Cells(lngLinha, 1), ws.Cells(lngLinha, 5))
    .Font.Bold = True
    .Interior.Color = RGB(220, 240, 220)
    .Borders(xlEdgeTop).LineStyle = xlDouble
End With
ws.Cells(lngLinha, 2).Value = "SALDO LÍQUIDO CONCILIADO:"
ws.Cells(lngLinha, 5).Value = curSaldoAcumulado
ws.Cells(lngLinha, 5).NumberFormat = "R$ #,##0.00"

Capítulo 08 - Desproteção Global Interativa

  • Enunciado: Construa o procedimento de manutenção DesprotegerTodasAsAbas que solicita a senha via InputBox. Se a senha for "FastLog2026", percorre a pasta inteira com For Each ws In Worksheets e executa .Unprotect.
  • Gabarito:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
Sub DesprotegerTodasAsAbas()
    Dim strSenha As String, ws As Worksheet
    strSenha = InputBox("Digite a senha de administrador:", "Liberação de Abas")
    If strSenha <> "FastLog2026" Then
        MsgBox "Senha incorreta!", vbCritical, "Acesso Negado": Exit Sub
    End If
    For Each ws In ThisWorkbook.Worksheets
        ws.Unprotect Password:=strSenha
    Next ws
    MsgBox "Todas as abas foram desprotegidas!", vbInformation, "Manutenção Ativa"
End Sub

📊 Módulo 3: Vetores, Matrizes e Funções UDF (Cap 09 a 12)

Capítulo 09 - Relatório de Veículos Retidos na SEFAZ

  • Enunciado: Varra a planilha de ocorrências, filtre os veículos com status "RETIDO" e armazene as placas em um vetor dinâmico arrRetidos() As String com ReDim Preserve. Exiba o relatório completo em uma única caixa MsgBox.
  • Gabarito:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
For i = 2 To lngLinhaFinal
    If UCase(Trim(ws.Cells(i, 5).Value)) = "RETIDO" Then
        intContador = intContador + 1
        ReDim Preserve arrRetidos(1 To intContador)
        arrRetidos(intContador) = ws.Cells(i, 2).Value & " (" & ws.Cells(i, 4).Value & ")"
    End If
Next i
If intContador > 0 Then
    For i = 1 To intContador: strRelatorio = strRelatorio & "• " & arrRetidos(i) & vbCrLf: Next i
    MsgBox strRelatorio, vbExclamation, "Auditoria SEFAZ"
End If
Erase arrRetidos

Capítulo 10 - Média Global Ponderada de Consumo de Combustível

  • Enunciado: Carregue os registros de combustível para uma matriz 2D em memória RAM. Acumule dblSomaKm e dblSomaLitros e calcule a média ponderada da frota (dblSomaKm / dblSomaLitros), exibindo o indicador ESG em pop-up.
  • Gabarito:
1
2
3
4
5
6
For r = 1 To UBound(varMatriz, 1)
    dblSomaKm = dblSomaKm + CDbl(varMatriz(r, 3))
    dblSomaLitros = dblSomaLitros + CDbl(varMatriz(r, 4))
Next r
dblMediaGlobal = dblSomaKm / dblSomaLitros
MsgBox "Média Ponderada da Frota: " & Format(dblMediaGlobal, "0.00") & " km/L", vbInformation, "Indicador ESG"

Capítulo 11 - Sub-rotina Modular de Higienização de Células

  • Enunciado: No módulo de utilitários modFastLogUtils, crie a sub-rotina parametrizada Public Sub HigienizarIntervaloCélulas(ByVal rng As Range) que percorre todas as células não numéricas aplicando UCase(Trim(cell.Value)).
  • Gabarito:
1
2
3
4
5
6
7
8
Public Sub HigienizarIntervaloCélulas(ByVal rng As Range)
    Dim c As Range
    For Each c In rng
        If Not IsEmpty(c) And Not IsNumeric(c.Value) Then
            c.Value = UCase(Trim(c.Value))
        End If
    Next c
End Sub

Capítulo 12 - Previsão de Entrega Rodoviária (Lei do Motorista)

  • Enunciado: Construa a função personalizada de planilha =PREVISAOENTREGA(distanciaKm; dataInicio) que calcula o prazo de chegada sabendo que uma carreta pode rodar no máximo 650 km por dia.
  • Gabarito:
1
2
3
4
5
6
Public Function PREVISAOENTREGA(ByVal dblKm As Double, ByVal dtmInicio As Date) As Date
    Dim lngDias As Long
    If dblKm <= 0 Then PREVISAOENTREGA = dtmInicio: Exit Function
    lngDias = -Int(-dblKm / 650) ' Divisão arredondada para cima
    PREVISAOENTREGA = dtmInicio + lngDias
End Function

🖥️ Módulo 4: Interfaces Gráficas e Eventos (Cap 13 a 16)

Capítulo 13 - Inicialização com Data Dinâmica no UserForm

  • Enunciado: No evento UserForm_Initialize do formulário da balança, preencha automaticamente o título da janela com a data corrente formatada e posicione o cursor do teclado no campo de placa.
  • Gabarito:
1
2
3
4
Private Sub UserForm_Initialize()
    Me.Caption = "FastLog S.A. - Balança Operacional (" & Format(Date, "dd/mm/yyyy") & ")"
    txtPlaca.SetFocus
End Sub

Capítulo 14 - Totalizador Financeiro Dinâmico no Formulário

  • Enunciado: No formulário de despacho com ListBox, adicione um rótulo lblTotalDespachado que calcula dinamicamente a soma dos valores de frete listados na grade a cada novo despacho.
  • Gabarito:
1
2
3
4
5
6
Dim i As Long, curTotal As Currency
curTotal = 0
For i = 0 To lstHistorico.ListCount - 1
    curTotal = curTotal + CCur(lstHistorico.List(i, 3))
Next i
lblTotalDespachado.Caption = "Total Expedido no Turno: " & FormatCurrency(curTotal)

Capítulo 15 - Alerta Condicional Reativo com Worksheet_Change

  • Enunciado: No evento reativo Worksheet_Change, caso o status da carga seja alterado para "RETIDO SEFAZ", pinte a linha inteira daquela carga com fundo amarelo e texto marrom de advertência.
  • Gabarito:
1
2
3
4
If UCase(Trim(celula.Value)) = "RETIDO SEFAZ" Then
    celula.EntireRow.Interior.Color = RGB(255, 243, 205)
    celula.Font.Color = RGB(133, 100, 4)
End If

Capítulo 16 - Rollback de Transação Financeira

  • Enunciado: Implemente a técnica de Rollback: capture o valor original da célula antes de iniciar o cálculo em uma variável de backup. Se o bloco TratarErro: for acionado, restaure o valor original e notifique a TI.
  • Gabarito:
1
2
3
4
5
6
7
curBackup = ws.Range("C2").Value
' ... Execução ...
Exit Sub
TratarErro:
ws.Range("C2").Value = curBackup
ws.Range("D2").Value = "CANCELADO: ROLLBACK ATIVO"
Call RegistrarLogErro(Err.Number, Err.Description, "ProcessamentoFinanceiro")

🌐 Módulo 5: Integração, Interoperabilidade e Go-Live (Cap 17 a 20)

Capítulo 17 - Cópia de Segurança Diária com FSO

  • Enunciado: Crie a macro RealizarBackupDiario utilizando o objeto Scripting.FileSystemObject para copiar a pasta de trabalho atual para C:\FastLog_Backups\Backup_YYYYMMDD_HHNNSS.xlsm.
  • Gabarito:
1
2
3
4
5
6
7
8
Sub RealizarBackupDiario()
    Dim fso As Object, strDestino As String
    Set fso = CreateObject("Scripting.FileSystemObject")
    If Not fso.FolderExists("C:\FastLog_Backups") Then fso.CreateFolder "C:\FastLog_Backups"
    strDestino = "C:\FastLog_Backups\Backup_FastLog_" & Format(Now, "yyyymmdd_hhnnss") & ".xlsm"
    fso.CopyFile ThisWorkbook.FullName, strDestino, True
    MsgBox "Backup salvo em: " & strDestino, vbInformation, "Segurança FSO"
End Sub

Capítulo 18 - Cópia Oculta de Auditoria e Limpeza de Arquivo Temporário

  • Enunciado: No disparo em lote pelo Outlook, adicione cópia oculta para auditoria.faturamento@fastlog.com.br e delete o arquivo PDF temporário gerado na Área de Trabalho com o comando nativo Kill.
  • Gabarito:
1
2
3
4
.BCC = "auditoria.faturamento@fastlog.com.br"
.Attachments.Add strCaminhoPDF
.Send
Kill strCaminhoPDF ' Exclui o arquivo temporário do disco

Capítulo 19 - Consulta SQL Parametrizada por Célula do Excel

  • Enunciado: Na consulta ADODB, leia a categoria informada na célula H1 da planilha (ex: "Filtros") e monte a instrução SQL filtrando apenas os itens daquela categoria que estejam com estoque crítico.
  • Gabarito:
1
2
3
4
5
6
strSQL = "SELECT CodigoPeca, NomePeca, Categoria, QtdEstoque, EstoqueMinimo, PrecoUnitario " & _
         "FROM Pecas WHERE QtdEstoque <= EstoqueMinimo "
If Trim(ws.Range("H1").Value) <> "" Then
    strSQL = strSQL & "AND Categoria = '" & Replace(Trim(ws.Range("H1").Value), "'", "''") & "' "
End If
strSQL = strSQL & "ORDER BY QtdEstoque ASC;"

Capítulo 20 - Botão de Acionamento Executivo com Ícone

  • Enunciado: No Dashboard Executivo do robô FastLog RPA Enterprise 1.0, desenhe um botão com cantos arredondados, preencha com gradiente azul e vincule o procedimento mestre de homologação TesteHomologacaoRPA.
  • Gabarito:
1
2
3
' Atribuição visual na planilha do Excel:
' Guia Inserir > Ilustrações > Formas > Retângulo com Cantos Arredondados
' Clique com botão direito > Atribuir Macro > Selecione: TesteHomologacaoRPA