Formulario de búsqueda en excel
Tengo un listado de números en excel en una columna y quisiera para mejorar una búsqueda utilizar un formulario con los botones anterior y siguiente para bajar o subir la celda activa y otro botón para ejecutar el código de mi macro como se haría
3 Respuestas
Estuve leyendo el desarrollo de esta consulta y noto que falta esto que mencionas:
'... Lo que quiero es que en la pantalla del formulario saliera el numero de la celda activa ...
Entonces, en las primeras macros enviadas por James falta mostrar el valor en el campo textbox, que 'imaginaré' se llama TextBox1.
No haría falta a mi entender el uso de combos ni listbox. Solo mejorar un poco esas 2 macros para que controle al bajar y al subir que no se estén superando los límites.
Si la 1er celda con datos está en fila 2 no se puede subir más y se controla de este modo:
Private Sub CommandButton2_Click() 'subir celda if activecell.row = 2 then msgbox "Se llegó a la 1er celda de la lista." 'el mensaje es opcional exit sub end if ActiveCell.Offset(-1, 0).Select TextBox1 = activecell.value 'agregar coincidencias End Sub
Y para la macro de la flecha que baja se busca el fin de rango y se compara:
Private Sub CommandButton2_Click() 'subir celda finx = range("AB" & rows.count).end(xlup).row if activecell.row >= finx then Msgbox "Se terminó la lista." 'opcional exit sub end if ActiveCell.Offset(-1, 0).Select TextBox1 = activecell.value 'agregar coincidencias End Sub
Si luego necesitas que el userform se coloque en cierta posición enviamelo a mi correo para ver su tamaño en relación a la hoja y ubicarlo.
Parece que copié parte del código del mismo botón para las 2 macros ;(
Así quedarían las subrutinas para cada botón: anterior, siguiente y buscar respectivamente:
Private Sub CommandButton1_Click() 'subir celda If ActiveCell.Row = 2 Then MsgBox "Se llegó a la 1er celda de la lista." 'el mensaje es opcional Exit Sub End If ActiveCell.Offset(-1, 0).Select TextBox1 = ActiveCell.Value 'agregar End Sub Private Sub CommandButton2_Click() 'bajar celda finx = Range("AB" & Rows.Count).End(xlUp).Row If ActiveCell.Row >= finx Then MsgBox "Se terminó la lista." 'opcional Exit Sub End If ActiveCell.Offset(1, 0).Select TextBox1 = ActiveCell.Value 'agregar End Sub Private Sub CommandButton3_Click() Call coincidencias End Sub
Así es cómo imaginé el Userform ya que no lo encontré en tu libro. Observa que podrás moverte con el Scroll y/o los botones anterior y siguiente y una vez elegido el nro recién ejecutar la búsqueda.
Otras macros necesarias: al inicializar el formulario indicamos que se posicione en la primer celda y asignamos límites al ScrollBar:
Private Sub UserForm_Initialize() 'el proceso comienza en la primer celda (AB2) [AB2].Select TextBox1 = ActiveCell.Value 'el scrollbar tendrá como límite las filas 2 y la últ de la col AB ScrollBar1.Value = 2 ScrollBar1.Max = Range("AB" & Rows.Count).End(xlUp).Row End Sub
Y la siguiente es la que activará la celda según el cambio en el scroll. La celda activada se muestra en el textbox.
Private Sub ScrollBar1_Change() 'se activa la celda de la fila indicada en el scroll Range("AB" & ScrollBar1.Value).Select TextBox1 = ActiveCell.Value End Sub
Espero que con esto puedas avanzar y completar el resto de los botones según la imagen que has dejado aquí. Si necesitas más ayuda, por favor deja una nueva consulta con el tema puntual. Esta ya se extendió bastante.
- Compartir respuesta
Prueba esta macro
Private Sub CommandButton1_Click() 'bajar celda ActiveCell.Offset(1, 0).Select End Sub Private Sub CommandButton2_Click() 'subir celda ActiveCell.Offset(-1, 0).Select End Sub Private Sub CommandButton2_Click() 'llamar macro 'poner nombre de la macro a ejecutar End Sub
Solo crea un botón y añade
Private Sub CommandButton1_Click() 'bajar celda ActiveCell.Offset(1, 0).Select End Sub Private Sub CommandButton2_Click() 'subir celda ActiveCell.Offset(-1, 0).Select End Sub Private Sub CommandButton3_Click() 'llamar macro 'si la macro se llama realizar_calculos simplemente pones: realizar_calculos 'y cada vez que presiones el boton3 este llamara a la macro realizar_calculos End Sub
James pulso el botón comandobutton y baja la celda activa de la columna pero no se ejecuta la macro creo que el problema esta en el código de la macro lo puedes modificar y anexo imagen de mi trabajo
esta es la macro
Sub coincidencias()
'ajustada x Elsamatilde
Dim n As Range
Dim lookup
'se solicita ingreso del nro de 4 dígitos
lookup = Format(Val(InputBox("ingrese NUMERO de referencia", "BUSQUEDA DE COINCIDENCIAS")), "0000")
If Len(lookup) <> 4 Then
MsgBox "Número no válido.", , "ERROR"
Exit Sub
End If
'se guarda en Z1 y se da formato a la celda
With [Z1]
.Value = lookup
.NumberFormat = "0000"
.Font.Bold = True
.HorizontalAlignment = xlLeft
.Interior.ColorIndex = 44 '(naranja)
End With
'se recorre el rango buscando las 6 coincidencias
'se limpia la col Y
Columns("Y:Y").Clear
x = 2
For Each n In Range("F1:V40")
If n = lookup Or Left(n.Value, 2) = Left(lookup, 2) Or Right(n.Value, 2) = Right(lookup, 2) Or _
(Left(n.Value, 1) = Left(lookup, 1) And Right(n.Value, 1) = Right(lookup, 1)) Or _
(Left(n.Value, 1) = Left(lookup, 1) And Mid(n.Value, 3, 1) = Mid(lookup, 3, 1)) Or _
(Mid(n.Value, 2, 1) = Mid(lookup, 2, 1) And Right(n.Value, 1) = Right(lookup, 1)) Or _
(Mid(n.Value, 2, 1) = Mid(lookup, 2, 1) And Mid(n.Value, 3, 1) = Mid(lookup, 3, 1)) Then
n.Interior.ColorIndex = 44
'se agrega el nro a la col Y
Range("Y" & x) = n
x = x + 1
Else 'opcional quitar color a los no coincidentes.
n.Interior.Color = xlNone
End If
Next n
MsgBox "Fin del proceso.", , "INFORMACIÓN"
End Sub
Y el formulario solo es de tres botones el que esta en la imagen es solo el formulario que da excel y la cuestión es como dije al principio mientras hago el movimiento de la celda activa bajándola o subiéndola se vaya ejecutando la macro de antemano muchas gracias
¿Entonces lo que quieres es que cuando baje o suba la celda se active la macro?, si es así prueba con esto, en cuanto des siguiente o anterior la macro se activara
Private Sub CommandButton1_Click() 'bajar celda ActiveCell.Offset(1, 0).Select coincidencias End Sub Private Sub CommandButton2_Click() 'subir celda ActiveCell.Offset(-1, 0).Select coincidencias End Sub
Me sale el cuadro de ingrese el numero de referencia, tocaría modificar el principio de la macro colabore por favor
Solo cambia en la macro coincidencias la instrucción que tienes
Lookup = Format(Val(InputBox("ingrese NUMERO de referencia", "BUSQUEDA DE COINCIDENCIAS")), "0000")
Por esta
lookup=activecell.value
La operación funciona pero como hago para ejecutarla desde un formulario como el de la imagen para no perder de vista el rango "f1;v40"
Solo colocas la macro en el botón del formulario que muestras, la macro ya tiene enfocado el rango que pides pero si lo que quieres es que siempre te lo este mostrando lo único que debes hacer es poner la siguiente línea:
Range("f1:v40").select puede ser antes del next n o despues de el, esta instruccion lo unico que hace es visualmente enfocar el rango, si es antes del next cada que el next se ejecute y antes de pasar al siguiente elemento la macro seleccionara el rango definido, si es despues cuando termine el ciclo for next la macro te mostrara el rango seleccionado.
Listo experto james la he probado y ha funcionado pero lo que quiero es que en la pantalla del formulario saliera el numero de la celda activa como son solamente los números de la columna AB y funcionara la flecha de desplazamiento
Entonces la celda activa cambiaría seria de la celda AB1 a AB7000 esto para que solamente tomara esos datos a analizar nada más
Por botón lo que quieres no se puede, es mucho más fácil un combobox o un listbox, se cargan los datos de la columna ab desde la celda a1 hasta donde terminen los datos, luego te vas moviendo hacia arriba o hacia abajo (te recomiendo el listbox) y cada vez que lo hagas la macro se ejecutara, el análisis se efectuara solo sobre este rango
Private Sub ComboBox1_Change() Set datos = Range("ab1").CurrentRegion With ComboBox1 valor = .Value lista = .ListIndex + 1 datos.Rows(lista).Select End With 'coincidencias End Sub Private Sub ListBox1_Click() Set datos = Range("ab1").CurrentRegion With ListBox1 valor = .Value lista = .ListIndex + 1 datos.Rows(lista).Select End With 'coincidencias End Sub Private Sub UserForm_Initialize() With ComboBox1 .RowSource = Range("ab1").CurrentRegion.Address .ListIndex = 0 End With With ListBox1 .RowSource = Range("ab1").CurrentRegion.Address End With End Sub
- Compartir respuesta
Te paso unos ejemplos que te pueden ser de utilutilidad
visita http://programarexcel.com baja cientos de macros gratis
Suscribe a https://youtube.com/programarexcel recibirás en tu mail los nuevos ejemplos de macro que se agreguen.
- Compartir respuesta