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")
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")
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
- Escribir un
Subque utiliceInputBoxpara solicitar un Customer ID, luego MsgBox para confirmar "¿Eliminar cliente [ID]?" con botones Sí/No y un icono de pregunta. - 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. - Solo cuando ambas comprobaciones se superen, mostrar un MsgBox final que diga "Customer would be deleted here."
1. Obtener el Customer ID y construir la confirmación
InputBoxnecesita un mensaje y puede recibir un título como segundo argumento — almacena lo que se devuelva en una variable de tipoString.- 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]". MsgBoxusado como función (capturando un resultado) necesita paréntesis; combinavbYesNoyvbQuestioncon+.
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 Subdetiene el procedimiento inmediatamente donde se coloque — úsalo justo dentro de cada bloqueIf, con unMsgBoxjusto antes explicando que no ocurrió nada.- La comprobación de
vbNoviene después delMsgBoxde confirmación, comparando el resultado capturado con la constantevbNo.
3. La confirmación final
- Esta línea solo se ejecuta si la ejecución llega a ella — como ambas comprobaciones anteriores usan
Exit Suben caso de fallo, simplemente colocando esteMsgBoxdespués de ambas comprobaciones es suficiente para garantizar que solo se muestre cuando ambas se hayan superado.
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.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
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")
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")
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
- Escribir un
Subque utiliceInputBoxpara solicitar un Customer ID, luego MsgBox para confirmar "¿Eliminar cliente [ID]?" con botones Sí/No y un icono de pregunta. - 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. - Solo cuando ambas comprobaciones se superen, mostrar un MsgBox final que diga "Customer would be deleted here."
1. Obtener el Customer ID y construir la confirmación
InputBoxnecesita un mensaje y puede recibir un título como segundo argumento — almacena lo que se devuelva en una variable de tipoString.- 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]". MsgBoxusado como función (capturando un resultado) necesita paréntesis; combinavbYesNoyvbQuestioncon+.
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 Subdetiene el procedimiento inmediatamente donde se coloque — úsalo justo dentro de cada bloqueIf, con unMsgBoxjusto antes explicando que no ocurrió nada.- La comprobación de
vbNoviene después delMsgBoxde confirmación, comparando el resultado capturado con la constantevbNo.
3. La confirmación final
- Esta línea solo se ejecuta si la ejecución llega a ella — como ambas comprobaciones anteriores usan
Exit Suben caso de fallo, simplemente colocando esteMsgBoxdespués de ambas comprobaciones es suficiente para garantizar que solo se muestre cuando ambas se hayan superado.
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.
¡Gracias por tus comentarios!