fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr en fr fr fr fr fr fr fr fr fr fr cs fr fr fr fr fr fr fr fr fr fr fr fr fr fr en en fr fr fr fr fr en fr nl fr fr fr fr fr fr fr fr en fr en fr fr fr fr fr fr fr fr fr fr fr fr fr en sv fr fr fr fr pt en fr fr de fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr en fr fr en en fr fr de fr fr fr fr fr fr fr fr fr pt en fr fr de fr fr fr fr fr fr fr fr fr fr fr fr fr fr en fr fr en en fr fr de fr fr fr fr fr fr fr fr en fr fr fr fr fr fr fr fr fr fr pt en fr fr de fr fr fr fr fr fr fr fr en fr fr en en fr fr de fr fr fr fr fr fr en fr fr en en fr fr de fr fr fr fr fr fr fr fr pt en fr fr de fr fr fr fr fr fr en fr fr en en fr fr de fr fr fr fr fr fr pt en fr fr de fr fr fr fr en fr fr en en fr fr de fr fr fr fr fr fr fr pt en fr fr de fr fr io fr fr en fr fr en en fr fr de fr fr fr fr fr fr fr pt en fr fr de fr fr fr fr fr fr fr fr en fr fr en en fr fr de fr fr en fr fr en fr fr fr en fr fr en fr fr fr fr pt en fr fr de fr fr fr fr fr fr fr en fr fr en en fr fr de fr fr fr fr fr fr fr pt en fr fr de fr fr en fr fr fr fr fr en fr fr en en fr fr de fr fr fr fr pt en fr fr de fr fr fr fr en en sv fr fr fr fr en en fr en fr fr en en en fr
Ce planning porte sur un nombre variable d'affaires, sur lesquelles peuvent travailler plusieurs personnes de l'équipe.
J'aimerais mettre au point une macro qui me permette, pour chaque personne, de filtrer le planning pour ne laisser apparaître que les affaires dont elle s'occupe.
Dans mon exemple joint, j'aimerais par exemple qu'en appuyant sur le bouton "personne C", qu'un filtre s'applique et ne laisse apparaître que les lignes-titre des affaires où travaille la personne C, et la liste de ceux qui travaillent avec elle sur cette affaire.
Et enfin, je voudrais pouvoir remplacer le texte "personne A", "personne B", etc... par le vrai prénom des membres de l'équipe dans les cellules et dans les boutons. Et de même, remplacer les mots "affaire 1", "affaire 2", etc... par le vrai nom de chaque affaire.
Je saurais je pense créer une série de macros pour le faire, mais ce serait une macro pour chaque prénom + quelques cellules masquées.
Du coup, je serais obligé de créer une nouvelle macro en cas d'arrivée d'un nouveau membre dans l'équipe.
Pour éviter ça, je pense qu'il faut arriver à filtrer en se servant de la valeur du texte de chaque bouton, mais ça je ne sais pas le faire.
Voilà, j'espère que je n'abuse pas.....
D'avance merci à qui pourra m'aider !
Quand tu "penses" que quelque chose devrait être fait, tu t'y attaques au lieu d'attendre l'arme au pied, cela fera avancer la situation, et cela te permettra de voir si tu es dans la bonne voie ou pas...
Il ne t'a pas échappé, j'espère, que lorsqu'on filtre une base, un tableau... on applique une condition sur la valeur d'une colonne et les lignes ne correspondant pas à cette condition sont masquées.
Alors si tu mets dans la même colonne tes "affaires" et tes "personnes", tu vas sans doute avoir quelque difficulté à appliquer un filtre quel qu'il soit.
Il me semble qu'il faut que tu approfondisses l'utilisation de ton tableau pour le concevoir (et le modifier) selon ce que tu veux obtenir en l'utilisant : si tu veux pouvoir filtrer sur tel ou tel champ, il faut que les champs soient définis ; si tu veux masquer ou démasquer des zones entières, il faut que chaque zone soit identifiable selon un critère non ambiguë,...
2003 sur PC + 365 sur Mac
Comme je le disais dans mon message, je sais faire (voir fichier joint), mais avec de gros sabots : je devrai redéfinir le nom dans le bouton et la macro correspondante ou au moins les formules et coller les formules dans les lignes vierges à chaque modification dans l'équipe : pas idéal.
D'expérience, quand je procède comme tu le suggères, j'incite involontairement ceux qui veulent m'aider à perfectionner ma mauvaise méthode (qui vient de ma méconnaissance du VBA). Si ça se trouve, il existe des manières de procéder beaucoup plus simples mais qui ne seront pas mises en oeuvre parce que les membres du forum auront voulu m'aider, mais en restant dans ma logique.
Quelques précisions sur le fichier joint :
– quand on clique sur le bouton d'un membre de l'équipe, la macro colle son nom en B2
– la colonne A comporte des formules dont le résultat est affiché en blanc pour être invisible
– la colonne C (cachée) vérifie si le membre de l'équipe travaille sur une ou plusieurs affaires et récupère le nom de l'affaire
– le tri élimine les cellules vides
Si quelqu'un sait faire mieux (càd sans besoin de modifier macros et formules à chaque évolution des affaires ou des équipes), je suis preneur !
Le 27/04/2016 à 09:01
Tu as une méthode qui fonctionne ! Pas mal déjà !
Une proposition pour voir les choses un peu différemment (je n'utilise pas ta colonne C...)
- j'ai renommé les boutons (sous forme simple : _OFF, _A, _B, ... _F
Noms à revoir dans d'autres contextes pour appliquer le même type de procédure...
- j'ai renommé la plage à filtrer : PlaF en plage dynamique (aucun impact sur la proposition actuelle, mais cela peut être utile à l'avenir d'avoir un nom auquel on n'a plus à toucher si la plage s'étend). Je n'ai pas supprimé l'ancien nom...
La même macro (Filtrer, voir ci-dessous) est affectée à tous les boutons.
Sub Fitrer() Dim crit, p$, i% If Application.Caller = "_OFF" Then If ActiveSheet.AutoFilterMode Then ActiveSheet.ShowAllData Else p = Right(Application.Caller, 1) With [PlaF] For i = 1 To .Rows.Count If Right(.Cells(i, 2), 1) = p Then crit = crit & ";" & .Cells(i, 1) Next i crit = Replace(crit, ";", "", 1, 1) crit = Split(crit, ";") On Error GoTo errvide .AutoFilter 1, crit, xlFilterValues, , False End With End If Exit Sub errvide: [PlaF].AutoFilter 1, "=", , , False End Sub
La macro identifie le bouton qui l'a lancée : si _OFF, elle affiche tout,
si autre, elle récupère le nom (personne) pour le rechercher en B,
lorsqu'elle le trouve, elle mémorise la valeur en A dans une chaîne,
transforme cette chaîne en tableau pour appliquer un filtre l'utilisant comme critère,
l'absence de critère entrainerait une erreur, récupérée pour renvoyer à une gestion d'erreur qui redéfinit le filtre pour ne rien afficher.
Le 28/04/2016 à 00:46
2003 sur PC + 365 sur Mac
Merci pour ton investissement.
Problème : chez moi, ça ne marche pas (sauf le bouton "OFF" !).
Quand je clique sur l'un ou l'autre des autres boutons "personne A", "personne B", etc..., toutes les lignes sont masquées, sauf "AFFAIRE 1", et les lignes 6 à 8 qui sont "repliées" dans le plan Excel mais restent accessibles par le bouton "+" dans la marge gauche...
Ou alors qqch m'échappe.
Le 28/04/2016 à 07:02
Tu es sûr que tu parles du fichier que je t'ai retourné ?
Je viens de vérifier, il fonctionne !
Mais effectivement 2 défauts que je vais essayer de corriger : la 1re ligne Affaire 1 qui reste apparente en l'absence de ligne d'en-tête, et les flèche de filtres que j'avais prévu de faire disparaître...
Je te le remets dès ajustement fait.
Le 28/04/2016 à 07:23
Voilà, révision pour éliminer les flèches et faire disparaître Affaire 1 s'il y a lieu :
- plage redéfinie à partir de la ligne 4, et sur une seul colonne (celle sur laquelle on filtre).
J'ai aussi ajusté les conditions pour _OFF (éviter une possibilité de déclenchement d'erreur).
Le 28/04/2016 à 07:39
2003 sur PC + 365 sur Mac
Bonjour, et merci de persévérer )
J'ai testé la nouvelle version : ça ne marche pas sur mon ordi (Excel 2003) : quel que soit le bouton, les lignes 5 à 34 sont masquées.
Je testerai plus tard dans la journée à mon bureau (Excel 2013).
Le 28/04/2016 à 08:28
En effet, suite à ton post je suis allé faire un test sous Excel 2000. Effectivement, le filtre sous les versions antérieures à 2007 n'accepte pas de filtrer sur un tableau de valeurs, cela provoque une erreur 1004, récupérée par le gestionnaire d'erreur qui applique le masquage total.
Pour faire fonctionner sous 2003 il faudrait donc affecter une valeur booléenne dans une autre colonne pour filtrer... C'est faisable si tu tiens à t'en servir sous 2003.
Le 28/04/2016 à 14:36
2003 sur PC + 365 sur Mac
J'ai besoin d'utiliser les 2 plateformes, pq je travaille souvent chez moi...
Le 28/04/2016 à 18:17
OK ! Je vais voir la modif. minimale pour que ça fonctionne sur les 2.
Je voulais vérifier un truc dans l'aide d'Excel 2000, mais depuis le passage de ton fichier, elle refuse de fonctionner ! Je n'ai pas trop envie de faire une resto système pour ça, et pour une réparation, il faut que je retrouve le disque...
On va se débrouiller autrement, mais pas avant demain, décalage horaire oblige !
Le 29/04/2016 à 10:38
2003 sur PC + 365 sur Mac
Le 29/04/2016 à 15:06
Un petit retard car je n'avais plus accès au site, et à quelques autres sans rapport avec (curieux car je conservais l'accès à d'autres sites, sans lien entre eux..., pas habituel ici compte tenu de l'organisation des réseaux).
Une version réaménagée qui devrait donc fonctionner sous 2003 et 2013 (elle fonctionne sous 2000 et 2010).
Le 30/04/2016 à 11:49
2003 sur PC + 365 sur Mac
Ça marche sur 2003 ! Merci pour ta persévérance......
.....mais j'ai encore besoin d'un peu d'aide !
Quand je remplace un nom (par exemple : "personne A" → "Adrien") dans la feuille et dans le bouton, la macro ne fonctionne plus avec ce nouveau nom...
Pour moi, c'est un mystère...
Le 30/04/2016 à 12:46
Ce qui doit être trouvé, est le nom qui figure en colonne B. On avait personne_A, _B... Par simplification j'avais nommé dans ce cas les boutons : _A, _B, ... et le bouton appelant la macro était identifié par :
p = Right(Application.Caller, 1)
soit en prélevant la dernière lettre.
Et de même la recherche du nom en B :
If Right(.Cells(i, 2), 1) = p Then crit = crit & ";" & .Cells(i, 1)
ne prenait en considération que la dernière lettre.
Si tu modifies le nom en colonne B, il convient donc de modifier le nom du bouton correspondant pour l'aligner sur le nom.
Et dans ce cas la première ligne de code citée doit devenir :
On prend en compte le nom en entier.
Et la seconde doit rechercher ce nom en B :
If .Cells(i, 2) = p Then crit = crit & ";" & .Cells(i, 1)
Le 30/04/2016 à 13:33
2003 sur PC + 365 sur Mac
Rebonjour, et re-merci !
Problème (cf fichier joint) : j'ai reporté dans le code les modifs que tu m'as indiquées et j'ai changé le nom de "personne_A" en "Lucie", et...ça ne marche pas comme ça devrait.
Mais je me suis peut-être trompé quelque part...
Le 30/04/2016 à 13:47
Tu n'as pas changé le nom du bouton...
Clic droit sur le bouton, tu vas dans la zone Nom (à gauche de la barre de formule, qui affiche le nom du bouton), tu sélectionnes et tapes : LUCIE, tu valides par Entrée.
(Eventuellement tu refais un clic droit pour vérifier que c'est bien le nouveau nom qui s'affiche.)
Le 30/04/2016 à 16:29
2003 sur PC + 365 sur Mac
OK, je comprends le malentendu : quand je disais "nom du bouton" je voulais dire : le nom figurant sur le bouton...
Maintenant, j'ai fait le changement, et ça fonctionne : c'est cool !
Un dernier truc si ce n'est pas abuser de ta gentillesse : je préférerais justement que la macro fonctionne à partir du texte figurant sur les boutons plutôt qu'à partir du nom des boutons. Ça éviterait de faire 2 changements à chaque changement d'un membre de l'équipe.
Dans tous les cas : merci.
Le 30/04/2016 à 17:00
Pas possible. C'est le nom du bouton qui est renvoyé par la propriété Caller, le texte apposé sur le bouton importe peu...
Le 30/04/2016 à 17:14
2003 sur PC + 365 sur Mac
Je suggérais ça parce que, pour une précédente macro compliquée (en tous cas pour moi) pour laquelle j'avais reçu de l'aide sur le forum, une action était liée au texte du bouton.
Je la colle à tout hasard...
Sub Données_Filtrer_selon_valeur_bouton() 'http://forum.excel-pratique.com/post276475.html#p276475 Application.Goto Reference:="plage_à_filtrer_par_bouton" Selection.AutoFilter Dim TexteCherché As String Dim Ligne As Range, C As Range TexteCherché = ActiveSheet.Shapes(Application.Caller).TextFrame.Characters.Text Rows.Hidden = False If TexteCherché   "non filtré" Then For Each Ligne In Range("plage_à_filtrer_par_bouton").Rows Set C = Ligne.Find(TexteCherché, , xlValues, xlPart) If Not C Is Nothing Then Ligne.EntireRow.Hidden = False Else Ligne.EntireRow.Hidden = True End If Next Ligne End If End Sub