OVH Cloud OVH Cloud

Filtre activé =VRAI

17 réponses
Avatar
Croy
Bonjour =E0 tous,

Supposons positionn=E9 en 2=E8me ligne des fl=E8ches de filtre
automatique. Les cellules A2, B2,...., portent donc chacune une
fl=E8che de fitre.

Y a-t-il une possibilit=E9 de ramener la valeur VRAI (ou tout autre
information) dans la cellule A2 p.ex. si le filtre en A2 est activ=E9 ?

En d'autres mots y a-t-il un moyen d'avoir un retour d'information sur
le fait qu'un filtre sur une colonne particuliaire est actif ou pas ?

Que =E7a serait bien si c'=E9tait possible ! Merci d'avance. - Croy

10 réponses

1 2
Avatar
Pierre Fauconnier
Bonsoir

Une approche

feuil1.AutoFilter.Filters(1).On renvoie VRAI si le filtre est activé
feuil1.AutoFilter.Filters(1).Criteria1 renvoie la valeur du filtre

Voici une valeur qui renvoie
- chaine vide si la cellule considérée n'est pas dans une plage filtrée ou
si la feuille de la cellule n'a pas de filtre
- FALSE si la cellule est dans une colonne de filtre mais que le filtre
n'est pas actif pour cette colonne
- La valeur du critère si le filtre est actif

Function ValeurFiltre(Cellule As Range)
Dim Feuille As Worksheet
Dim ColonneFiltreCellule As Integer
Set Feuille = Cellule.Parent

If Feuille.FilterMode = False Then Exit Function

If Intersect(Cellule, Feuille.AutoFilter.Range) Is Nothing Then Exit
Function

ColonneFiltreCellule = Cellule.Column - Feuille.AutoFilter.Range(1,
1).Column + 1

If Feuille.AutoFilter.Filters(ColonneFiltreCellule).On Then
ValeurFiltre =
Feuille.AutoFilter.Filters(ColonneFiltreCellule).Criteria1
Else
ValeurFiltre = False
End If
End Function

Ok?

--
Pierre Fauconnier () (Skype:
pierre_fauconnier)
"Les choses qui n'ont rien en commun ont en commun qu'elles n'ont rien en
commun"
Remplacez nospam.nospam par pfi.be pour répondre. Merci

"Croy" a écrit dans le message de news:

Bonjour à tous,

Supposons positionné en 2ème ligne des flèches de filtre
automatique. Les cellules A2, B2,...., portent donc chacune une
flèche de fitre.

Y a-t-il une possibilité de ramener la valeur VRAI (ou tout autre
information) dans la cellule A2 p.ex. si le filtre en A2 est activé ?

En d'autres mots y a-t-il un moyen d'avoir un retour d'information sur
le fait qu'un filtre sur une colonne particuliaire est actif ou pas ?

Que ça serait bien si c'était possible ! Merci d'avance. - Croy
Avatar
FxM
Bonsoir,

Attention aux coupures de lignes.

Public Function fil(cell)
Application.Volatile True
With Sheets(cell.Parent.Name)
If .AutoFilter Is Nothing Then
fil = "Inactif !"
Else
For a = 1 To .AutoFilter.Filters.Count
If .AutoFilter.Range.Item(a).Row = cell.Row And
.AutoFilter.Range.Item(a).Column = cell.Column Then
fil = .AutoFilter.Filters.Item(a).On
Exit For
End If
Next a
End If
End With
End Function

http://cjoint.com/?ljtxpSKLVJ

@+
FxM


Bonjour à tous,

Supposons positionné en 2ème ligne des flèches de filtre
automatique. Les cellules A2, B2,...., portent donc chacune une
flèche de fitre.

Y a-t-il une possibilité de ramener la valeur VRAI (ou tout autre
information) dans la cellule A2 p.ex. si le filtre en A2 est activé ?

En d'autres mots y a-t-il un moyen d'avoir un retour d'information sur
le fait qu'un filtre sur une colonne particuliaire est actif ou pas ?

Que ça serait bien si c'était possible ! Merci d'avance. - Croy



