Filtre élaboré avec nombre de critère variables

Adriano43

XLDnaute Occasionnel
Bonjour à tous

Débutant en vba, je suis tombé sur votre forum qui est vraiment très riche d'enseignements. Après plusieurs recherches et n'ayant pas trouvé la solution, je crée un nouveau topic; voici mon problème:

J'ai un classeur excel qui contient plusieurs onglets. Je dois faire des extractions à partir de l'onglet 1 (décrivant les semaines, et qui est donc actualisé chaques semaine)
Les critères se situent sur une autre feuille disons la feuille2, le nombre de critères est variable et l'extraction peut nécessiter des conditions de "et" et "ou".
Le résultat de l'extraction devra apparaitre sur le feuille 2 en cellule A5.
Mon problème:
Je réussis à faire la macro mais en définissant la zone de critères (exemple: A1:N3); si il y a une condition "et" et "ou", l'extraction fonctionne. Par contre si il n'y a qu'une condition "et" ou "ou" c'est à dire que soit la ligne 2 ou la ligne 3 est vide; le résultat de l'extraction est une copie de ma base de données. Il faudra je pense que la macro exclut les cellules vides dans la plage de critères pour ne faire l'extraction qu'à partir des critères mis par l'utilisateur.

Je vous joins un exemple de mon fichier.

Merci de votre aide

Cordialement

Adriano
 

Pièces jointes

  • Test.xlsm
    20.5 KB · Affichages: 103
  • Test.xlsm
    20.5 KB · Affichages: 107
  • Test.xlsm
    20.5 KB · Affichages: 113
Dernière édition:

Adriano43

XLDnaute Occasionnel
Re : Filtre élaboré avec nombre de critère variables

Sub Macro7()
'
' Macro7 Macro
Dim bdd As Range
Dim critères As Range

'Définition de la plage base de données située en feuille1
Sheets(1).Select
Set bdd = Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.CurrentRegion.Select

'Définition de la plage de critères située sur la feuille active débutant en A1
With ActiveSheet
Set critères = Range("A1").Select
Selection.CurrentRegion.Select
End With

'Réalisation du tri et affichage des résultats à partir de A15
Sheets(1).Range(bdd).AdvancedFilter Action:=xlFilterCopy, _
CriteriaRange:=Range(critères), CopyToRange:=Range("A15:AK15"), Unique _
:=False

End Sub

Voicie le code que j'ai réalisé en définissant ma plage de données qui est variable mais débute toujours en A1, ma plage de critères située sur ma feuille active qui débute en A1 et j'ai adapté le code du filtre en fonction de mes plages "bdd" et "critères" mais j'ai un bug.
Quelqu'un pourrait il s'il vous plait corriger ce code?

Cordialement

Adriano
 

Fred92

XLDnaute Nouveau
Re : Filtre élaboré avec nombre de critère variables

Bonjour Adriano43,

Pour résoudre ton problème, je procèderai différemment.

Comme ta table de valeurs contient 7 colonnes (7 champs) il y a donc un maximum de 7 critères pour filtrer avec la fonction "ET".

Pour filtrer avec la fonction "OU", j'utiliserai un séparateur de type ";" pour chacun des 7 critères du filtre "ET".

Voir le fichier joint dans lequel j'ai réorganisé tes critères de filtre.

Maintenant le principe serait le suivant:

