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

Caixas de Mensagem e Caixas de Entrada

Deslize para mostrar o menu

Antes de criar um formulário completo, vale a pena dominar as duas formas mais simples de o VBA interagir com o usuário: MsgBox, que exibe informações e opcionalmente faz uma pergunta, e InputBox, que solicita um pequeno texto de resposta.

MsgBox

Na sua forma mais simples, MsgBox apenas exibe uma mensagem e espera o usuário clicar em OK:

MsgBox "Customer saved successfully."

Usado dessa forma — como uma instrução, sem parênteses e sem capturar um resultado — MsgBox é um ponto final: mostra a mensagem e o código continua, independentemente do que o usuário faz. No momento em que você precisa saber qual botão foi clicado, MsgBox se torna uma função em vez de uma instrução, o que significa que precisa de parênteses e de algo para armazenar seu resultado:

result = MsgBox("Delete customer Urban Retail?", _
    vbYesNo + vbQuestion, "Confirm Delete")
Figura 5.1

vbYesNo e vbQuestion são somados com um simples +, o que pode parecer incomum à primeira vista, mas é apenas a forma como o VBA permite combinar duas configurações independentes — quais botões aparecem e qual ícone é exibido — no único segundo argumento que o MsgBox espera. result retorna como uma das constantes internas do VBA, vbYes ou vbNo, que na verdade são apenas números disfarçados (6 e 7, embora você nunca deva escrever o número literal). Controle uma ação com base na resposta usando um simples If:

If result = vbYes Then
    ' proceed with deletion
End If

InputBox

Enquanto o MsgBox sempre retorna um conjunto fixo de constantes de botão, o InputBox solicita que o usuário digite algo e retorna exatamente o que foi inserido:

city = InputBox("Enter a City to search for:", _
    "Search Customers", "Chicago")
Figura 5.2

O terceiro argumento, "Chicago" neste caso, pré-preenche a caixa de texto — útil para sugerir uma resposta provável que o usuário pode aceitar ou sobrescrever. Dois detalhes são fáceis de errar na primeira vez: qualquer coisa que o usuário digite será retornada como uma String, independentemente da aparência, então ao digitar 25 você recebe o texto "25", e não o número 25, sendo necessário usar CInt ou CDbl antes de realizar operações aritméticas; e ao clicar em Cancelar não ocorre erro nem a execução do código é interrompida — simplesmente retorna uma string vazia (""), que seu código precisa verificar explicitamente caso uma resposta vazia não seja válida.

Solicitações e Confirmações do Usuário

A combinação dos dois é o padrão para qualquer ação que lê uma entrada do usuário e depois precisa de confirmação antes de executar algo arriscado:

Dim searchCity As String
Dim confirmMsg As VbMsgBoxResult
 
searchCity = InputBox("Enter a City to search for:", "Search Customers")
 
If searchCity = "" Then
    MsgBox "Search cancelled — no city entered."
    Exit Sub
End If

confirmMsg = MsgBox("Search for customers in " & searchCity & "?", vbYesNo)
If confirmMsg = vbNo Then Exit Sub
 
' ... proceed with the search

Observe que confirmMsg é declarado como As VbMsgBoxResult em vez de um tipo genérico — este é o tipo nomeado que o VBA utiliza para o valor de retorno do MsgBox, e declará-lo explicitamente (em vez de deixar como Variant) permite que o VBE ofereça autocompletar para vbYes, vbNo e os demais enquanto você digita. A verificação de string vazia após o InputBox e a verificação de vbNo após o MsgBox utilizam o mesmo padrão de escape, Exit Sub, que interrompe o procedimento imediatamente em vez de permitir que o código continue assumindo que existe uma entrada válida.

Tarefa

  1. Escrever um Sub que utilize o InputBox para solicitar um ID de Cliente e, em seguida, utilize o MsgBox para confirmar "Excluir cliente [ID]?" com botões Sim/Não e ícone de pergunta.
  2. Tratar tanto o caso de string vazia (usuário clicou Cancelar no InputBox) quanto o caso vbNo (usuário recusou a confirmação) encerrando o Sub antecipadamente com uma mensagem explicando que nada aconteceu.
  3. Somente quando ambas as verificações forem aprovadas, exibir uma MsgBox final informando "O cliente seria excluído aqui."
Dica
expand arrow

