Filtre avec contient des variables - VB/VBA/VBS - Programmation
Marsh Posté le 10-09-2013 à 09:39:24
Bonjour,
je suis déjà étonné que cela fonctionne avec une variable tableau à 2 éléments !
Car quand on regarde l'aide d'AutoFilter (encore une fois le réflexe à avoir !),
on voit qu'il y a un argument Criteria2 dévolu donc pour le second critère …
Marsh Posté le 10-09-2013 à 09:54:45
Bonjour Marc,
C'est grâce à l'enregistreur que j'ai pu mettre deux élements, et j'ai ensuite remplacer mes données par mes variables, et cela fonctionne.
Si je mets un Criteria2, mon Criteria1 s'annule
Marsh Posté le 10-09-2013 à 10:04:58
Encore une astuce interne à Excel non documentée !
Et c'est vrai que j'en ai débusqué quelques unes grâce à l'Enregistreur de macros …
A part d'utiliser une colonne intermédiaire servant à calculer un SI avec tous les critères,
je ne vois pas de solution vu la limite donc des deux critères …
Marsh Posté le 10-09-2013 à 10:35:46
Je ne comprends pas bien comment utiliser la colonne avec le SI.
Sinon il y a la possibilité de passer par les filtres élaborés mais ça m'a l'air compliqué puisque je ne sais pas combien l'utilitateur va entrer de variable (entre 0 et 15)
Marsh Posté le 10-09-2013 à 11:42:42
La colonne intermédiaire servirait à afficher VRAI ou FAUX selon les conditions, resterait donc à filtrer sur cette colonne …
Via un filtre élaboré, sur la première ligne c'est une condition ET, à partir de la seconde c'est OU.
Autre possibilité par VBA est de filtrer par lots et de recopier le résultat de chaque filtre dans une autre feuille
(ou zone libre de la feuille source comme avec un filtre élaboré) afin d'effectuer un regroupement …
Marsh Posté le 10-09-2013 à 14:30:29
Avec le filtre élaboré je n'y arrive pas car selon le formulaire, certains critères restent vides, donc le filtre prends les cellules "non renseignées", donc en somme il ne filtre pas.
Je vais tenter de rajouter des colonnes à côté de mes colonnes à trier mais je ne sais pas si le
If ActiveCell.Value = "*Variable1*" Or ActiveCell.Value = "*Variable2*" Or ActiveCell.Value = "*Variable3*" etc. Then etc.
Marsh Posté le 10-09-2013 à 14:40:22
En aveugle je n'arrive pas toujours à visualiser le contexte …
Citation : Autre possibilité par VBA est de filtrer par lots et de recopier le résultat de chaque filtre dans une autre feuille |
Comme les critères s'enchaînent pas des OU (Or), qu'est-ce qui t'empêche de filtrer un critère à la fois
puis de copier chaque résultat filtré à la suite dans une autre plage ou autre feuille ?
Marsh Posté le 10-09-2013 à 14:49:25
J'y avais pensé mais je ne pense pas que ça fonctionenrait car je vais filtrer plusieurs colonnes différentes, et que si je fais critère par critère et que je copie-colle, je vais avoir beaucoup de lignes en doublons
Marsh Posté le 10-09-2013 à 14:53:16
Si les autres colonnes à filtrer ne posent pas problème, rien n'empêche alors de filtrer la colonne un critère à la fois
tout en cumulant les filtres des autres colonnes, non ?
Marsh Posté le 10-09-2013 à 16:16:32
Je n'ai pas bien compris ton dernier post....
Par contre en rajoutant une colonne et en comparant les cellules avec les variables j'ai bien mes vrai/faux.
La formule est
If ActiveCell.Value Like Plateforme1 Or ActiveCell.Value Like Plateforme2 Or ActiveCell.Value Like Plateforme3 et non =
Marsh Posté le 10-09-2013 à 16:23:18
Là c'est moi qui ne suis pas ta formule vu que de mon côté je n'en aurais pas besoin pour filtrer des colonnes …
Quant à mon dernier post, après avoir filtrer sur plusieurs colonnes dont un seul critère pour celle posant souci,
copie des données filtrées puis filtre suivant pour la colonne posant souci …
Afin d'éviter un dialogue de sourd et de mieux appréhender ton besoin,
il faudrait détailler le contenu de chaque colonne à filtrer ainsi que leurs filtres respectifs à mettre en œuvre,
cela aiderait mieux à visualiser le concept ! …
Marsh Posté le 10-09-2013 à 16:32:24
Oui tu as raison, je pense que je t'ai noyé.
Alors, mon fichier comporte environ 20 colonnes et 20 000 lignes.
Lorsqu'on lance la macro, plusieurs formulaires apparaissent afin de sélectionner certaines données : les dates que l'on veut traiter, les référence de pièces vendues, les pays dans lesquels elles sont vendues, des mots clefs (que l'on choisit) et qui se trouve dans la colonne "divers".
Pour chacun de ces critères, l'utilisateur peut entrer jusqu'à 10 possibilités.
La macro créé une feuille avec ces renseignements, et crée les variables de type Annee1, Annee2..., Piece1, Piece2, Piece3....
1. Le filtre élaboré ne fonctionne pas puisque certaines "variables" restent vides si l'utilisateur ne les a pas renseigné, ou s'il a choisi moins de 10 choix.
2. Le filtre avec "contient" serait la solution idéale, mais il restreint 2 choix.
J'ai donc suivi ton conseil d'ajouter des colonnes (à côté de celles qui seront filtré), en comparant le contenu de la cellule "piece" avec les références déclarées dans le formulaire.
Je vais "tenter" de le faire pour chaque colonne voulue (les 5), puis je filtrerai les "vrai" de ces cinq colonnes afin de corréler toutes les informations.
Marc, t'ai-je encore plus noyé?
Marsh Posté le 10-09-2013 à 19:10:08
Plus dans le brouillard que noyé …
Là cela va un peu mieux, mais rien ne remplacera un exemple concret …
J'entrevois des boucles par critères (peut-être par paire) du genre :
For each Crit1 in Col1Critères
For each Crit2 in Col2Critères
For each Crit2 in Col3Critères
(etc jusqu'au nombre total de critères …)
Filtrage de chacune des colonnes avec leur critère respectif
Copie des données filtrées pour regroupement
Next Crit3
Next Crit2
Next Crit1
Je crains l'usine à gaz … J'espère ne pas passer à côté de quelque chose de plus simple (TCD, pas ma tasse de thé) …
Si un autre intervenant passe par là et a une idée, il est le bienvenu ‼
Marsh Posté le 11-09-2013 à 11:16:20
Pfff je craque! Je pensais que le Like pourrait remplacer un contient, mais quenini!
Marsh Posté le 11-09-2013 à 12:07:53
Que neni …
Sans exemple concret & détaillé en langage courant (pas informatique) de filtres par colonnes avec ce qu'elles contiennent,
je ne peux guère m'y pencher plus en avant …
Et d'autres avis sont les bienvenus !
Marsh Posté le 12-09-2013 à 10:43:39
J'ai pu tester hier soir sur la version 2007 d'un portable en escale de reproduire
avec l'Enregistreur de macros la même syntaxe du message d'origine de ce sujet :
l'écriture avec Array n'est apparue qu'à partir d'un troisième élément de filtrage.
Habituellement je suis en version 2003 dans laquelle cette manière de coder est impossible …
Mes observations :
- le signe égal n'est pas nécessaire.
- Si recherche exacte dans une colonne, pas de limite à deux éléments pour un filtre.
- Dès qu'une étoile est présente dans le filtre, limite effective à deux éléments, revient donc à utiliser l'argument Criteria2 …
Donc pas d'autre solution de boucler sur les filtres et de regrouper chaque résultat
et pour les doublons ne pas oublier la méthode RemoveDuplicates …
Marsh Posté le 12-09-2013 à 11:09:21
val_ou a écrit : Pfff je craque! Je pensais que le Like pourrait remplacer un contient, mais quenini! |
L'opérateur Like peut rechercher si un texte en contient un autre … Exemple :
Code :
|
Marsh Posté le 13-09-2013 à 13:53:58
Bonjour Marc,
Merci de t'être penché sur mon soucis!
En ce qui me concerne, ma variable était "CGAM" , ma cellule contenait CGAM120, et le code Like ne l'a pas reconnu.
Est-ce à cause des chiffres?!
C'est vraiment dommage qu'on ne puisse pas choisir plus de deux critères pour contient et ne contient pas...
Je vais essayer de passer par les filtres puis copier/coller, filtre, etc.
Mais vu que dans mon formulaire, l'utilisateur peut entrer jusqu'à 10 critères, j'ai peur que s'il en choisit moins, la macro filtre sur "vide" et donc, garde tout.
Je vais tenter et j'vous redis!
Marsh Posté le 13-09-2013 à 14:47:34
Non ce n'est pas à cause des chiffres !
Hé, à quoi cela sert que Ducros se décarcasse ?‼ (je sais, vieille pub …)
Si tu ne testes pas le code précédent recherchant si une chaîne en contient une autre !
Qui plus est je n'ai rien inventé, c'est clairement indiqué dans l'aide de l'opérateur Like, suffit de la lire …
Donc maintenant ce n'est plus un contient mais un commence par :
Code :
|
Via l'aide et en comparant mes deux démonstrations, cela devrait te sauter aux yeux !
Cela marche aussi avec le code précédent car contient englobe tous les cas de figure …
Pour conclure, l'opérateur Like ne pose pas de souci s'il est bien programmé !
La fonction Instr sert aussi à rechercher une chaîne dans une autre …
A mon avis la voie à tester en premier est celle du filtre élaboré, l'envisageant la plus simple à mettre en œuvre.
Mais comme déjà indiqué, sans fichier réel je ne peux guère visualiser plus avant …
Il y aurait peut-être aussi un TCD (voir tutoriel) mais ce n'est vraiment pas ma tasse de thé …
Sinon encore un peu de lecture, des tutoriels :
- L'opérateur LIKE
- Les filtres avancés ou élaborés dans Excel
- Les tableaux croisés dynamiques dans Excel 2007
__________________
Lire, c'est s'investir …
Marsh Posté le 16-09-2013 à 10:11:54
Après investigation, mon Like fonctionne si mon code est du style
Code :
|
Marsh Posté le 16-09-2013 à 10:27:14
Je retire ce que j'ai dit ...
mon code
Range("R2" ).Select
Code :
|
Mes variables Unite1 et Unite2 sont CGAM et CGAN
Or même quand la valeur est XEAD, la macro indique "vrai"
Marsh Posté le 16-09-2013 à 11:43:24
Aucun souci de mon côté ! …
Exemple à tester dans un classeur vierge :
Code :
|
Marsh Posté le 16-09-2013 à 11:49:04
Roh je ne comprends pas pourquoi chez moi ça plante
Du coup j'ai décidé de passer par un filtre élaboré, mais si mes cellules sont vides, le filtre garde tout le tableau.
Quel beau casse tête!
Marsh Posté le 16-09-2013 à 12:18:53
Travailler à coups d'ActiveCell & de Select est rarement judicieux …
Exemple sans déplacement de la cellule active :
Code :
|
Marsh Posté le 09-09-2013 à 16:58:23
Bonjour le forum,
J'aimerais savoir s'il était possible d'effectuer un filtre avec un "contient", non pas pour deux valeurs, mais pour plus.
De plus, ces valeurs sont en réalité des variables.
Voilà ma démarche :
1. Un formulaire recense les données dont l'utilisateur a besoin
2. Création d'une feuille avec ces données
3. Déclaration des variables
Ensuite j'aimerais poser des filtres (sur plusieurs colonnes) avec des "contient" et ces variables.
Pour deux variables, aucun problème :
Par contre, si je tente un :
Il n'y a aucun résultat dans mon tableau, c'est-à-dire tableau vide.
Est-ce possible de filter sur plus de 2 contient?
Merci par avance pour votre lecture et vos réponses!