Jump to content

Archived

This topic is now archived and is closed to further replies.

Cristian 1985

Macro para aplicar filtro usando comodín (*)

Recommended Posts

Hola a todos! Estoy intentando crear una macro para aplicar un filtro avanzado sobre una planilla, a fin de poder filtrar por los valores de columna L por coincidencias parciales utilizando el comodín (asterisco), pero no logro hacerla funcionar. Intenté usar el siguiente código:

ActiveSheet.Range("$A$2:$AB$" & uf).AutoFilter Field:=12, Criteria1:="*" & TextBox3.Value & "*", Operator:=xlFilterValues

Por ejemplo, al ingresar el valor "350" en el Textbox3 del Userform2, se debería aplicar el filtro por todas las filas cuyos valores que contengan "350" en la columna L.

Otra cosa que quisiera hacer sería filtrar por más de un criterio (siempre en esa misma columna), por ejemplo filtrar los valores que contengan "350" o bien "331" que se ingresarían separados por un espacio en el Userform.

Agradezco desde ya a quien pueda orientarme y/o darme una ayuda.

Saludos!

 

Planilla.xlsm

Share this post


Link to post
Share on other sites

Que tal @Cristian 1985

Lo que sucede es que el tratamiento de los datos en el filtro, se distingue por datos de números y alfabeto 

El comodín "*" [en ambos extremos] funciona con letras, porque le estas diciendo a Excel, que busque lo que llamamos el criterio "contiene", en otras palabras, no importa en que posición de la celda se encuentra tal criterio y que lo filtre

Para filtrar números, debes tratarlos como tal, con lo que llamamos "es igual a" [ademas "es mayor o igual que", "es menor o igual que"... y puedes encontrarlo los demas, en la interfaces de la tabla con auto filtros]

Por ende para resolver tu problema, se hace así

Criteria1:="=" & TextBox3

Como dato adicional, esto pocos usuarios lo detectan, pero por ejemplo cuando una columna contiene números, Excel te muestra automáticamente "Filtros de numero" y cuando solo hay letras "Filtros de texto", al dar clic a una de sus flechas

 

Saludos 

Share this post


Link to post
Share on other sites
Hace 14 minutos , Gerson Pineda dijo:

Por ende para resolver tu problema, se hace así


Criteria1:="=" & TextBox3

 

Hola Gerson! Gracias por tu interés :rolleyes: Ya había intentado algo similar a esto, el problema es que de esa manera solo se encuentran coincidencias exactas, es decir que si filtro por el valor "350" solo me filtra la fila que contiene ese valor exacto y no, por ejemplo, el "1350".

Voy a seguir investigando!

Gracias!

PD: Muy buena tu explicación B)

Share this post


Link to post
Share on other sites

Es que si insistes en tratarlos como texto no lo lograras [dale un poco mas de atención a mi explicación], si deseas tal resultado, entonces debes cambiar por ">="& textbox3; porque son NÚMEROS los que deseas filtrar

 

Saludos 

Share this post


Link to post
Share on other sites

Voy a intentar lo que menciona Leopoldo!

Por ahora creo que estoy bloqueado :huh:, perdón pero por más intento no puedo obtener los resultados que deseo con la observación de Gerson (solo consigo los valores mayores que 350, muchos de los cuales no contienen "350").

Gracias a ambos!

Share this post


Link to post
Share on other sites

La solución de compromiso sería pasar todos esos datos a formato texto y de ese modo el filtro funcionaría correctamente. No se me ocurre ninguna forma de corregir el filtro si los valores son numéricos.

 

Estoy pensando en la macro que mencionaste, tendría que hacer un  bucle for i = 1 to uf ( no se si será necesario pasar el dato de la columna L a texto o trabajar directamente con el dato numérico), compararlo con el valor ingresado en el textbox, si no contiene ese valor ocultaría la fila completa con un entirerow.hide (?) y sino next <_<

 

Por favor publica tu propuesta cuando la tengas, (probablemente) sea mejor y seguramente me de ideas nuevas B)

Saludos y gracias!

Share this post


Link to post
Share on other sites
Hace 50 minutos , Cristian 1985 dijo:

La solución de compromiso sería pasar todos esos datos a formato texto y de ese modo el filtro funcionaría correctamente. No se me ocurre ninguna forma de corregir el filtro si los valores son numéricos.

Aunque los pases a texto, el autofiltro los considera números.

Hace 50 minutos , Cristian 1985 dijo:

Estoy pensando en la macro que mencionaste, tendría que hacer un  bucle for i = 1 to uf ( no se si será necesario pasar el dato de la columna L a texto o trabajar directamente con el dato numérico), compararlo con el valor ingresado en el textbox, si no contiene ese valor ocultaría la fila completa con un entirerow.hide (?) y sino next <_<

Exacto. Es bueno lo que mencionas y así se hace, ya sea con Un For o con un While o Con un For Each...

Te has ganado mi propuesta:

Private Sub CommandButton2_Click()
Dim Celda As Range, Rango As Range
    uf = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row
    Set Rango = Hoja1.Range("L3:L" & uf)
    For Each Celda In Rango
        If CStr(Celda.Value) Like "*" & Me.TextBox3 & "*" Then
        Else
            Celda.EntireRow.Hidden = True
        End If
    Next
    Unload Me
    Range("L2").Select
End Sub

Saludos.

Nota: Ahora tienes que hacer una macro, para que aparezcan todas las filas.

Share this post


Link to post
Share on other sites

¡Hola, a todos!

Una opción es usar el criterio formulado del filtro avanzado, realizando algo como esto:

