Detección de filtro
Resuelto
Shadorb
Mensajes publicados
60
Estado
Miembro
-
Shadorb Mensajes publicados 60 Estado Miembro -
Shadorb Mensajes publicados 60 Estado Miembro -
3 respuestas
-
Hola Shadorb, hola el foro,
El código a continuación devuelve el primer filtro activo. Si solo hay uno, debería ser suficiente, de lo contrario, habrá que adaptarlo...
Public Sub Macro1() Dim O As Worksheet 'declara la variable O (Hoja) Dim I As Byte 'declara la variable I (Incremento) Dim CF As Integer 'declara la variable CF (Columna Filtrada) Set O = Sheets("Feuil1") 'define la hoja O (a adaptar a tu caso) If O.FilterMode Then 'condición: si la hoja O está filtrada For I = 1 To O.AutoFilter.Filters.Count 'bucle sobre todas las columnas If O.AutoFilter.Filters.Item(I).On Then CF = I: Exit For 'si la columna está filtrada, define la variable CF, sale del procedimiento Next I 'próxima columna del bucle End If 'fin de la condición MsgBox CF 'mensaje mostrando CF End Sub
--
Hasta luego,
ThauTheme-
Si he entendido bien, devuelve el número de la columna donde el filtro está activo.
Me ayuda a avanzar, pero no es completamente mi pregunta, ¿cómo puedo saber qué índice está seleccionado en dicho filtro? Si ordeno según calefacción, ¿cómo detectar que es calefacción y no sanitaria lo que está seleccionado en el filtro?
EDIT: Después de discutir con los interesados, se ha convenido que solo habrá un filtro activo a la vez.
-
-
Re,
¡Es justo la respuesta a tu pregunta! ... Esto devuelve el índice del filtro y no el valor de la celda ... Me parece que es eso lo que habías pedido, ¿no?
Solo tienes que adaptar el mensaje, si tu tabla comienza en A1:
MsgBox Cells(1, CF).Value
donde 1 corresponde al número de la fila.
--
Hasta luego,
ThauTheme -
Buenas noches Shadorb,
Como no has indicado el nombre de tu hoja, supongo que es
Hoja1.
En tu mensaje #2, escribiste: « Si ordeno según calefacción, ¿cómo
detecto que es calefacción y no sanitario lo que está seleccionado
en el filtro? ».
Entonces, al mirar tu captura de pantalla, veo que se refiere a la
columna nº 2 de la tabla, es decir, el 2º filtro (hay uno por columna).
MsgBox Worksheets("Hoja1").AutoFilter.Filters(2).Criteria1
Si has filtrado esta columna con el criterio « CALEFACCIÓN »,
la línea anterior debería mostrarte "=CALEFACCIÓN";
Depende de ti quitar el primer carácter si solo quieres comprobar
"CALEFACCIÓN", pero nada impide que lo dejes como está y
verifiques "=CALEFACCIÓN".
Atención: creo que también debes añadir código para
detectar si el filtro automático está activo, y solo si es así, « interrogar » cuál es el criterio.
Pero para eso, ¡te dejo hacerlo!
Avísame si lo lograste, luego marca el tema como « Resuelto ».
Si no, puedes pedirme información adicional.
Cordialmente. 😊
-
Merci, es exactamente lo que busco. Sin embargo, tengo algunas preguntas pequeñas: ¿cómo probar el criterio seleccionado? Quiero decir, tengo CALENTAMIENTO, SANITARIO y ELÉCTRICO, ¿cómo probar los otros? Funciona muy bien para calefacción, pero solo para eso.
Otra cosa, ¿podemos detectar el evento "filtro modificado"? Para poder gestionar el código cuando el usuario ordena directamente. (Por ahora, tengo un botón).
Finalmente, cuando filtramos según un criterio, necesito encontrar la última línea llena. Para crear debajo de esta una línea total. El problema es que las líneas parecen simplemente estar ocultas y cuentan todas las demás ignorando el filtro. (No sé si está bien explicado).
Estoy usando esto:LastLineFeuil1 =Worksheets(1).Range("C"&Rows.Count).End(xlUp).Row
Gracias. -
1) Has escrito: «Funciona muy bien para calefacción pero solo para eso.»;
si devuelve bien Criteria1 "=CALEFACCIÓN", no hay razón para que
no devuelva "=SANITARIO" o "=ELECTRICIDAD".
Pero quizás tu primera pregunta no era para la misma columna, sino para
las otras? En ese caso, solo tienes que poner el número de filtro correcto, es decir,
el número de la columna correspondiente. Entonces:
a) Para la columna 1 "Adherente", es el filtro 1
b) Para la columna 2 "Actividad", es el filtro 2
c) Para la columna 3 "Proveedor", es el filtro 3
d) Para la columna 4 "Precio de venta", es el filtro 4
e) Para la columna 5 "Precio de costo", es el filtro 5
Así que solo tienes que poner el número correcto n para:
Worksheets("Hoja1").AutoFilter.Filters(n).Criteria1
Pero deja Criteria1! Criteria2 es para una prueba que incluye 2 valores.
Ejemplo: es mayor o igual a 20 Y es menor o igual a 100.
En este caso, Criteria1: ">=20" y Criteria2: "<=100".
-------------------------------------------------------
2) Mira esta línea de código:
MsgBox Worksheets("Hoja1").AutoFilter.Filters(n).On
n es el n° de columna de la tabla = n° del filtro
On es el de On / Off: activo o no
Si no hay ningún criterio de filtro para la columna en cuestión,
devuelve FALSO; en caso contrario, devuelve VERDADERO,
y solo en ese momento interroga los criterios de filtro.
Para lo que pides, creo que no hay otro medio
que comparar, para cada filtro, los valores «antes» y «después»
primero de On, y luego eventualmente de Criteria1 y Criteria2.
Porque si On era antes FALSO y luego se volvió después VERDADERO (o viceversa),
es suficiente para determinar que el filtro de la columna en cuestión ha sido
modificado: entonces no es necesario probar Criteria1 (y mucho menos Criteria2).
Quiero decir con esto que solo habrá que probar Criteria2 si, para antes
y después: On = VERDADERO y Criteria1 es el mismo.
Y hay que ver también .Operator: 1 para Y; 2 para O
-------------------------------------------------------
3) Cuando usamos un filtro automático, afortunadamente las filas que
no corresponden a los criterios son solo ocultadas y no
eliminadas! Es completamente normal, y eso también permite:
a) Cambiar de criterio y ver nuevamente las filas que antes estaban ocultas
que corresponden al(los) nuevo(s) criterio(s).
b) Desactivar el filtro automático y ver nuevamente todas las filas
de la tabla.
Pero si tu línea de código:
LastLineFeuil1 =Worksheets(1).Range("C"&Rows.Count).End(xlUp).Row
no te devuelve el n° de la última línea, la única explicación que
veo es que tienes uno o varios otros datos debajo de tu
tabla, y por lo tanto el .End(xlUp).Row se encuentra con ellos, antes de poder
«encontrar» la última línea de tu tabla situada más arriba.
A la espera de tu respuesta. ????
-
Muchas gracias, eso me ayuda mucho a avanzar.
Entonces, para contar las líneas no ocultas hice esto:LastLineFeuil1 = Worksheets(1).Range("D" & Rows.Count).End(xlUp).Row
For l = 4 To LastLineFeuil1
If Not Rows(l).Hidden Then R = R + 1
Next l
Probablemente no sea la mejor solución, pero hace lo que se le pide.
Luego tengo un problema bastante inusual:If (Worksheets(1).AutoFilter.Filters(4).On = True) Then
MsgBox Worksheets(1).AutoFilter.Filters(4).Criteria1
MsgBox (R)
Else
MsgBox ("Filtro proveedor no utilizado")
End If
Solo he desplazado la columna de prueba, pero a veces aparece un error que no puedo identificar la fuente. Error '91' Variable objeto o variable de bloque no definida.
Si entiendo lo que quiere decir, ¿no debería entrar en el else de mi bucle?
Luego, no entendí bien cómo probar el cambio de filtro.
¿Almaceno en una cadena el valor del filtro actual y luego lo comparo con el siguiente?
¿El usuario necesariamente tendrá que usar un botón para iniciar la prueba, verdad?
Hasta luego. -
Hola Shadorb,
1) Para contar las filas no ocultas, prueba esto:
LastLineFeuil1 = Worksheets(1).Range("D" & Rows.Count).End(xlUp).Row R = WorksheetFunction.Subtotal(103, Range("D4:D" & LastLineFeuil1))
- no necesitas un bucle For l.. Next l (l minúscula, no I mayúscula)
- no necesitas la prueba If Not Rows(l).Hidden Then R = R + 1
Pero ten cuidado de siempre dejar 103: es el código de CONTAR.
para que la función Subtotal devuelva el número de valores
del rango indicado, ignorando las filas ocultas.
---------------------------------------------------------
He puesto la misma fila de inicio que tú: 4; suponiendo que tu fila
de encabezados está en la fila 3, y que la 1ª fila de datos es la 4, justo
debajo.
También he mantenido tu misma columna D, pero puedes elegir otra
si lo prefieres. De todos modos, el resultado será idéntico, ya que para
todas las columnas de tu tabla, las filas ocultas son, por supuesto,
las mismas.
---------------------------------------------------------
Para más información sobre la función utilizada, escribe en una celda vacía
de tu hoja de Excel: =subtotal( ; haz clic en fx que está delante de la barra de fórmulas,
y mira la ayuda en línea. ¡No olvides el punto ( . ) entre « sub » y « total »!
=================================
2) En tu Else, hay: "Filtro proveedor no utilizado", lo que indica que
estás probando el filtro de la columna « Proveedor ». Sin embargo, en la captura de pantalla de tu
tabla inicial, es la columna nº 3; así que tu filtro es el nº 3, ¡no el 4!
A menos, por supuesto, que hayas añadido otra columna antes, pero no creo
que sea así; si has cambiado la estructura de tu tabla, envíame otra
captura de pantalla (con los números de filas y letras de columnas) !
---------------------------------------------------------
Has puesto paréntesis innecesarios, lo que me hace pensar que ya has
programado en Turbo-Pascal antes, ¿no? ????
La prueba « = True » también es innecesaria; los 2 MsgBox sucesivos pueden ser reunidos
en uno solo (ventaja: 1 solo cuadro en lugar de 2); y al « factorizar » el filtro 3,
da:
With Worksheets(1).AutoFilter.Filters(3) If .On Then MsgBox .Criteria1 & vbLf & R Else MsgBox "Filtro proveedor no utilizado" End If End With
Además, ten en cuenta que tus 2 líneas anteriores para calcular R
son útiles solo si mostramos este R; por lo tanto, como es útil para
la primera parte del If solo, y no para el Else, movemos las
2 líneas en cuestión dentro del If, antes de usar R:
With Worksheets(1).AutoFilter.Filters(3) If .On Then LastLineFeuil1 = Worksheets(1).Range("D" & Rows.Count).End(xlUp).Row R = WorksheetFunction.Subtotal(103, Range("D4:D" & LastLineFeuil1)) MsgBox "Criterio: " & .Criteria1 & vbLf & "Número de filas: " & R Else MsgBox "Filtro proveedor no utilizado" End If End With
---------------------------------------------------------
¡Atención!
No muevas tu 1ª línea si el resto de tu código debe usar LastLineFeuil1;
no muevas tu 2ª línea si el resto de tu código debe usar R.
---------------------------------------------------------
También notarás que he añadido un pequeño texto delante de la visualización del criterio
y delante de R; si te gusta menos, pon otro texto o quita « "..." & ».
=================================
3) El error 91 no se refiere a si entras en el Else o no; si es
« Variable de objeto no definida », significa que VBA no encuentra un objeto
del que depende algo (expresión, método, propiedad u otro);
si es « Variable de bloque no definida », el bloque no es necesariamente un bloque
If .. Then .. Else, también puede ser un bloque With .. End u otro...
Así que no creo que tu error 91 se debiera a tu error de número de filtro,
pero mira si se reproduce ahora que has puesto el filtro nº 3 (con
mi código anterior). Porque si ya se ha solucionado, ¡no es necesario seguir buscando!
Sin embargo, si se reproduce, necesitaría que me muestres la parte de código
donde ocurre, y también, dime en qué línea se detiene y pon en amarillo
cuando hagas clic en el botón de depuración.
=================================
4) La implementación de un botón para que el usuario inicie él mismo
la macro que prueba si ha habido o no un cambio de filtro depende de
lo que quieras hacer; y ¿con qué fin quisieras que el usuario supiera que
se ha modificado el filtro?
Por tanto, no es necesario que sea el usuario quien inicie este test;
si realmente lo necesitas, puedes hacerlo automáticamente a través de VBA,
sin ninguna intervención del usuario; y sabiendo en qué momento
quieres que realice esta prueba: por ejemplo, solo al iniciar la macro
correspondiente, o según un evento como « al activar la
hoja Worksheets(1) » u otro...
=================================
Este mensaje ya es muy largo, también, para la forma de probar
el cambio de filtro lo veremos en otra ocasión, cuando hayas resuelto
todos los problemas anteriores.
Cordialmente. ????
-
¡Cuando explicas, no lo haces a medias, está bien!
De hecho, la tabla ha cambiado un poco, y con el filtro de abajo activado, se bloquea.
http://hpics.li/59c9dff
Como no sé cómo poner en amarillo en el sitio, te vuelvo a enviar una imagen de depuración.
http://hpics.li/dbc6d44
Francamente, no entiendo este error. He activado bien el filtro número 4. Debo estar sin comprender algo sobre el funcionamiento de los filtros.
-