Avatar
JB
Bonsoir,

A placer dans un module:

Function Estfiltré()
Application.Volatile
Estfiltré = IIf(ActiveSheet.AutoFilterMode, "Filtré", "pas
filtré")
End Function

Dans le tableur: =EstFiltré()

La fonction ci dessous donne l'expression du filtre:

VILLE=Paris QUALIF=C DateNaiss>/10/60 par exemple.

http://cjoint.com/?ljvw2HMOgz

Function FiltreTotal()
Application.Volatile
chaine = ""
For c = 1 To Range("_FilterDataBase").Columns.Count
If FiltreActuel(c) <> "*" Then
If IsDate(Range("_FilterDataBase").Cells(2, c)) Then
chaine = chaine & Range("_FilterDataBase").Cells(1, c) &
FiltreActuel(c, "D") & " "
Else
chaine = chaine & Range("_FilterDataBase").Cells(1, c).Value &
FiltreActuel(c) & " "
End If
End If
Next c
If chaine = "" Then chaine = "Tout"
FiltreTotal = chaine
End Function

Function FiltreActuel(col, Optional typeCol As String)
Application.Volatile
If ActiveSheet.AutoFilterMode Then
If ActiveSheet.AutoFilter.Filters.Item(col).On Then
temp = ActiveSheet.AutoFilter.Filters.Item(col).Criteria1
If Left(temp, 2) = ">=" Or Left(temp, 2) = "<=" Then
o = Left(temp, 2): n = Mid(temp, 3)
Else
If Left(temp, 1) = "=" Or Left(temp, 1) = ">" Or Left(temp, 1)
= "<" Then
o = Left(temp, 1): n = Mid(temp, 2)
Else
n = temp
End If
End If
If typeCol = "D" Then n = Format(n, "dd/mm/yy")
temp = o & n
'---
If ActiveSheet.AutoFilter.Filters.Item(col).Operator Then
oper = IIf(ActiveSheet.AutoFilter.Filters.Item(col).Operator
= 1, " ET ", " OU ")
On Error Resume Next
Err = 0
temp2 = ActiveSheet.AutoFilter.Filters.Item(col).Criteria2
If Err = 0 Then
If Left(temp2, 2) = ">=" Or Left(temp2, 2) = "<=" Then
o = Left(temp2, 2): n = Mid(temp2, 3)
Else
If Left(temp2, 1) = "=" Or Left(temp2, 1) = ">" Or
Left(temp2, 1) = "<" _
Then o = Left(temp2, 1): n = Mid(temp2, 2)
End If
If typeCol = "D" Then n = Format(n, "dd/mm/yy")
temp2 = o & n
Else
oper = ""
End If
End If
FiltreActuel = temp & oper & temp2
Else
FiltreActuel = "*"
End If
Else
FiltreActuel = "Pas de filtre"
End If
End Function

Cordialement JB


Bonjour à tous,

Supposons positionné en 2ème ligne des flèches de filtre
automatique. Les cellules A2, B2,...., portent donc chacune une
flèche de fitre.

Y a-t-il une possibilité de ramener la valeur VRAI (ou tout autre
information) dans la cellule A2 p.ex. si le filtre en A2 est activé ?

En d'autres mots y a-t-il un moyen d'avoir un retour d'information sur
le fait qu'un filtre sur une colonne particuliaire est actif ou pas ?

Que ça serait bien si c'était possible ! Merci d'avance. - Croy


Avatar
Croy
Bonjour à tous,

Merci mille fois pour toutes vos réponses.

Comme je suis à mille lieues d'être une tronche en VBA (mais je me
suis inscrit à un cours!) ça va vraissemblablement me prendre un
moment pour tester vos réponses et comprendre la différence qu'il y a
entre elles, comprendre pourquoi aussi y en a des longues et pourquoi y
en a des courtes...;-)

Je dévellope juste un peu le but ma question pour ceux que ça
intéressent :

