Mostrar MsgBox con datos de celda
Recurro de nuevo a su valiosa ayuda.
Gracias al experto "Aprendemos" pude dar con una respuesta interesante.
Por medio de un Formulario capturo un nombre ubicados un rango, si el valor no existe en el rango aparece un MsgBox "Número no encontrado". Si existe da acceso al libro.
Los datos ocupan progresivamente la última celda.
El problema es:
Quiero mostrar el valor de la celda ubicada al lado del valor introducido
Ejemplo:
Si introduzco mi número de empleado, este ocupa la celda A2 y mi nombre ubicado en B2, debe aparecer en el MsgBox.
2 Respuestas
A ver si entendí:
Msgbox Range("A2") & " " & Range("B2") 'dejé un espacio entre los campos
Otro caso:
dato = Range("A2").Offset(0,1).value
Msgbox dato
¿Será esto?
Me explico mejor:
El TextBox me permite guardar progresivamente valores en la columna A.
1
2
3
...65500
Los números de la columna A dan el valor buscado en la Función BuscarV ubicada en la Columna B, por lo que se cargan progresivamente también.
A B
1 Manuel
2 Carlos
3 Elsa...
Deseo mostrar un mensaje con el nombre de la columna B a medida que se va cargando.
Ojalá me haya explicado.
Gracias
Si estás pensando en el ejemplo de la consulta anterior donde se evalúa el dato ingresado en un rango, la línea para mostrar el msgbox sería:
If RangoObj Is Nothing Then
MsgBox ("Nombre no existe")
ActiveWorkbook. Close
'agregar
Else
MsgBox RangoObj.Offset(0,1)
End if
PD) Lo que NO se puede obtener es el valor de una celda que se actualiza como resultado de una fórmula.
Sdos
Elsa
Ese era el problema, que yo quería mostrar que se actualiza con el resultado de una fórmula.
Te comento: Coloqué la función en de esta forma en la Columna B
=SI(A12="";"Buscar";BUSCARV(A12;datos2;2;1))
Esto me da lo que quiero, pero obligatoriamente se debe llenar la siguiente celda manual. Por lo que no me sirve.
Existe alguna Macro para llenar de manera automática esa última celda del rango?
Lo de la fórmula dejamos descartado ya que no podrás con eso.
Con macros sería como mi respuesta anterior. Si estamos trabajando con el ejemplo de tu consulta anterior, cuando desde el formulario enviás el dato a la celda de la col A en esa misma macro debes mostrar el mensaje.
En casos así donde te han dado instrucciones sueltas, debieras escribirnos cómo te ha quedado armada la macro para poder ajustarla.
Un ejemplo concreto sería así:
Considero que la tabla de 'autorizaciones' se encuentra en Hoja1 (de allí vas a mostrar el dato de la col B)
Y la tabla donde vas registrando las entradas está en Hoja2: col A con el usuario, B = fecha y C = hora.
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'x Elsamatilde
'si se deja el campo vacío se cancela el proceso permitiendo volver a intentarlo
If textbox1 = "" then
Ca
'evaluamos si el dato existe en el rango de la col A
Set buscoTxt = Sheets("Hoja1").Range("A:A").Find(TextBox1, LookIn:=xlValues, LookAt:=xlWhole)
'si el dato no existe cancelamos el proceso
If buscoTxt Is Nothing Then
MsgBox ("Nombre no existe")
ActiveWorkbook.Close
Exit Sub
End If
'mostramos el dato de la col B del dato encontrado
MsgBox buscoTxt.Offset(0, 1)
'si el dato existe encontramos la última fila para colocar el dato
'nos colocamos en la hoja donde se guarda la lista
Sheets("Hoja2").Select
ultima = ActiveSheet.Range("A65536").End(xlUp).Row + 1
ActiveSheet.Range("A" & ultima) = TextBox1 'guardamos el nombre en col A
ActiveSheet.Range("B" & ultima) = Date 'guardamos fecha
ActiveSheet.Range("C" & ultima) = Time 'guardamos hora
End Sub
Perdón se me escapó sin terminar:
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
'x Elsamatilde
'si se deja el campo vacío se cancela el proceso permitiendo volver a intentarlo
If TextBox1 = "" Then
Cancel = True
Exit Sub
End If
'evaluamos si el dato existe en el rango de la col A
Set buscoTxt = Sheets("Hoja1").Range("A:A").Find(TextBox1, LookIn:=xlValues, LookAt:=xlWhole)
'si el dato no existe cancelamos el proceso
If buscoTxt Is Nothing Then
MsgBox ("Nombre no existe")
ActiveWorkbook.Close
Exit Sub
End If
'mostramos el dato de la col B del dato encontrado
MsgBox buscoTxt.Offset(0, 1)
'si el dato existe encontramos la última fila para colocar el dato
'nos colocamos en la hoja donde se guarda la lista
Sheets("Hoja2").Select
ultima = ActiveSheet.Range("A65536").End(xlUp).Row + 1
ActiveSheet.Range("A" & ultima) = TextBox1 'guardamos el nombre en col A
ActiveSheet.Range("B" & ultima) = Date 'guardamos fecha
ActiveSheet.Range("C" & ultima) = Time 'guardamos hora
End Sub
Ajustá todas las referencias (Nombre de hojas, nombre del control, etc), pruébala y si todo quedó resuelto no olvides finalizar.
Hola Elsa. Disculpa la tardanza en responder. Intenté acoplar el código que me enviaste al mío y no pude. Te lo envío para que lo veas. Es que tengo algunas cosas interesantes que quiero mantener.
Private Sub cmdAceptar_Click() 'aqui verificamos que los texts no esten vacios If Me.TextBox1.Text = "" Then MsgBox ("Introduzca su número de Carné"): Exit Sub 'verificamos si el valor introducido está en la columna J Range("J:J").Select Set RangoObj = Selection.Find(What:=TextBox1, _ After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False) 'Si el número no está dentro de la columna J If RangoObj Is Nothing Then 'MsgBox "Número de carné no Registrado" TextBox1 = "" Cancel = True Worksheets("hoja2").Range("A1") = Worksheets("hoja2").Range("A1") + 1 If Worksheets("hoja2").Range("A1") = 1 Then MsgBox "Número de carné no autorizado. Le quedan dos intentos", vbExclamation, "SAE" Me.TextBox1.SetFocus End If If Worksheets("hoja2").Range("A1") = 2 Then MsgBox "Número de carné no autorizado. Le queda un intento", vbExclamation, "SAE" Me.TextBox1.SetFocus End If If Worksheets("hoja2").Range("A1") = 3 Then MsgBox "El sistema se cerrará", vbExclamation, "SAE" Application.DisplayAlerts = False ActiveWorkbook.Close Application.DisplayAlerts = True End If Else Worksheets("hoja2").Range("A1") = "" Unload Me ' si todo esta bien entonces insertamos los datos en la hoja If Sheets("Hoja1").Range("A2").Value = "" Then ' si no hay ningun registro todavia Sheets("Hoja1").Range("A2").Value = Me.TextBox1.Text Else ' a partir del segundo registro Sheets("Hoja1").Range("A2").End(xlDown)(xlDropDown).Value = Me.TextBox1.Text 'MsgBox ("Hola SES " & Sheets("Hoja1").Range("B2").End(xlDown).Value & " Bienvenido") MsgBox "Bienvenido Supervisor. Presione Aceptar para ingresar.", vbInformation, "SAE" 'MsgBox buscoTxt.Offset(0, 1) End If End If ' limpiamos el formulario para la siguiente captura 'Me.TextBox1.Text = "" ' ponemos el cursor en el primer campo de captura 'Me.TextBox1.SetFocus End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then MsgBox "Debe introducir su Número de carné", vbInformation, "SAE" Cancel = 1 CloseMode = 1 End If End Sub Private Sub cmdCancel_Click() ActiveWorkbook.Save ActiveWorkbook.Close End Sub
Gracias.
Lo que te faltó entre otras cosas es reemplazar el nombre de la variable por la tuya.
Otro detalle importante: tu rutina original no hace mención en qué hoja busca el dato, por lo que se supone que la lista de permisos en col J:K está en la hoja activa....
El código ajustado quedó a partir del Else ... pero también dejé comentarios en la primer parte.
Private Sub CommandButton1_Click() 'AJUSTADA X ELSAMATILDE 'aqui verificamos que los texts no esten vacios If Me.TextBox1.Text = "" Then MsgBox ("Introduzca su número de Carné"): Exit Sub 'RECOMENDABLE SELECCIONAR LA HOJA DONDE SE HARÁ LA BÚSQUEDA 'verificamos si el valor introducido está en la columna J Range("J:J").Select Set RangoObj = Selection.Find(What:=TextBox1, _ After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ MatchCase:=False, SearchFormat:=False) 'Si el número no está dentro de la columna J If RangoObj Is Nothing Then 'MsgBox "Número de carné no Registrado" TextBox1 = "" 'Cancel = True Worksheets("hoja2").Range("A1") = Worksheets("hoja2").Range("A1") + 1 If Worksheets("hoja2").Range("A1") = 1 Then MsgBox "Número de carné no autorizado. Le quedan dos intentos", vbExclamation, "SAE" Me.TextBox1.SetFocus End If If Worksheets("hoja2").Range("A1") = 2 Then MsgBox "Número de carné no autorizado. Le queda un intento", vbExclamation, "SAE" Me.TextBox1.SetFocus End If If Worksheets("hoja2").Range("A1") = 3 Then MsgBox "El sistema se cerrará", vbExclamation, "SAE" Application.DisplayAlerts = False ActiveWorkbook.Close Application.DisplayAlerts = True End If Else Worksheets("hoja2"). Range("A1") = "" 'SE LIMPIA LA CELDA DEL CONTADOR DE INTENTOS ' si todo esta bien entonces insertamos los datos en la HOJA1 If Sheets("Hoja1").Range("A2").Value = "" Then ' si no hay ningun registro todavia Sheets("Hoja1").Range("A2").Value = Me.TextBox1.Text Else ' a partir del segundo registro SE BUSCA LA PRIMER CELDA LIBRE Sheets("Hoja1").Range("A65536").End(xlUp).Offset(1, 0).Value = Me.TextBox1.Text End If 'AQUÍ SE MUESTRA EL DATO DE LA CELDA DE AL LADO MsgBox "Bienvenido " & RangoObj.Offset(0, 1) & ". Presione Aceptar para ingresar.", vbInformation, "SAE" 'RECIÉN AQUÍ CERRAMOS EL FORM Unload Me 'RECOMENDABLE: SELECCIONAR LA HOJA DE INICIO End If End Sub
Todo funciona bien, pero aún no me muestra la celda de al lado. je je!! que broma!!
MsgBox "Bienvenido " & RangoObj.Offset(0, 1) & ". Presione Aceptar para ingresar.", vbInformation, "SAE" 'RECIÉN AQUÍ CERRAMOS EL FORM Unload Me Sheets("Hoja3").Range("A1").Select
Y tampoco me abre la hoja de inicio con la instrucción Select. No se por qué.
Reitero para que revises este pto:
Otro detalle importante: tu rutina original no hace mención en qué hoja busca el dato, por lo que se supone que la lista de permisos en col J:K está en la hoja activa....
La última línea, si intentan posicionarte en hoja 3 podes separarla (en algunos versiones dá error si queda todo en 1 sola línea)
Sheets("Hoja3").select
Activesheet.range("A1").select
¿La hoja está visible?
Lo de la búsqueda lo solucioné con esto:
'verificamos si el valor introducido está en la columna J de la hoja 1
Sheets("Hoja1").Range("J:J").Select
Set RangoObj = Selection.Find(What:=TextBox1, _
After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False)
Pero lo del mensaje de la celda de al lado, nada todavía.
¿Te puedo enviar el ejemplo a algún correo? O escribime al mío que podes copiarlo de mi sitio que dejo al pie.
Sdos
Elsa
¿Por qué no utilizaste la macro que te envié en respuesta anterior?
Te marco tus problemas:
1- Al abrir el libro se abre el Uf, y comienza la búsqueda. En ningún momento le indicas de qué hoja. Si el libro se abre en la hoja2 busca allí, si se abre en la hoja3 busca allí
Solución: la instrucción Set indica Hoja y rango de búsqueda sin necesidad de activar esa hoja
2- No devuelve nada porque no hay nada... la celda 'de al lado' estaba vacía.
Solución: la enviada anteriormente. MsgBox buscoTxt.Offset(0, 1)
3- Agregué una línea para que en los reintentos se posicione nuevamente en el textbox
TextBox1. SetFocus
4- Al enviar mensaje de bienvenida, se cierra el UF ... nuevamente no indicas en qué hoja se debe posicionar. Tengamos presente que quizás el libro se abre con alguna hoja distinta a la Hoja1:
MsgBox "Bienvenido " & buscoTxt.Offset(0, 1) & ". Presione Aceptar para ingresar.", vbInformation, "SAE"
Sheets("Hoja1").Select
'RECIÉN AQUÍ CERRAMOS EL FORM
Unload Me
Ahora te envío el libro con la rutina explicada paso a paso.
- Compartir respuesta
Yo hize una busqueda asi:
Necesitaba saber si habia un registro en la columna C y si lo encontraba le pedia que me mostrara lo que tenia en la celda A y colo que este codigo
Dim rBuscado As Range
Dim strDato As String
dim Donde as string
Hoja2.Activate
Range("C2:C5000").Select
Set rBuscado1 = Cells.Find(What:=strDato, After:=ActiveCell, LookIn:=xlValues, LookAt _
:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False)
aqui asigo el valor de la cela A que necesito
Donde = rBuscado1.Offset(0, -2)
y lego esto lo coloco en un msgbox
- Compartir respuesta