Sub FiltroAvanzado()
    uf = Range("A" & Rows.Count).End(xlUp).Row
    Range("BA2") = "=SEARCH(""" & TextBox3.Value & """,L2)"
    Range("A2:AB" & uf).CurrentRegion.AdvancedFilter 1, Range("BA1:BA2")
End Sub

¡Pruébalo, y comentas! ¡Bendiciones!

Share this post


Link to post
Share on other sites

Un metodo mas, seria

Dim celda As Range
For Each cel In Range("L:L").SpecialCells(2)
If cel.Row > 2 Then
    vcn = VBA.InStr(1, cel, Me.TextBox3)
    If vcn = 0 Then
    If celda Is Nothing Then
        Set celda = cel
    Else
        Set celda = Union(celda, cel)
    End If
    End If
End If
Next
celda.EntireRow.EntireRow.Hidden = 1
Set celda = Nothing

Sin son demasiados filas, usa mejor el de @johnmpl

 

Saludos

Share this post


Link to post
Share on other sites

Adapté la propuesta de @Leopoldo Blancas para poder filtrar por 4 textbox diferentes!

Gracias nuevamente!

Private Sub CommandButton2_Click()
'Aceptar el valor elegido y filtrar

Dim Celda As Range, Rango As Range
    uf = ActiveSheet.Cells(Rows.Count, "A").End(xlUp).Row
    Set Rango = Hoja1.Range("L3:L" & uf)
    
    For Each Celda In Rango
    'Mostrar todas las filas antes de ocultar
    	Celda.EntireRow.Hidden = False
        If CStr(Celda.Value) Like "*" & Me.TextBox1 & "*" And TextBox1.Value <> "" Or _
        CStr(Celda.Value) Like "*" & Me.TextBox2 & "*" And TextBox2.Value <> "" Or _
        CStr(Celda.Value) Like "*" & Me.TextBox3 & "*" And TextBox3.Value <> "" Or _
        CStr(Celda.Value) Like "*" & Me.TextBox4 & "*" And TextBox4.Value <> "" Then
        Else: Celda.EntireRow.Hidden = True
        End If
    Next
    
    Unload Me
    Range("L2").Select
End Sub

 

Planilla.xlsm

Share this post


Link to post
Share on other sites

Que bueno que lo hayas solucionado!... pero insisto, ¿cuantas filas tiene tu archivo original?

Pues como ya viste, hay varios metodos, pero una de las herramientas mas eficaces en Excel, es precisamente el FILTRO AVANZADO (AdvencedFilter), tambien es muy buena opcion, trabajar en memoria...

Con el metodo de Johnmpl, el filtro, ya sean 1 o 4 textbox, es sumamente veloz!; te sugiero leas sobre esta funcion

Por otro lado utiliza la instrucción Application.ScreenUpdating para optimizar los codigos

 

Saludos

Share this post


Link to post
Share on other sites

¡Hola, a todos!

Así como bien comenta @Gerson Pineda, el Filtro Avanzado es una de las herramientas más eficientes para este tipo de menesteres en Excel.  Tu macro, adaptada para 4 textbox, sería:

Sub FiltroAvanzado()
    Dim a$, uf&
    uf = Range("A" & Rows.Count).End(xlUp).Row
    a = """" & TextBox1 & """,""" & _
        "" & TextBox2 & """,""" & _
        "" & TextBox3 & """,""" & _
        "" & TextBox4 & """"
    Range("BA2") = "=COUNT(SEARCH({" & a & "},L2))"
    Range("A2:AB" & uf).AdvancedFilter 1, Range("BA1:BA2")
End Sub

¡Bendiciones!

Share this post


Link to post
Share on other sites
Hace 27 minutos , johnmpl dijo:

¡Hola, a todos!

Así como bien comenta @Gerson Pineda, el Filtro Avanzado es una de las herramientas más eficientes para este tipo de menesteres en Excel.  Tu macro, adaptada para 4 textbox, sería:

Hace 15 horas, Gerson Pineda dijo:

Que bueno que lo hayas solucionado!... pero insisto, ¿cuantas filas tiene tu archivo original?

Pues como ya viste, hay varios metodos, pero una de las herramientas mas eficaces en Excel, es precisamente el FILTRO AVANZADO (AdvencedFilter), tambien es muy buena opcion, trabajar en memoria...

Hola a ambos!

El archivo actualmente tiene casi 1000 filas, pero eso va cambiando ya que se agregan y eliminan filas todos los días (hace unas semanas tenía menos de 600 filas), mi idea era probar por mi cuenta el rendimiento de las distintas alternativas (cosa que recién voy a poder hacer hoy que volví a la oficina), adaptando sus propuestas si fuese necesario.

Lo de los 4 textbox se me ocurrió luego de ver la macro de Leopoldo!

Muy agradecido a los tres por sus aportes! :D

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

INFORMACIÓN BÁSICA SOBRE PROTECCIÓN DE DATOS

Responsable: Sergio Andrés Celemín

Finalidad: Moderar y responder comentarios de usuarios. Recuerda que la información que facilites es pública, y los datos que incluyas los leerá cualquier visitante de esta web, así como el avatar que poseas.

Legitimación: Consentimiento del interesado.

Destinatarios: Hetzner Online GmbH.

Derechos: Puedes ejercitar en cualquier momento tus derechos de acceso,
rectificación, supresión, oposición y demás derechos legalmente establecidos a
través del email sergio@ayudaexcel.com.

Información adicional: Encontrarás más información en la política de privacidad.




×
×
  • Create New...

Important Information

Privacy Policy