• 👏 Bienvenido a nuestra comunidad Excel

    ¿Todavía no estás registrado? 😲

    Registrate gratis aquí y podrás:

    💪 Hacer preguntas a los expertos
    ⬇️ Descargar ejemplos y plantillas
    🏅 
    Acceder a contenidos premium

Búsqueda inteligente con formulario

Hola. alguien podria ayudarme?
estoy tratando de hacer una formulario de búsqueda inteligente, pero hay algo que estoy haciendo y mal y no se exactamente que es.
muchas gracias.

https://drive.google.com/file/d/1tEJr2Sh4d91Y38u6abySoI_sUBQN2K7g/view?usp=sharing

no puedo subir el archivo pero esta en Drive ojala me pudieran ayudar me urge 😭😭😭
Como quisieras que sea la busqueda inteligente? Que es lo que queres filtrar.

Pon un ejemplo de ingreso de busqueda y que quisieras que te muestre.
Saludos.

PD: en el link que pusiste, pide solicitud de descarga. No descarga automaticamente.
 
Hola. alguien podria ayudarme?
estoy tratando de hacer una formulario de búsqueda inteligente, pero hay algo que estoy haciendo y mal y no se exactamente que es.
muchas gracias.

https://drive.google.com/file/d/1tEJr2Sh4d91Y38u6abySoI_sUBQN2K7g/view?usp=sharing

no puedo subir el archivo pero esta en Drive ojala me pudieran ayudar me urge 😭😭😭
Estiamdo, ahi corregi el archivo y quedo funcionando TODO.

No funcionaba la carga del formulario de clientes.
No funcionaba el boton de salir del formulario
No funcionaba lo mas importante que era la busqueda inteligente.

El problema radicaba en las llamadas a la subrutina de la busqueda, las cuales no accedian a la misma.
Tenias los nombres de los textbox incorrectos y por ende no funcionaban.

Lo unico que te modifique, (vos despues los vuelves a cargar) es la cantidad de registros que tenias. Exactamente 170142 registros,
una BARBARIDAD, asi que lo acorte a 2000 registros, vos despues te encargas de volver a copiarlos si te hacen falta.


Dejo el codigo completo, el archivo adjunto y una imagen en funcionamiento del formulario con la busqueda inteligente.

BUSQUEDA INTELIGENTE.JPG



Código:
Option Explicit
Sub Buscar()
Dim Mone As String
Dim X, Y, A As Long


Mone = "##0.00"

LstProductos.Clear
X = nReg(Hoja5, 5, 1)
A = 0
For Y = 5 To X

    If Not TxtCliente = "" Or Not TxtNombre = "" Or Not TxtAño = "" Or Not TxtPrograma = "" Then
        If UCase(Hoja5.Range("A" & Y)) Like "*" & UCase(TxtCliente.Text) & "*" _
        And UCase(Hoja5.Range("B" & Y)) Like "*" & UCase(TxtNombre.Text) & "*" _
        And UCase(Hoja5.Range("C" & Y)) Like "*" & UCase(TxtAño.Text) & "*" _
        And UCase(Hoja5.Range("F" & Y)) Like "*" & UCase(TxtPrograma.Text) & "*" Then
            LstProductos.AddItem
            LstProductos.List(A, 0) = Hoja5.Range("A" & Y).Value
            LstProductos.List(A, 1) = Hoja5.Range("B" & Y).Text
            LstProductos.List(A, 2) = Hoja5.Range("C" & Y).Value
            LstProductos.List(A, 3) = Hoja5.Range("D" & Y).Value
            LstProductos.List(A, 4) = Format(Hoja5.Range("E" & Y).Value, Mone)
           
            A = A + 1
        End If
            Else
    
    End If
    
Next Y
End Sub
Sub Mostrar()
Dim Y, X As Long
Dim uFila As Long
Dim Mone As String

Mone = "##0.00"

uFila = nReg(Hoja5, 5, 1) - 1

For Y = 5 To uFila

With Me.LstProductos
     X = .ListCount

    .AddItem
    .List(X, 0) = Hoja5.Cells(Y, 1).Value

    .List(X, 1) = Hoja5.Cells(Y, 2).Value
    .List(X, 2) = Hoja5.Cells(Y, 3).Value
    .List(X, 3) = Hoja5.Cells(Y, 4).Value

    .List(X, 4) = Format(Hoja5.Cells(Y, 5).Value, Mone)

    