1ère étape:
je séquence toutes les possibilités de filtre en générant pour chacune d'entre elles une chaine de caractère de type:
a;b;c;d;e;f;g (si il n'y a pas de critère sur une colonne, on place le caractère vide "" entre deux points virgules)
Ces chaines de caractères sont stockées dans une table (Pour la manipulation des tables tu trouveras toutes les infos nécessaires sur le net). En reprenant le fichier Test, celà donnerait à stocker dans une table les chaines suivantes:
";COM;;6;;;arc"
";COM;;1;;;arc"
";COM;;6;;;pannes"
etc...

Pour rédiger le code sur cette première partie, tu pourras utiliser la fonction Split: u() = Split(Cellule contenant le critère, Chr(59)) (Chr(59) c'est le code ASCII du point virgule).


2ème étape:
Je compare chacune des lignes de ta feuille "Données" (en générant une chaine de caractère avec le point virgule comme séparateur et en remplaçant la valeur par le caractère vide "" si la colonne de critère correspondant est vide) avec chacune des lignes de la table.

Ainsi, si je reprend l'exemple de la feuille Test, la première ligne de la feuille données, donnerait comme chaine de caractères la valeur suivante:
";HALLE;;1;;;pannes"

Pour faire cette comparaison, on utilise la fonction VBA "Instr" par exemple.

Si la ligne de la feuille "Données" est identique avec une des données de la table alors je copie cette ligne dans la feuille2.

J'espère avoir été suffisemment clair. Je ne sais pas si cette méthode est la plus rapide, mais elle offre l'avantage de pouvoir filtrer avec autant de critères "OU" que tu le souhaites.

Le code est un petit peu long a rédiger mais ne pose pas de problème particulier.

Bonne journée.

Fred92
 

Pièces jointes

  • Test.xlsm
    18.9 KB · Affichages: 109
  • Test.xlsm
    18.9 KB · Affichages: 116
  • Test.xlsm
    18.9 KB · Affichages: 128

Adriano43

XLDnaute Occasionnel
Re : Filtre élaboré avec nombre de critère variables

Bonjour Fred

Tout d'abord merci de ta réponse, je pense avoir saisi ta démarche qui aboutie au résultat souhaité.
Néanmoins, ce fichier devant être utilisé par plusieurs personnes dont certaines ne maitrisent forcément très bien Excel, je pense que de mettre un critères par cellule serait plus adéquat.
C'est cette raison qui m'a pousée à mettre en place des tables pour les critères, les utilisateurs devant renseigner les critères souhaitées, la macro devant elle utiliser cette table pour son extraction.
Mon erreur dans le code que je vous ai proposé vient de la définition des tables, mais je ne vois pas laquelle???
As tu une idée?

PS: Pour épondre à ton premier poste, la zone de critères est toujours située à partir de la cellule A1 de la feuille ou sera faite l'extraction.

Merci de votre aide
 

tototiti2008

XLDnaute Barbatruc
Re : Filtre élaboré avec nombre de critère variables

Bonjour Adriano, bonjour Fred92,

Si j'ai compris quelque chose, Range("A1").currentregion devrait systématiquement renvoyer la zone de critères, donc

Code:
Sub Macro7()
'
' Macro7 Macro
    Dim bdd As Range
    Dim critères As Range
    
'Définition de la plage base de données située en feuille1
    Sheets(1).Select
    Set bdd = Range("A1").CurrentRegion
    
'Définition de la plage de critères située sur la feuille active débutant en A1
    With Sheets(2)
    Set critères = .Range("A1").CurrentRegion
    End With
    
'Réalisation du tri et affichage des résultats à partir de A15
    Sheets(1).Range(bdd).AdvancedFilter Action:=xlFilterCopy, _
        CriteriaRange:=critères, CopyToRange:=sheets(2).Range("A15:AK15"), Unique _
        :=False
    
End Sub

Edit : @Fred : j'avais pas bien compris où tu voulais en venir
En fait, le filtre élaboré gère déjà les OU en mettant les critères sur une ligne différente
ça pose le problème des résultats en ligne 5 si beaucoup de OU dans les critères, mais je suppose que la place gardée pour les critères a été pensée.. Sinon envisager de mettre les critères à part, loin des données résultantes
 
Dernière édition:

Fred92

XLDnaute Nouveau
Re : Filtre élaboré avec nombre de critère variables

Si je comprends bien, pour le critère "OU", il suffit d'indiquer à nouveau la même colonne mais avec une valeur différente.

Je réfléchi sur ton problème et te tiens informé.

A plus tard

Fred92
 

Adriano43

XLDnaute Occasionnel
Re : Filtre élaboré avec nombre de critère variables

Bonjour Toto

Et merci pour avoir corrigé mon code, je pense que cela devrait être fonctionnel.
Je vous tiens au courant de l'utilisation de cette macro pour voir au quotidien si cela fonctionne.

Merci de votre aide en tout cas

PS: Je reviens vers vous en fin de semaine pour tenir informés
 

Adriano43

XLDnaute Occasionnel
Re : Filtre élaboré avec nombre de critère variables

Bonjour Toto

C'est exactement cela que je souhaite faire et merci d'avoir corrigé mon code.
Cependant il y a une erreur dans le fonctionnement.
En effet, si l'on renseigne qu'un seul critère, l'extraction faite par la macro nous renvoi une copie complète de la base de données.
La macro doit tenir compte de la zone de critère définie à partir de A1 de la feuille active ce qui apparemment elle ne semble pas faire. En effet, si l'on renseigne 2 lignes dse critères tout fonctionne; en revanche lorsque l'on saisi une ligne de critères, l'extraction est une copie de la base de données...
La sélection de critères doit s'apparenter à un CTRL+* ce qui permet de sélectionner la table contenant des critères
Une idée?

Merci à vous
 
Dernière édition:

Adriano43

XLDnaute Occasionnel
Re : Filtre élaboré avec nombre de critère variables

Bonjour à tous!!

Bien qu'ayant avancé avec l'aide de fred et tototiti, il reste un problème que je n'arrive pas à solutionner, pourriez vous m'aider?
Je souhaite remplacer "sheets(2)" par ActiveSheet ce qui fonctionne dans la ligne définissant la plage de critères mais ne fonctionen plus dans la ligne de code effectuant le tri et affichage du résultat.

Poucez vous m'aider SVP?

Merci d'avance
 

Discussions similaires

Réponses
40
Affichages
2 K
  • Résolu(e)
Microsoft 365 Filtre élaboré
Réponses
3
Affichages
284
Réponses
12
Affichages
592

Statistiques des forums

Discussions
314 450
Messages
2 109 724
Membres
110 552
dernier inscrit
jasson