1. Obtendo o ID do Cliente e construindo a confirmação

  • O InputBox precisa de uma mensagem e pode receber um título como segundo argumento — armazene o valor retornado em uma variável do tipo String.
  • A mensagem de confirmação precisa do ID real concatenado com &, não digitado como uma string fixa — caso contrário, sempre exibirá literalmente "[ID]".
  • O MsgBox usado como função (capturando um resultado) precisa de parênteses; combine vbYesNo e vbQuestion com +.

2. Tratando Cancelar e Não

  • Verifique o caso de string vazia logo após a linha do InputBox, antes mesmo de tentar construir a mensagem de confirmação — não faz sentido perguntar "Excluir cliente?" se não há ID para excluir.
  • Exit Sub interrompe o procedimento imediatamente onde for colocado — utilize-o dentro de cada bloco If, com um MsgBox logo antes explicando que nada aconteceu.
  • A verificação de vbNo ocorre após o MsgBox de confirmação, comparando o resultado capturado com a constante vbNo.

3. A confirmação final

  • Esta linha só será executada se a execução chegar até ela — como ambas as verificações anteriores usam Exit Sub em caso de falha, simplesmente colocar este MsgBox após ambas garante que ele só será exibido quando ambas forem aprovadas.
Solução
expand arrow
Option Explicit

Sub DeleteCustomerPrompt()
    Dim customerID As String
    Dim confirmResult As VbMsgBoxResult

    ' Step 1 — ask for the Customer ID
    customerID = InputBox("Enter the Customer ID to delete:", "Delete Customer")

    ' Step 2a — handle Cancel / empty input
    If customerID = "" Then
        MsgBox "Cancelled — no Customer ID was entered. Nothing happened."
        Exit Sub
    End If

    ' Step 1 (continued) — confirm with Yes/No
    confirmResult = MsgBox("Delete customer " & customerID & "?", _
        vbYesNo + vbQuestion, "Confirm Delete")

    ' Step 2b — handle No
    If confirmResult = vbNo Then
        MsgBox "Cancelled — deletion was not confirmed. Nothing happened."
        Exit Sub
    End If

    ' Step 3 — both checks passed
    MsgBox "Customer would be deleted here."
End Sub

Execute (F5) e teste os três caminhos: clique em Cancelar no InputBox, clique em Não na confirmação e, por fim, insira um ID e clique em Sim — cada um deve exibir uma das três mensagens diferentes.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 5. Capítulo 1

Pergunte à IA

expand

Pergunte à IA

ChatGPT

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

Caixas de Mensagem e Caixas de Entrada

Antes de criar um formulário completo, vale a pena dominar as duas formas mais simples de o VBA interagir com o usuário: MsgBox, que exibe informações e opcionalmente faz uma pergunta, e InputBox, que solicita um pequeno texto de resposta.

MsgBox

Na sua forma mais simples, MsgBox apenas exibe uma mensagem e espera o usuário clicar em OK:

MsgBox "Customer saved successfully."

Usado dessa forma — como uma instrução, sem parênteses e sem capturar um resultado — MsgBox é um ponto final: mostra a mensagem e o código continua, independentemente do que o usuário faz. No momento em que você precisa saber qual botão foi clicado, MsgBox se torna uma função em vez de uma instrução, o que significa que precisa de parênteses e de algo para armazenar seu resultado:

result = MsgBox("Delete customer Urban Retail?", _
    vbYesNo + vbQuestion, "Confirm Delete")
Figura 5.1

vbYesNo e vbQuestion são somados com um simples +, o que pode parecer incomum à primeira vista, mas é apenas a forma como o VBA permite combinar duas configurações independentes — quais botões aparecem e qual ícone é exibido — no único segundo argumento que o MsgBox espera. result retorna como uma das constantes internas do VBA, vbYes ou vbNo, que na verdade são apenas números disfarçados (6 e 7, embora você nunca deva escrever o número literal). Controle uma ação com base na resposta usando um simples If:

If result = vbYes Then
    ' proceed with deletion
End If

InputBox

Enquanto o MsgBox sempre retorna um conjunto fixo de constantes de botão, o InputBox solicita que o usuário digite algo e retorna exatamente o que foi inserido:

city = InputBox("Enter a City to search for:", _
    "Search Customers", "Chicago")
Figura 5.2

O terceiro argumento, "Chicago" neste caso, pré-preenche a caixa de texto — útil para sugerir uma resposta provável que o usuário pode aceitar ou sobrescrever. Dois detalhes são fáceis de errar na primeira vez: qualquer coisa que o usuário digite será retornada como uma String, independentemente da aparência, então ao digitar 25 você recebe o texto "25", e não o número 25, sendo necessário usar CInt ou CDbl antes de realizar operações aritméticas; e ao clicar em Cancelar não ocorre erro nem a execução do código é interrompida — simplesmente retorna uma string vazia (""), que seu código precisa verificar explicitamente caso uma resposta vazia não seja válida.