End With

Next

End Sub


Private Sub TxtAño_Change()
Call Buscar
End Sub

Private Sub TxtCliente_Change()
Call Buscar
End Sub

Private Sub TxtNombre_Change()
Call Buscar
End Sub

Private Sub TxtPrograma_Change()
Call Buscar
End Sub

Private Sub CmdSalir_Click()
Unload Me
End Sub

Private Sub UserForm_Initialize()
With LstProductos
.ColumnCount = 5
.ColumnWidths = "75;130;40;120;40"
End With
Call Mostrar
End Sub


Saludos y espero te sirva.
 

Adjuntos

Hola!
Me consta que @protostecnologia conoce un método más eficiente: aquí lo muestro.
Saludos, Cacho R.

P.D.
Jejjjjejje
Jejej te copaste con el metodo Application.index.
La verdad que carga muy muy rapido.
Funciona todo al pelo.

Ahora cuando le agregue los 172500 registros que tenia original, cuando cargas el formulario tira un error de "Subscript out of range"
b1.JPG

Yo al mio, no lo probe aun con 172500 registros, pero en breve lo hare.

Saludos. Y buen finde.
 

Cacho R

Well-known member
El Application.Transpose tiene un límite de filas que procesa correctamente. Si se supera ese límite, VBA ignora los registros en exceso: ¡Pero hay solución!

En el modelo que adjunto y para que el archivo sea más pequeño he puesto:
  • Un generador de registros aleatorios
  • Un Userform1 en el que se filtra "tipo activo", y
  • Un Userform2 en el que se filtra mediante un Botón.
  • Cuando se tienen más de 170 mil registros se entiende por qué el primer Userform es de uso "insoportable".
Saludos, Cacho R.
 

Adjuntos

El Application.Transpose tiene un límite de filas que procesa correctamente. Si se supera ese límite, VBA ignora los registros en exceso: ¡Pero hay solución!

En el modelo que adjunto y para que el archivo sea más pequeño he puesto:
  • Un generador de registros aleatorios
  • Un Userform1 en el que se filtra "tipo activo", y
  • Un Userform2 en el que se filtra mediante un Botón.
  • Cuando se tienen más de 170 mil registros se entiende por qué el primer Userform es de uso "insoportable".
Saludos, Cacho R.
Hola Cacho R.
No sabia que tenia ese limite el Application.Transpose.

Probe tus modelos y vi que para la solucion optaste por un vector para generar las filas en vez del Application.Transpose

ReDim mRow2(1 To R, 1 To 1)
For i = 1 To R
mRow2(i, 1) = mRow1(i)
Next

Esto puede influir un poco en la demora de la busqueda? Son muchisimos registros, lose.

En el modelo de UserForm1, cuando realizo una busqueda en mi PC me esta demorando unos 7 segundos en encontrar las coincidencias.
Mientras que en el modelo de UserForm2, cuando realizo una busqueda en mi PC me esta demorando unos 4 segundos en encontrar las coincidencias.

Muy interesante la solucion. En breve estare probando con 172500 registros con el modelo que propuse al principio.
Gracias y saludos.
 

Cacho R

Well-known member
El Userform1 te tardará entre 4 y 6 segundos "por cada" pulsación de tecla (además no se lee nada en el textbox): ¡Por eso se pone insoportable!
mientras que el Userform2 tarda "lo normal".

Y ya te anticipo: los dos modelos son superados "y por mucho" por el Filtro avanzado para el caso de 172 mil registros.

Moraleja: hay que conocer varios métodos de filtrado para elegir el óptimo en función del caudal de información.
 
El Userform1 te tardará entre 4 y 6 segundos "por cada" pulsación de tecla (además no se lee nada en el textbox): ¡Por eso se pone insoportable!
mientras que el Userform2 tarda "lo normal".

Y ya te anticipo: los dos modelos son superados "y por mucho" por el Filtro avanzado para el caso de 172 mil registros.

