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

3 Respuestas

184.975 pts. Conocimientos avanzados de excel y programación en VBA

Te paso unos ejemplos que te pueden ser de utilutilidad

https://youtu.be/gqZzSfikEYY

https://youtu.be/smL4A-aRjCM

https://youtu.be/0xqYY1R8UxM

https://youtu.be/SWUB1hEXxUw

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.

2.081.265 pts. En mi sitio encontraran material de ayuda, ejemplos...

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.

63.275 pts. Si de mis mayores gustos, mis disgustos han nacido,...

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

como lo asigno para que se ejecute

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

y la idea es como el formulario de la imagen que es no perder de vista el rango "F1;V40"

¿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

o seria mejor que el numero de referencia que pide sea el de la celda activa en el momento

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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas