Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Cuadros de Mensaje y Cuadros de Entrada | Interacción con el Usuario
Excel VBA para Automatización Empresarial

Cuadros de Mensaje y Cuadros de Entrada

Desliza para mostrar el menú

Antes de crear un formulario completo, conviene dominar las dos formas más sencillas en que VBA puede interactuar con un usuario: MsgBox, que muestra información y opcionalmente realiza una pregunta, e InputBox, que solicita una breve entrada de texto.

MsgBox

En su forma más simple, MsgBox solo muestra un mensaje y espera a que el usuario haga clic en OK:

MsgBox "Customer saved successfully."

Usado de esta manera — como una instrucción, sin paréntesis y sin capturar ningún resultado — MsgBox es un callejón sin salida: muestra el mensaje y el código continúa, independientemente de lo que haga el usuario. En el momento en que necesitas saber qué botón fue presionado, MsgBox se convierte en una función en lugar de una instrucción, lo que significa que requiere paréntesis y algo para almacenar su resultado:

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

vbYesNo y vbQuestion se suman con un simple +, lo cual puede parecer inusual la primera vez que lo ves, pero es simplemente la manera en que VBA permite combinar dos configuraciones independientes — qué botones aparecen y qué icono se muestra — en el único segundo argumento que MsgBox espera. result devuelve uno de los valores constantes integrados de VBA, vbYes o vbNo, que en realidad son solo números disfrazados (6 y 7, aunque nunca escribirías el número literal). Controla una acción según la respuesta con un simple If:

If result = vbYes Then
    ' proceed with deletion
End If

InputBox

Mientras que MsgBox solo devuelve un conjunto fijo de constantes de botón, InputBox solicita al usuario que escriba algo y devuelve exactamente lo que ingresó:

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

El tercer argumento, "Chicago" en este caso, rellena previamente el cuadro de texto — útil para sugerir una respuesta probable que el usuario puede aceptar o sobrescribir. Hay dos detalles que suelen confundirse la primera vez: todo lo que el usuario escriba se devuelve como una cadena (String) sin importar su apariencia, por lo que si escribe 25 obtendrás el texto "25", no el número 25, y necesitarás CInt o CDbl antes de realizar operaciones aritméticas; además, al hacer clic en Cancelar no se genera un error ni se detiene el código — simplemente devuelve una cadena vacía (""), lo cual tu código debe comprobar explícitamente si una respuesta vacía no es válida.

Solicitudes y confirmaciones al usuario

La combinación de ambos es el patrón estándar para cualquier acción que lea la entrada del usuario y luego necesite confirmación antes de realizar algo riesgoso:

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

Observa que confirmMsg se declara As VbMsgBoxResult en lugar de un tipo genérico — este es el tipo nombrado que VBA utiliza realmente para el valor de retorno de MsgBox, y declararlo explícitamente (en vez de dejarlo como Variant) permite que el VBE ofrezca autocompletado para vbYes, vbNo y los demás mientras escribes. La comprobación de cadena vacía después de InputBox y la comprobación de vbNo después de MsgBox utilizan el mismo patrón de escape, Exit Sub, que detiene el procedimiento inmediatamente en lugar de dejar que continúe en un código que asume que existe una entrada válida.

Tarea

  1. Escribir un Sub que utilice InputBox para solicitar un Customer ID, luego MsgBox para confirmar "¿Eliminar cliente [ID]?" con botones Sí/No y un icono de pregunta.
  2. Manejar tanto el caso de cadena vacía (el usuario hizo clic en Cancelar en el InputBox) como el caso vbNo (el usuario rechazó la confirmación) saliendo del Sub de forma anticipada con un mensaje explicando que no ocurrió nada.
  3. Solo cuando ambas comprobaciones se superen, mostrar un MsgBox final que diga "Customer would be deleted here."
Pista
expand arrow

1. Obtener el Customer ID y construir la confirmación

  • InputBox necesita un mensaje y puede recibir un título como segundo argumento — almacena lo que se devuelva en una variable de tipo String.
  • El mensaje de confirmación debe concatenar el ID real usando &, no escribirlo como una cadena fija — de lo contrario, siempre diría literalmente "[ID]".
  • MsgBox usado como función (capturando un resultado) necesita paréntesis; combina vbYesNo y vbQuestion con +.

2. Manejar Cancelar y No

  • Comprueba el caso de cadena vacía justo después de la línea del InputBox, antes de intentar construir un mensaje de confirmación — no tiene sentido preguntar "¿Eliminar cliente?" si no hay un ID para eliminar.
  • Exit Sub detiene el procedimiento inmediatamente donde se coloque — úsalo justo dentro de cada bloque If, con un MsgBox justo antes explicando que no ocurrió nada.
  • La comprobación de vbNo viene después del MsgBox de confirmación, comparando el resultado capturado con la constante vbNo.

3. La confirmación final

  • Esta línea solo se ejecuta si la ejecución llega a ella — como ambas comprobaciones anteriores usan Exit Sub en caso de fallo, simplemente colocando este MsgBox después de ambas comprobaciones es suficiente para garantizar que solo se muestre cuando ambas se hayan superado.
Solución
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

Ejecuta el procedimiento (F5) y prueba los tres caminos: haz clic en Cancelar en el InputBox, haz clic en No en la confirmación y finalmente ingresa un ID y haz clic en Sí — cada uno debe mostrar uno de los tres mensajes diferentes.

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 5. Capítulo 1

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Cuadros de Mensaje y Cuadros de Entrada