Moraleja: hay que conocer varios métodos de filtrado para elegir el óptimo en función del caudal de información.
Ya lo probe con el metodo AddItem ( que es el que estaba propuesto ya por el usuario mjlopezh18, y demora muchisimo, es inviable.

Hay que usar otros metodos de busqueda como el Application.index o el Filtro avanzado como vos lo dices para optimizar y sea viable la busqueda cuando hay mas de 172000 registros.

Nuevamente gracias por todos los aportes y conocimientos que brindas Cacho R.

PD: Conclusion: mjlopezh18,, asi como te propuse yo funciona el metodo (que seria el que diseñaste vos) y que yo, lo que hice fue arreglarlo y hacerlo funcionar. Pero tiene el defecto que con muchos registros ( mas de 172000 ) ya es muy ineficiente.

Deberias usar otros metodos de busqueda y carga de listbox como ejemplo el Application.index o los filtros avanzados y/o rowsource para ese objetivo. (uno de esos ejemplos ya te lo adjunto como archivo Cacho R. en una de sus respuestas.)

Feliz domingo a todos.
 

Cacho R

Well-known member
En breve estare probando con 172500 registros con el modelo que propuse al principio.
Gracias y saludos.
Demás está decir que los 172 mil registros deberían ir a parar a un Access (o similar)...

Pero siguiendo con esta línea de análisis, una prueba que no hay que dejar de hacer es utilizar a Power Query (PQ) como alternativa a la QueryTable alimentada por un Recordset (esto ya lo vimos en otro hilo).
Con suerte y viento a favor es posible que se obtenga "algo" bueno...

Sólo hay que tener presente que:
  • PQ no sirve para nada si lo que quieres es guardar datos en la base de datos.
  • Por el contrario QueryTable sirve para ambas cosas: recibir datos del filtrado y guardar datos en la base de datos.
 

Cacho R

Well-known member
Ya que @eavjperu es tímido y "no se anima" a mostrarnos otras variante para el filtrado, muestro en el adjunto dos variantes más:
  • Una variante basada en el "archi-promocionado" Power Query (PQ), y
  • Otra variante basada en el Filtro avanzado del Excel.
Es muy interesante advertir que mientras que con pocos datos el PQ es el método más ineficiente de todos (lejos), con muchos datos (tantos como 172000, por ejemplo)... ¡Tampoco es el más eficiente siempre! (aquí "gana" generalmente el Filtro avanzado y decepcionan los métodos basados en Index).

Eso sí: cuando evaluamos la cantidad de líneas de programación que se requiere emplear en cada uno de los 4 métodos que se exponen en el archivo, vemos lo que era previsible: PQ exige bastante programación y -para peor- en dos ambientes diferentes: VBA y PQ.

En fin: ¡Ver para creer!...

Saludos, Cacho R.
 

Adjuntos

eavjperu

Active member
Ya sabes @Cacho R soy un amante del Excel que cuando ve estos casos dice: Si usan Office y quieren un sistema gestor de base de datos, el elegido debe ser Access, tanto como Fronte End como Back End. Si quieren algo gratis pero con más capacidad, usar las versiones respectivas de MySQL o SQL Server y de Front End un ejecutable hecho con, por ejemplo, Visual Basic.Net ;)

Si insisten con Excel, ya que a mucha gente se le hace más fácil manejarlo así como su VBA, lo real es que a largo plazo, y entre más aumente su número de registros, la cosa se irá complicando y poniendo un poco más lenta, se use PQ, VBA, etc. Claro, siempre y cuando vayan a realmente tener cientos de miles de registros. Si no se llegará a eso, listo, aquí ya se plantearon varias alternativas, yo solo diría que, tomando en cuenta solo el último archivo enviado, habría que probar en él ADO+SQL.

Saludos

Abraham Valencia
https://abrahamexcel.blogspot.com/
Lima, Perú
 

Cacho R

Well-known member
Si usan Office y quieren un sistema gestor de base de datos, el elegido debe ser Access, tanto como Fronte End como Back End.
Parece que "sintonizamos el mismo canal":
Demás está decir que los 172 mil registros deberían ir a parar a un Access (o similar)...
___________________

yo solo diría que, tomando en cuenta solo el último archivo enviado, habría que probar en él ADO+SQL.
Así es: ¿Y sabés por qué no lo puse?...
Porque en el hilo en el que @protostecnologia expuso su inicial "entusiasmo" por el método basado en Index, probamos ADO/SQL y "no pasó nada destacable".
___________________

Así que el archivo del mensaje #18 apunta a mostrar diversos métodos de selección: algo "didáctico", por así decirlo (gracias por tu aporte).
 
Arriba