Solicitações e Confirmações do Usuário

A combinação dos dois é o padrão para qualquer ação que lê uma entrada do usuário e depois precisa de confirmação antes de executar algo arriscado:

Dim searchCity As String
Dim confirmMsg As VbMsgBoxResult
 
searchCity = InputBox("Enter a City to search for:", "Search Customers")
 
If searchCity = "" Then
    MsgBox "Search cancelled — no city entered."
    Exit Sub
End If

confirmMsg = MsgBox("Search for customers in " & searchCity & "?", vbYesNo)
If confirmMsg = vbNo Then Exit Sub
 
' ... proceed with the search

Observe que confirmMsg é declarado como As VbMsgBoxResult em vez de um tipo genérico — este é o tipo nomeado que o VBA utiliza para o valor de retorno do MsgBox, e declará-lo explicitamente (em vez de deixar como Variant) permite que o VBE ofereça autocompletar para vbYes, vbNo e os demais enquanto você digita. A verificação de string vazia após o InputBox e a verificação de vbNo após o MsgBox utilizam o mesmo padrão de escape, Exit Sub, que interrompe o procedimento imediatamente em vez de permitir que o código continue assumindo que existe uma entrada válida.

Tarefa

  1. Escrever um Sub que utilize o InputBox para solicitar um ID de Cliente e, em seguida, utilize o MsgBox para confirmar "Excluir cliente [ID]?" com botões Sim/Não e ícone de pergunta.
  2. Tratar tanto o caso de string vazia (usuário clicou Cancelar no InputBox) quanto o caso vbNo (usuário recusou a confirmação) encerrando o Sub antecipadamente com uma mensagem explicando que nada aconteceu.
  3. Somente quando ambas as verificações forem aprovadas, exibir uma MsgBox final informando "O cliente seria excluído aqui."
Dica
expand arrow

1. Obtendo o ID do Cliente e construindo a confirmação

  • O InputBox precisa de uma mensagem e pode receber um título como segundo argumento — armazene o valor retornado em uma variável do tipo String.
  • A mensagem de confirmação precisa do ID real concatenado com &, não digitado como uma string fixa — caso contrário, sempre exibirá literalmente "[ID]".
  • O MsgBox usado como função (capturando um resultado) precisa de parênteses; combine vbYesNo e vbQuestion com +.

2. Tratando Cancelar e Não

  • Verifique o caso de string vazia logo após a linha do InputBox, antes mesmo de tentar construir a mensagem de confirmação — não faz sentido perguntar "Excluir cliente?" se não há ID para excluir.
  • Exit Sub interrompe o procedimento imediatamente onde for colocado — utilize-o dentro de cada bloco If, com um MsgBox logo antes explicando que nada aconteceu.
  • A verificação de vbNo ocorre após o MsgBox de confirmação, comparando o resultado capturado com a constante vbNo.

3. A confirmação final

  • Esta linha só será executada se a execução chegar até ela — como ambas as verificações anteriores usam Exit Sub em caso de falha, simplesmente colocar este MsgBox após ambas garante que ele só será exibido quando ambas forem aprovadas.
Solução
expand arrow
Option Explicit

Sub DeleteCustomerPrompt()
    Dim customerID As String
    Dim confirmResult As VbMsgBoxResult

    ' Step 1 — ask for the Customer ID
    customerID = InputBox("Enter the Customer ID to delete:", "Delete Customer")

    ' Step 2a — handle Cancel / empty input
    If customerID = "" Then
        MsgBox "Cancelled — no Customer ID was entered. Nothing happened."
        Exit Sub
    End If

    ' Step 1 (continued) — confirm with Yes/No
    confirmResult = MsgBox("Delete customer " & customerID & "?", _
        vbYesNo + vbQuestion, "Confirm Delete")

    ' Step 2b — handle No
    If confirmResult = vbNo Then
        MsgBox "Cancelled — deletion was not confirmed. Nothing happened."
        Exit Sub
    End If

    ' Step 3 — both checks passed
    MsgBox "Customer would be deleted here."
End Sub

Execute (F5) e teste os três caminhos: clique em Cancelar no InputBox, clique em Não na confirmação e, por fim, insira um ID e clique em Sim — cada um deve exibir uma das três mensagens diferentes.

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

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