Antes de crear un formulario completo, conviene dominar las dos formas más sencillas en que VBA puede interactuar con un usuario: MsgBox, que muestra información y opcionalmente realiza una pregunta, e InputBox, que solicita una breve entrada de texto.

MsgBox

En su forma más simple, MsgBox solo muestra un mensaje y espera a que el usuario haga clic en OK:

MsgBox "Customer saved successfully."

Usado de esta manera — como una instrucción, sin paréntesis y sin capturar ningún resultado — MsgBox es un callejón sin salida: muestra el mensaje y el código continúa, independientemente de lo que haga el usuario. En el momento en que necesitas saber qué botón fue presionado, MsgBox se convierte en una función en lugar de una instrucción, lo que significa que requiere paréntesis y algo para almacenar su resultado:

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

vbYesNo y vbQuestion se suman con un simple +, lo cual puede parecer inusual la primera vez que lo ves, pero es simplemente la manera en que VBA permite combinar dos configuraciones independientes — qué botones aparecen y qué icono se muestra — en el único segundo argumento que MsgBox espera. result devuelve uno de los valores constantes integrados de VBA, vbYes o vbNo, que en realidad son solo números disfrazados (6 y 7, aunque nunca escribirías el número literal). Controla una acción según la respuesta con un simple If:

If result = vbYes Then
    ' proceed with deletion
End If

InputBox

Mientras que MsgBox solo devuelve un conjunto fijo de constantes de botón, InputBox solicita al usuario que escriba algo y devuelve exactamente lo que ingresó:

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

El tercer argumento, "Chicago" en este caso, rellena previamente el cuadro de texto — útil para sugerir una respuesta probable que el usuario puede aceptar o sobrescribir. Hay dos detalles que suelen confundirse la primera vez: todo lo que el usuario escriba se devuelve como una cadena (String) sin importar su apariencia, por lo que si escribe 25 obtendrás el texto "25", no el número 25, y necesitarás CInt o CDbl antes de realizar operaciones aritméticas; además, al hacer clic en Cancelar no se genera un error ni se detiene el código — simplemente devuelve una cadena vacía (""), lo cual tu código debe comprobar explícitamente si una respuesta vacía no es válida.

Solicitudes y confirmaciones al usuario

La combinación de ambos es el patrón estándar para cualquier acción que lea la entrada del usuario y luego necesite confirmación antes de realizar algo riesgoso:

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

Observa que confirmMsg se declara As VbMsgBoxResult en lugar de un tipo genérico — este es el tipo nombrado que VBA utiliza realmente para el valor de retorno de MsgBox, y declararlo explícitamente (en vez de dejarlo como Variant) permite que el VBE ofrezca autocompletado para vbYes, vbNo y los demás mientras escribes. La comprobación de cadena vacía después de InputBox y la comprobación de vbNo después de MsgBox utilizan el mismo patrón de escape, Exit Sub, que detiene el procedimiento inmediatamente en lugar de dejar que continúe en un código que asume que existe una entrada válida.

Tarea

  1. Escribir un Sub que utilice InputBox para solicitar un Customer ID, luego MsgBox para confirmar "¿Eliminar cliente [ID]?" con botones Sí/No y un icono de pregunta.
  2. Manejar tanto el caso de cadena vacía (el usuario hizo clic en Cancelar en el InputBox) como el caso vbNo (el usuario rechazó la confirmación) saliendo del Sub de forma anticipada con un mensaje explicando que no ocurrió nada.
  3. Solo cuando ambas comprobaciones se superen, mostrar un MsgBox final que diga "Customer would be deleted here."
Pista
expand arrow

1. Obtener el Customer ID y construir la confirmación

  • InputBox necesita un mensaje y puede recibir un título como segundo argumento — almacena lo que se devuelva en una variable de tipo String.
  • El mensaje de confirmación debe concatenar el ID real usando &, no escribirlo como una cadena fija — de lo contrario, siempre diría literalmente "[ID]".
  • MsgBox usado como función (capturando un resultado) necesita paréntesis; combina vbYesNo y vbQuestion con +.

2. Manejar Cancelar y No

  • Comprueba el caso de cadena vacía justo después de la línea del InputBox, antes de intentar construir un mensaje de confirmación — no tiene sentido preguntar "¿Eliminar cliente?" si no hay un ID para eliminar.
  • Exit Sub detiene el procedimiento inmediatamente donde se coloque — úsalo justo dentro de cada bloque If, con un MsgBox justo antes explicando que no ocurrió nada.
  • La comprobación de vbNo viene después del MsgBox de confirmación, comparando el resultado capturado con la constante vbNo.

3. La confirmación final

  • Esta línea solo se ejecuta si la ejecución llega a ella — como ambas comprobaciones anteriores usan Exit Sub en caso de fallo, simplemente colocando este MsgBox después de ambas comprobaciones es suficiente para garantizar que solo se muestre cuando ambas se hayan superado.
Solución
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

Ejecuta el procedimiento (F5) y prueba los tres caminos: haz clic en Cancelar en el InputBox, haz clic en No en la confirmación y finalmente ingresa un ID y haz clic en Sí — cada uno debe mostrar uno de los tres mensajes diferentes.

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 5. Capítulo 1
some-alt