Tout le monde à été confronté au fait que les programmeurs d'Excel
ont rien trouvé de mieux que de teinter en bleu une flèche de filtre
activé et en noir une flèche de filtre non activé. Or ces couleurs
ne contrastent pas suffisament bien et il n'est pas aisé d'identifier
visuellement la position d'un filtre. Les recherches que j'ai pu faire
m'ont apprises qu'il n'y avait pas de possibilité de changer la
couleur de la flêche de filtre.

Par contre étant donné qu'il est possible (à vous en croire) de
ramener l'info que le filtre est activé alors on peut facilement avec
une mise-en-forme conditionnelle clorier une cellule portant un filtre
activé, ainsi l'on solutionne le problème.

Peut-être même que l'on peu colorier la cellule sans passer par une
mise en forme conditionnelle en modifiant qu'un tout petit peu l'un de
vos codes ?

Merci encore pour votre aide, je me réjouis d'étudier votre code -
Croy
Avatar
JB
-Alt+F11
-Insertion/Module
-Copier/Coller des fonctions:

Function Estfiltré()
Application.Volatile
Estfiltré = IIf(ActiveSheet.AutoFilterMode, "Filtré", "pas filtré")
End Function

-Dans le tableur

=EstFiltré()

La même chose pour les autres fonctions.

JB


Bonsoir,

A placer dans un module:

Function Estfiltré()
Application.Volatile
Estfiltré = IIf(ActiveSheet.AutoFilterMode, "Filtré", "pas
filtré")
End Function

Dans le tableur: =EstFiltré()

La fonction ci dessous donne l'expression du filtre:

VILLE=Paris QUALIF=C DateNaiss>/10/60 par exemple.

http://cjoint.com/?ljvw2HMOgz

Function FiltreTotal()
Application.Volatile
chaine = ""
For c = 1 To Range("_FilterDataBase").Columns.Count
If FiltreActuel(c) <> "*" Then
If IsDate(Range("_FilterDataBase").Cells(2, c)) Then
chaine = chaine & Range("_FilterDataBase").Cells(1, c) &
FiltreActuel(c, "D") & " "
Else
chaine = chaine & Range("_FilterDataBase").Cells(1, c).Value &
FiltreActuel(c) & " "
End If
End If
Next c
If chaine = "" Then chaine = "Tout"
FiltreTotal = chaine
End Function

Function FiltreActuel(col, Optional typeCol As String)
Application.Volatile
If ActiveSheet.AutoFilterMode Then
If ActiveSheet.AutoFilter.Filters.Item(col).On Then
temp = ActiveSheet.AutoFilter.Filters.Item(col).Criteria1
If Left(temp, 2) = ">=" Or Left(temp, 2) = "<=" Then
o = Left(temp, 2): n = Mid(temp, 3)
Else
If Left(temp, 1) = "=" Or Left(temp, 1) = ">" Or Left(temp , 1)
= "<" Then
o = Left(temp, 1): n = Mid(temp, 2)
Else
n = temp
End If
End If
If typeCol = "D" Then n = Format(n, "dd/mm/yy")
temp = o & n
'---
If ActiveSheet.AutoFilter.Filters.Item(col).Operator Then
oper = IIf(ActiveSheet.AutoFilter.Filters.Item(col).Operator
= 1, " ET ", " OU ")
On Error Resume Next
Err = 0
temp2 = ActiveSheet.AutoFilter.Filters.Item(col).Criteria2
If Err = 0 Then
If Left(temp2, 2) = ">=" Or Left(temp2, 2) = "<=" T hen
o = Left(temp2, 2): n = Mid(temp2, 3)
Else
If Left(temp2, 1) = "=" Or Left(temp2, 1) = ">" Or
Left(temp2, 1) = "<" _
Then o = Left(temp2, 1): n = Mid(temp2, 2)
End If
If typeCol = "D" Then n = Format(n, "dd/mm/yy")
temp2 = o & n
Else
oper = ""
End If
End If
FiltreActuel = temp & oper & temp2
Else
FiltreActuel = "*"
End If
Else
FiltreActuel = "Pas de filtre"
End If
End Function

Cordialement JB


Bonjour à tous,

Supposons positionné en 2ème ligne des flèches de filtre
automatique. Les cellules A2, B2,...., portent donc chacune une
flèche de fitre.

Y a-t-il une possibilité de ramener la valeur VRAI (ou tout autre
information) dans la cellule A2 p.ex. si le filtre en A2 est activé ?

En d'autres mots y a-t-il un moyen d'avoir un retour d'information sur
le fait qu'un filtre sur une colonne particuliaire est actif ou pas ?

Que ça serait bien si c'était possible ! Merci d'avance. - Croy




Avatar
MichDenis
AutoFilterMode = Dénote la présence des boutons du filtre automatique
sur une plage de données d'une feuille... qu'il y ait un filtre en application ou non

Si quelqu'un désire savoir si une plage de cellules un filtre est en application,
il faut utiliser la propriété ModeFilter d'un objet Worksheet ...
Estfiltré = IIf(ActiveSheet.FilterMode, "Filtré", "pas filtré")


"JB" a écrit dans le message de news:

-Alt+F11
-Insertion/Module
-Copier/Coller des fonctions:

Function Estfiltré()
Application.Volatile
Estfiltré = IIf(ActiveSheet.AutoFilterMode, "Filtré", "pas filtré")
End Function

-Dans le tableur

=EstFiltré()

La même chose pour les autres fonctions.

JB


Bonsoir,

A placer dans un module:

Function Estfiltré()
Application.Volatile
Estfiltré = IIf(ActiveSheet.AutoFilterMode, "Filtré", "pas
filtré")
End Function

Dans le tableur: =EstFiltré()

La fonction ci dessous donne l'expression du filtre:

VILLE=Paris QUALIF=C DateNaiss>/10/60 par exemple.

http://cjoint.com/?ljvw2HMOgz

Function FiltreTotal()
Application.Volatile
chaine = ""
For c = 1 To Range("_FilterDataBase").Columns.Count
If FiltreActuel(c) <> "*" Then
If IsDate(Range("_FilterDataBase").Cells(2, c)) Then
chaine = chaine & Range("_FilterDataBase").Cells(1, c) &
FiltreActuel(c, "D") & " "
Else
chaine = chaine & Range("_FilterDataBase").Cells(1, c).Value &
FiltreActuel(c) & " "
End If
End If
Next c
If chaine = "" Then chaine = "Tout"
FiltreTotal = chaine
End Function

Function FiltreActuel(col, Optional typeCol As String)
Application.Volatile
If ActiveSheet.AutoFilterMode Then
If ActiveSheet.AutoFilter.Filters.Item(col).On Then
temp = ActiveSheet.AutoFilter.Filters.Item(col).Criteria1
If Left(temp, 2) = ">=" Or Left(temp, 2) = "<=" Then
o = Left(temp, 2): n = Mid(temp, 3)
Else
If Left(temp, 1) = "=" Or Left(temp, 1) = ">" Or Left(temp, 1)
= "<" Then
o = Left(temp, 1): n = Mid(temp, 2)
Else
n = temp
End If
End If
If typeCol = "D" Then n = Format(n, "dd/mm/yy")
temp = o & n
'---
If ActiveSheet.AutoFilter.Filters.Item(col).Operator Then
oper = IIf(ActiveSheet.AutoFilter.Filters.Item(col).Operator
= 1, " ET ", " OU ")
On Error Resume Next
Err = 0
temp2 = ActiveSheet.AutoFilter.Filters.Item(col).Criteria2
If Err = 0 Then
If Left(temp2, 2) = ">=" Or Left(temp2, 2) = "<=" Then
o = Left(temp2, 2): n = Mid(temp2, 3)
Else
If Left(temp2, 1) = "=" Or Left(temp2, 1) = ">" Or
Left(temp2, 1) = "<" _
Then o = Left(temp2, 1): n = Mid(temp2, 2)
End If
If typeCol = "D" Then n = Format(n, "dd/mm/yy")
temp2 = o & n
Else
oper = ""
End If
End If
FiltreActuel = temp & oper & temp2
Else
FiltreActuel = "*"
End If
Else
FiltreActuel = "Pas de filtre"
End If
End Function

Cordialement JB


Bonjour à tous,

Supposons positionné en 2ème ligne des flèches de filtre
automatique. Les cellules A2, B2,...., portent donc chacune une
flèche de fitre.

Y a-t-il une possibilité de ramener la valeur VRAI (ou tout autre
information) dans la cellule A2 p.ex. si le filtre en A2 est activé ?

En d'autres mots y a-t-il un moyen d'avoir un retour d'information sur
le fait qu'un filtre sur une colonne particuliaire est actif ou pas ?

Que ça serait bien si c'était possible ! Merci d'avance. - Croy




Avatar
Croy
Merci JB,

J'ai vu que tu m'avais déjà expliqué tout ça plus haut.

Mais quand je copie =EstFiltré() au niveau du classeur (j'imagine dans
les cellules qui portent le filtre) la cellule écris texto
=EstFiltré() , j'ai essayé de la convertir pour voir si c'est
parceque elle était en format texte mais que neni, c'est du kif ?

J'ai vu aussi que tu as joint un classeur : il est vraiment génial,
merci beaucoup :-) Croy
Avatar
MichDenis
En passant, "filterMode" détecte aussi la présence d'un filtre auto en application que la présence
d'un filtre élaboré en application dans la feuille.


"MichDenis" a écrit dans le message de news:

AutoFilterMode = Dénote la présence des boutons du filtre automatique
sur une plage de données d'une feuille... qu'il y ait un filtre en application ou non

Si quelqu'un désire savoir si une plage de cellules un filtre est en application,
il faut utiliser la propriété ModeFilter d'un objet Worksheet ...
Estfiltré = IIf(ActiveSheet.FilterMode, "Filtré", "pas filtré")


"JB" a écrit dans le message de news:

-Alt+F11
-Insertion/Module
-Copier/Coller des fonctions:

Function Estfiltré()
Application.Volatile
Estfiltré = IIf(ActiveSheet.AutoFilterMode, "Filtré", "pas filtré")
End Function

-Dans le tableur

=EstFiltré()

La même chose pour les autres fonctions.

JB


Bonsoir,

A placer dans un module:

Function Estfiltré()
Application.Volatile
Estfiltré = IIf(ActiveSheet.AutoFilterMode, "Filtré", "pas
filtré")
End Function

Dans le tableur: =EstFiltré()

La fonction ci dessous donne l'expression du filtre:

VILLE=Paris QUALIF=C DateNaiss>/10/60 par exemple.

http://cjoint.com/?ljvw2HMOgz

Function FiltreTotal()
Application.Volatile
chaine = ""
For c = 1 To Range("_FilterDataBase").Columns.Count
If FiltreActuel(c) <> "*" Then
If IsDate(Range("_FilterDataBase").Cells(2, c)) Then
chaine = chaine & Range("_FilterDataBase").Cells(1, c) &
FiltreActuel(c, "D") & " "
Else
chaine = chaine & Range("_FilterDataBase").Cells(1, c).Value &
FiltreActuel(c) & " "
End If
End If
Next c
If chaine = "" Then chaine = "Tout"
FiltreTotal = chaine
End Function

Function FiltreActuel(col, Optional typeCol As String)
Application.Volatile
If ActiveSheet.AutoFilterMode Then
If ActiveSheet.AutoFilter.Filters.Item(col).On Then
temp = ActiveSheet.AutoFilter.Filters.Item(col).Criteria1
If Left(temp, 2) = ">=" Or Left(temp, 2) = "<=" Then
o = Left(temp, 2): n = Mid(temp, 3)
Else
If Left(temp, 1) = "=" Or Left(temp, 1) = ">" Or Left(temp, 1)
= "<" Then
o = Left(temp, 1): n = Mid(temp, 2)
Else
n = temp
End If
End If
If typeCol = "D" Then n = Format(n, "dd/mm/yy")
temp = o & n
'---
If ActiveSheet.AutoFilter.Filters.Item(col).Operator Then
oper = IIf(ActiveSheet.AutoFilter.Filters.Item(col).Operator
= 1, " ET ", " OU ")
On Error Resume Next
Err = 0
temp2 = ActiveSheet.AutoFilter.Filters.Item(col).Criteria2
If Err = 0 Then
If Left(temp2, 2) = ">=" Or Left(temp2, 2) = "<=" Then
o = Left(temp2, 2): n = Mid(temp2, 3)
Else
If Left(temp2, 1) = "=" Or Left(temp2, 1) = ">" Or
Left(temp2, 1) = "<" _
Then o = Left(temp2, 1): n = Mid(temp2, 2)
End If
If typeCol = "D" Then n = Format(n, "dd/mm/yy")
temp2 = o & n
Else
oper = ""
End If
End If
FiltreActuel = temp & oper & temp2
Else
FiltreActuel = "*"
End If
Else
FiltreActuel = "Pas de filtre"
End If
End Function

Cordialement JB


Bonjour à tous,

Supposons positionné en 2ème ligne des flèches de filtre
automatique. Les cellules A2, B2,...., portent donc chacune une
flèche de fitre.

Y a-t-il une possibilité de ramener la valeur VRAI (ou tout autre
information) dans la cellule A2 p.ex. si le filtre en A2 est activé ?

En d'autres mots y a-t-il un moyen d'avoir un retour d'information sur
le fait qu'un filtre sur une colonne particuliaire est actif ou pas ?

Que ça serait bien si c'était possible ! Merci d'avance. - Croy




Avatar
Croy
Rebonjour les amis,

Excusez moi de vous déranger encore une fois.

Voilà, j'ai testé toutes les solutions qui m'ont été proposées.

Celle de FxM marche tip-top et celle de JB avec la correction MichDenis
aussi (sauf qu'il faut rajouter "cell" entre les parantèses au moment
de la déclaration de la fonction).

Je n'arrive par contrepas a faire fonctionner celle de Pierre
Fauconnier. De plus si les formules fonctionnent très bien en
Feuille2, les même formule copié-collées en Feuille1 ne fonctionne
pas. Je dois faire une boulette de débutant mais vraiment je vois pas:

http://cjoint.com/?lkpwK2a6du

Si il y a quelqu'un qui passe sur ce fil et qui pourrait m'expliquer ce
qui cloche... ça serait super cool. - Croy
Avatar
FxM
Bonjour Croy,

Concernant la fonction de Pierre :
Pour une raison que je ne maîtrise pas, la fonction sort sur l'instruction
If Feuille.FilterMode = False Then Exit Function
détectant que le filtermode est false alors qu'il est bien true

Ca semble aller en remplaçant cette ligne par :
If Cellule.Parent.FilterMode = False Then Exit Function

Pour ce qui est de la mention dans ton fichier concernant l'éventuel
changement de feuille :
- Toutes les solutions fournies répondent à ta question initiale qui
n'évoquait pas cette possibilité.
- Aucune solution fournie ne fonctionnera pour une formule dans une
feuille différente de celle où le filtre est appliqué (puisque nous
recherchons tous quelle feuille appelle la fonction) et réutilisons
cette feuille.

@+
FxM








Rebonjour les amis,

Excusez moi de vous déranger encore une fois.

Voilà, j'ai testé toutes les solutions qui m'ont été proposées.

Celle de FxM marche tip-top et celle de JB avec la correction MichDenis
aussi (sauf qu'il faut rajouter "cell" entre les parantèses au moment
de la déclaration de la fonction).

Je n'arrive par contrepas a faire fonctionner celle de Pierre
Fauconnier. De plus si les formules fonctionnent très bien en
Feuille2, les même formule copié-collées en Feuille1 ne fonctionne
pas. Je dois faire une boulette de débutant mais vraiment je vois pas:

http://cjoint.com/?lkpwK2a6du

Si il y a quelqu'un qui passe sur ce fil et qui pourrait m'expliquer ce
qui cloche... ça serait super cool. - Croy



1 2