Filtre avec contient des variables

Filtre avec contient des variables - VB/VBA/VBS - Programmation

Marsh Posté le 09-09-2013 à 16:58:23    

Bonjour le forum,  :hello:  
 
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 :  
 

Code :
  1. Selection.AutoFilter Field:=16, Criteria1:=Array( _
  2.         "=*" & Unite1 & "*", "=*" & Unite2 & "*", Operator:=xlFilterValues


 
 
Par contre, si je tente un :
 

Code :
  1. Selection.AutoFilter Field:=16, Criteria1:=Array( _
  2.         "=*" & Unite1 & "*", "=*" & Unite2 & "*", "=*" & Unite3 & "*" ), Operator:=xlFilterValues


 
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!  :)

Reply

Marsh Posté le 09-09-2013 à 16:58:23   

Reply

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 …  
 

Reply

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 :/

Reply

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 …
 

Reply

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)

Reply

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 …
 

Reply

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.

Reply

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
(ou zone libre de la feuille source comme avec un filtre élaboré) afin d'effectuer un regroupement …


             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 ?
 

Reply

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 :/

Reply

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 ?
 

Reply

Marsh Posté le 10-09-2013 à 14:53:16   

Reply

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 =

Reply

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 ! …


Message édité par Marc L le 10-09-2013 à 16:26:46
Reply

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é? :)

Reply

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 ‼
 

Reply

Marsh Posté le 11-09-2013 à 11:16:20    

Pfff je craque! Je pensais que le Like pourrait remplacer un contient, mais quenini!

Reply

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 !
 

Reply

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  …
 

Reply

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 :
  1. Sub DemoLike()
  2.     S$ = "La voiture rouge"
  3.     M$ = "voiture"
  4.     If S Like "*" & M & "*" Then MsgBox """" & S & """ contient bien """ & M & """ !"
  5. End Sub


Message édité par Marc L le 12-09-2013 à 11:31:10
Reply

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!

Reply

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 :
  1. Sub DemoLikeCommence()
  2.     S$ = "CGAM120"
  3.     M$ = "CGAM"
  4.     If S Like M & "*" Then MsgBox """" & S & """ commence bien par """ & M & """ !"
  5. End Sub

           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 …


Message édité par Marc L le 13-09-2013 à 14:57:36
Reply

Marsh Posté le 16-09-2013 à 09:46:32    

Merci Marc je vais me pencher sur tous ces tutoriels.

Reply

Marsh Posté le 16-09-2013 à 10:11:54    

Après investigation, mon Like fonctionne si mon code est du style

Code :
  1. Like "*" & Variable1 & "*"

Reply

Marsh Posté le 16-09-2013 à 10:27:14    

Je retire ce que j'ai dit ...  
mon code
Range("R2" ).Select

Code :
  1. Do While ActiveCell.Offset(0, -16).Value <> ""
  2. If ActiveCell.Value Like "*" & Unite1 & "*" Or ActiveCell.Value Like "*" & Unite2 & "*" Then
  3. ActiveCell.Offset(0, 1).Value = "Vrai"
  4. Else: ActiveCell.Offset(0, 1).Value = "Faux"
  5. End If
  6. ActiveCell.Offset(1, 0).Select
  7. Loop


 
Mes variables Unite1 et Unite2 sont CGAM et CGAN
Or même quand la valeur est XEAD, la macro indique "vrai"

Reply

Marsh Posté le 16-09-2013 à 11:43:24    

 
           Aucun souci de mon côté ! …
 
           Exemple à tester dans un classeur vierge :

Code :
  1. Sub DemoLike()
  2.     Const Unite1$ = "CGAM", Unite2$ = "CGAN"
  3.     [B1:B3].Value = [{"CGAM01";"XEAD";"CGAN03"}]
  4.    
  5.     For R& = 1 To 3
  6.         Cells(R, 3).Value = Cells(R, 2).Value Like "*" & Unite1 & "*" Or _
  7.                             Cells(R, 2).Value Like "*" & Unite2 & "*"
  8.     Next
  9. End Sub

 

Reply

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! :)

Reply

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 :
  1. Sub DemoInstr()
  2.     Const Unite1$ = "CGAM", Unite2$ = "CGAN"
  3.     [D11:D13].Value = [{"CGAM01";"XEAD";"CGAN03"}]
  4.     [C11].Select
  5.    
  6. ' le traitement commence ici :
  7.     R& = ActiveCell.Row
  8.    
  9.     Do Until Cells(R, 4).Value = ""
  10.         Cells(R, 5).Value = InStr(Cells(R, 4).Value, Unite1) > 0 Or _
  11.                             InStr(Cells(R, 4).Value, Unite2) > 0
  12.    
  13.                         R = R + 1
  14.     Loop
  15. End Sub


Message édité par Marc L le 17-09-2013 à 10:16:05
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed