Critères des Filtres Automatiques
Bonjour et merci de m'accueillir dans ce forum.
j'ai un soucis avec les critères de filtres automatiques :
Dans Excel 2003 j'avais installé une macro me permettant de construire une chaîne de caractère pour afficher les critères des filtres actifs sur mon tableau.
Dans Excel 2010 ma macro part en erreur.
Au lieu de stocker les critères Criteria1, Criteria2, etc ,sous forme de chaines facilement récupérables, Excel 2010, dès que mon filtre s'applique à un colonne de dates charge directement Criteria2 sous la forme Criteria2:=Array(0, "dd/mm/yyyy") et impossible de lire les éléments de ce Array. De plus Criteria1 étant ignoré, ma macro part systématiquement en erreur dans la tentative de lire ce paramètre !
Il suffit d'enregistrer une macro pendant la mise en place d'un filtre Automatique dans une colonne contenant des dates pour voir le problème que je signale.
Merci déjà à qui saura me redonner espoir car je tourne en rond depuis plusieurs semaines sur ce point
Bonjour,
Le filtre sépare par années, date et jour, tu peu par exemple ouvrir tout se qui est pour 2011 ensuite tu auras les mois et pour finir les jours.
Montre ta macro pour voir si ont peu t'aider.
A+
Bonjour,
Merci de votre réactivité,
je précise ma question : D'abord la Sub() qui marche parfaitement sur Excel2003
Sub Filtractif()
Feuille = ActiveSheet.Name
Set ID = Sheets(Feuille)
If ID.AutoFilterMode Then
indice = 0
For Each f In ID.AutoFilter.Filters
indice = indice + 1
If f.On Then
Filtre1 = Left(f.Criteria1, 1) & " " & Right(f.Criteria1, Len(f.Criteria1) - 1)
AutreCrit = ""
currentFiltRange = ID.AutoFilter.Range.Address
If f.Operator Then
If f.Operator = 2 Then
Opérateur = "OU"
ElseIf f.Operator = 1 Then
Opérateur = "ET"
End If
Filtre2 = Left(f.Criteria2, 1) & " " & Right(f.Criteria2, Len(f.Criteria2) - 1)
AutreCrit = " " & Opérateur & " " & Filtre2 '& " "f.Operator &
StrRequête = StrRequête + Cells(5, indice) & " " & f.Criteria1 & AutreCrit & Chr(10)
End If
End If
Next
End If
Range("G1").Formula = StrRequête
End Sub
Cette Sub me permet de récupérer les valeurs de Criteria1 et Criteria2 pour afficher une chaîne rappelant les critères de filtres actifs
Entre la version 2003 et celle de 2010 Excel semble avoir changé le format de valeurs de critères car en Excel 2010, la ligne
Filtre1 = Left(f.Criteria1, 1) & " " & Right(f.Criteria1, Len(f.Criteria1) - 1) provoque une erreur
Lorsque j'enregistre une macro sur la mise en place d'un filtre automatique sur une colonne date ça ressemble à ça :
ActiveSheet.Range("$A$5:$O$55").AutoFilter Field:=8, Operator:= _
xlFilterValues, Criteria2:=Array(0, "10/2/2010")
Impossible de récupérer la valeur "10/02/2010", j'ai essayé de surveiller Criteria2('1) par espion : toujours vide
Désespérant !
Merci de vos bonnes lumières
Re,
Ça m'a aussi pris un peu la tête pour trouver..
D'abord trouver le bug d'excel pour les critères dans une colonne date.. tu ne l'a probablement pas remarquer mais contrairement a ce que tu dis dans ton exposer ce n'est pas "dd/mm/yyyy" qui est d'application mais bien "mm/dd/yyyy" d'où plantage évident dés que la date du jour est > 12. Probablement que le 0 qui est en premier dans l'array est la référence au format mais je n'ai trouvé aucune doc sur ce sujet alors j'ai inversé les dates du filtre comme ça..
Dim filtre As String
Dim d As Date
d = "30/06/2011"
filtre = Month(d) & "/" & Day(d) & "/" & Year(d)
ActiveSheet.Range("$A$5:$O$13").AutoFilter Field:=15
ActiveSheet.Range("$A$5:$O$13").AutoFilter Field:=15, Operator:= _
xlFilterValues, Criteria2:=Array(0, filtre)
Et ça fonctionne...
Je ne comprend rien à ta macro, même pour du 2003 elle me semble un peu tirée par les cheveux mais je ne connais pas le contexte..
Essaye déjà avec ce rectificatif pour la date et reviens pour la suite si nécessaire.
A+
Edit : En relisant ton dernier poste j'ai compris ce que ta macro fait, j'examine cela demain, maintenant.. dodo.
Je trouve absolument génial d'avoir une solution aussi rapidement ! ça n'est pas le cas de tous les forums !
Je vais intégrer cette solution, fort logique finalement. Bravo !
Pour ce qui est de ma Sub, je dois avouer que j'avais travaillé par copier coller sur des exemples de l'aide... ça n'est pas glorieux mais ça marchait.
Merci encore !
Re,
En fait, après quelques essais, je reste bloqué dans l'impossibilité de lire ce Criteria2. je suis heureux d'avoir compris la structure du Array de stockage d'un ou plusieurs critères date mais pour autant, je ne parviens toujours pas à récupérer sa valeur ni a intervenir sur le format comme tu me le montres dans le bout de code exemple que tu m'envois.
Je continue de chercher....
Re,
suite au bug signaler plus haut, je constate qu'il est impossible de lire les contenus de criter1 et 2 vu qu'il y à des erreurs dans l'agencement des dates.
J'ai trouvé l'aide sur ce sujet mais leur modèle bug, même avec des données valide. J'y ai remédié mais la sélection de plus de deux dates fixe est impossible.
Ce qui est possible.
> 2 dates fixes 12/06/2012 et 20/04/2012
> les filtres personnalisés par exemple..
Criteria1:= ">=1/01/2010", Operator:=xlAnd, Criteria2:="<=31/12/2010"
pour une année
Une autre solution serait de mettre la colonne date en texte, mais si ce sont des dates réelles ça va les changer en représentation de la date série. Donc pratiquement à exclure.
Ce qui bug aussi avec la démo de MS...
ActiveSheet.Range("$A$5:$O$13").AutoFilter Field:=4, Criteria1:=Array( _
"George", "Georgette", "Jean Claude", "Jule"), Operator:=xlFilterValues
ActiveSheet.Range("$A$5:$O$13").AutoFilter Field:=4
Mais ça j'y ai remédier.
Donne un exemple des filtres que tu emploi je verrais pour adapter.
En attendant voila le code rectifié pour lire le filtre
Dim w As Worksheet
Dim filterArray()
Dim currentFiltRange As String
Sub ChangeFilters()
Set w = ActiveSheet
With w.AutoFilter
currentFiltRange = .Range.Address
With .Filters
ReDim filterArray(1 To .Count, 1 To 3)
For F = 1 To .Count
With .Item(F)
If .On Then
On Error GoTo Passe
filterArray(F, 1) = .Criteria1
If .Operator <> 7 And .Operator <> 0 Then
filterArray(F, 2) = .Operator
filterArray(F, 3) = .Criteria2
Else
filterArray(F, 2) = .Operator
End If
Passe:
If Err Then
MsgBox "Ce filtre n'est pas mémorisable"
Exit Sub
End If
End If
End With
Next
End With
End With
End Sub
Avec ça tu ne sais pas encore mémoriser le filtre mais tu peu déjà voir ceux qui sont possible.
Quand j'aurais tes exemples je verrais pour mémoriser.
A+
Bonjour,
Merci du temps donné pour ce problème et surtout pour la réactivité...
Voila un exemple simple qui montre le problème
le bouton Filtre appelle la Sub FiltreActif pou afficher la requête dans la zone réservée à cet effet en première ligne.
Dans le module1 la Sub FiltreActif dont le comportement a déjà été décrit
Dans le module2 la macro1 enregistrer à l'établissement des filtres
Bonne journée
Bonjour,
En poursuivant ma recherche sur internet, je suis tombé sur ce conseil de tutoriel
auteur : SilkyRoad
Dans Excel2007, l'application est capable d'analyser automatiquement les dates par jour, semaine, mois, semestre ou année ce qui facilite les filtres sur ce type de données.
Ici Image de la listbox hiérarchique de sélection du filtre date
Pour désactiver cette option et dissocier cette hiérarchie (transformation en liste non hiérarchique):
Cliquez sur le Bouton Office.
Cliquez sur le bouton Options Excel.
Sélectionnez le menu Options avancées.
Dans la partie Afficher les options pour ce classeur,
Choisissez le classeur.
Décochez l'option Grouper les dates dans le menu Filtre automatique.
Cliquez sur le bouton OK pour valider.
J'ai bien sûr essayé et l'erreur ne se produit plus
Ca ne résout pas le problème mais ça permet d'attendre ! Ne boudons pas notre plaisir !
Re,
Ça ne résout pas le problème mais ça permet d'attendre ! Ne boudons pas notre plaisir !
Bien d'avoir trouver cette propriété d'Excel.
Quel est le problème qui reste ?
Le problème restant est de comprendre pourquoi, dans le cas d'une configuration de liste hiérarchisée pour les dates, le Criteria1 n'est pas mouvementé et le Criteria2 l'est sous la forme d'un tableau parfaitement illisible (valeurs non récupérables) comme très précisément montré dans mes messages et fichier joint précédents
A suivre !!!
Le problème restant est d'être capable de lire la valeur de Criteria2 et de comprendre pourquoi Criteria1 est ignoré, dans la configuration où les listes de filtres de dates sont hiérarchisées.
A suivre ...
Ainsi va la vie !....
Je ne comprends pas ! Par deux fois j'ai répondu pour préciser le problème non résolu et je ne vois pas mes messages dans le dialogue
Je précisais que dans le cas d'un configuration (par défaut) de Listes hiérarchisées pour les filtres automatiques de dates, Criteria1 n'est pas visible et Ctiteria2 n'est pas accessible.
J'espère que si moi, je ne vois pas mes messages postés, au moins le Forum les verra....
Autant pour moi, je viens de voir mes messages !
Re,
Je ne sais pas si ça va t'aidé, voila une solution que je viens de trouver et qui fonctionne.
Il y a inversion du mois et du jour,
Par exemple pour exclure toute les date du jour actuel..
Dim d As String
d = Month(Date) & "/" & Day(Date) & "/" & Year(Date)
ActiveSheet.Range("$B$3:$D$53").AutoFilter Field:=3, Criteria1:= _
"<>" & d, Operator:=xlAnd
Une sélection entre deux dates
Dim DatDeb As String
Dim DatFin As String
DatDeb = "02/12/2012"
DatFin = "02/22/2012"
ActiveSheet.Range("$B$3:$D$53").AutoFilter Field:=3, Criteria1:= _
">=" & DatDeb, Operator:=xlAnd, Criteria2:="<=" & DatFin
A+
Merci de prendre encore du temps pour moi !
Je précise le problème à nouveau :
Après avoir établi un filtre automatique, ma Sub FiltreActif() me permet normalement de récupérer les valeurs de Criteria1 et Criteria2, pour constituer une chaîne que j'affiche afin que l'utilisateur ait sous les yeux le ou les critères de filtrage.
Dans Excel2010, si le classeur est dans l'option liste hiérarchisées pour les filtres date, Criteria1 n'existe pas (donc ma Sub part en erreur) et Criteria2 est illisible (donc pas de quoi constituer mon affichage de critère ! Voir le fichier exemple que j'ai posté)
Je peux gérer l'absence de Criteria1 en testant la nature de la colonne filtrée (date ou pas date) mais je ne sais pas comment récupérer le 2ème élément du tableau Criteria2 (Array(0,"date") quel que soit le format date utilisé .