Coloriser lignes selon 2 critères, via segment (en tableau structuré)
Bonjour,
J'ouvre ce sujet, je préviens quand même qu'il fait suite à celui-ci où Optimix m'a bien dépanné à l'époque.
À la base, cette macro permet de coloriser les lignes d'un tableau, elle colorise en alternant 2 couleurs (gris et blanc) en fonction de 2 critères : PARCELLES et DATE D'INTERVENTION.
Si c'est la même parcelle + même date = couleur grise. Dès que ça change = couleur blanche. Et ainsi de suite.
Le problème est que dès lors que j'applique un filtre sur une parcelle, avec un segment, les couleurs ne sont plus dans le bon ordre. Car la macro ne tient pas compte du tableau structuré je pense.
Dans l'idéal, ce serait que cette macro se déclenche dès que j'applique un filtre, via le segment. Et se re-colorise après réinitialisation du filtre.
Est-ce que quelqu'un peut m'aider avec ça s'il vous plaît ?
Un petit fichier pour mieux comprendre :
Merci par avance de toute aide apportée :)
Cordialement.
Bonjour François,
Si j'ai bien compris, voici le fichier avec el code modifié qui tiens compte du TS et du filtre
J'ai fait 2 sub en fonction du filtre si appliqué ou non
A+
Bonjour Bruno,
Merci beaucoup ! C'est exactement ce que je voulais
Le mieux était que cette macro (=ChoixCouleur) se déclenche automatiquement à chaque fois qu'un filtre s'applique.
J'ai finalement trouvé ce post
Et là je me dis : Mais... Je vais devoir copier/coller ce code dans chacune de mes feuilles ?
Private Sub Worksheet_Calculate()
Application.EnableEvents = False
' ici ma macro
Application.EnableEvents = True
End Sub
S'il existe mieux je suis preneur, mais je vais passer le sujet en résolu quand même !
Merci encore
Bonne soirée.
Cordialement
Re,
1) il n'y a aucun évènement en ce qui concerne l'application d'un filtre, donc à ce niveau aucune possibilité
2) Je n'ai pas proposé l'évènement Calculate, car il sera lancé à chaque changement dans le classeur
Ceci dit, il suffit de mettre dans ThisWorkbook ce code
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Dim Lo As ListObject
On Error GoTo Erreur_Sub
Set Lo = Sh.ListObjects(1)
If Lo.AutoFilter.FilterMode = True Then
Call ColorFiltre
Else
Call ColorLine
End If
Set Lo = Nothing
Erreur_Sub:
' On ne fait rien
End Sub
En espérant qu'il n'y est bien qu'un unique TS dans chaque feuille
A+
Bonjour Bruno,
Désolé, en me relisant je me suis rendu compte que ma réponse n'avait pas vraiment de sens.
En fait j'ai voulu adapter les codes (ChoixCouleur, ColorFiltre et ColorLine) pour ce cas de figure, sans y arriver
- J'ai plusieurs feuilles qui s'appellent "TZA", "TZB", "TZC" ... etc. etc.
- Chacune de ces feuilles ont respectivement un tableau structuré qui porte exactement le même nom que leur feuille "TZA", "TZB", "TZC",...
=> L'idée était donc d'avoir un code unique qui applique la couleur au tableau de la feuille active.
J'ai donc tenté une modification de la ligne de code (ChoixCouleur, ColorFiltre et ColorLine)
Set Lo = Sheets("test").ListObjects("TZA")
en :
feuille = ActiveSheet.Name
Set Lo = Sheets(feuille).ListObjects(feuille)
et au préalable j'ai déclaré "feuille as Long"
Mais ça me ressort une incompatibilité de type. J'ai essayé feuille as ListObject et j'ai une autre erreur.
____
Pour en revenir à ta précédente réponse :
Le code dans ThisWorkbook fonctionne aussi (bien qu'il fasse référence aux macros citées plus haut, qui ne fonctionnent que sur 1 feuille)
Peux tu m'expliquer le Sh.ListObjects(1) ? A quoi fait référence Sh par exemple ? Et le (1)?
Merci par avance
Cordialement.
Re,
Voilà pourquoi, il faut toujours déposer un fichier au plus proche de la réalité
Sh est la variable objet de la Sub et qui définit la feuille modifiée
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
1 pour le tableau structuré n° 1 de la feuille
Voilà
bonjour FBidee et BrunoM45,
un alternatif, attention, il y a une formule en B2 qui concerne le TS.
Re,
Voici une modification du fichier pour prise en compte du Calculate
Bruno,
Tu as raison ... Je pensais que l'adaptation se passerait bien, trop rêveur !
J'ai quand même réussi (malgré moi
Par rapport au numéro du TS :
1 pour le tableau structuré n° 1 de la feuille
D'accord j'ignorais qu'on pouvait cibler un tableau de cette façon ! Plutôt pratique
Par curiosité : sait on déterminer lequel est 1, 2, 3, etc ? Dans le gestionnaire de nom je ne vois rien qui puisse m'aiguiller.
Je viens de faire un essai en dupliquant plusieurs tableaux mais je n'arrive pas à savoir si c'est pas ordre de création ou de "position" dans la feuille.
Merci
Cordialement.
Mince, nos messages se sont croisés !
____
Bonjour Bart,
Merci pour cette alternative !
Alors en ce qui me concerne ça fonctionne bien, cependant je vais opter pour la solution de Bruno car les feuilles ne commenceront pas toutes par "TZ*".
Ce qui ne changera pas, c'est que les feuilles seront nommées de la même façon que leurs tableaux structurés et sont toutes identiques (donc même nombre de tableau structuré)
D'où ma tentative citée plus haut ("feuille = ActiveSheet.Name" ...)
___
Bruno,
C'est parfait maintenant ! Et c'est surement plus "propre" que mon code
Néanmoins je suis toujours curieux de connaitre la réponse à ma question précédente, par rapport au (1) : comment sait-on que tel TS est le numéro 1, ou 2, ... ?
Bonne journée à tous les deux.
Cordialement
le 1 ou 2, c'est l'index du TS et je suppose que c'est en ancienneté, donc le plus vieux, etc. S'il n'y a qu'un TS par feuille, alors on ne risque rien.
Si tous vos TS commencent ou contient la cellule C4 (par exemple) on peut aussi utiliser sheets("TZA").range("C4").listobject etc.
Concernant les feuilles "TZx", la macro workbook_Calculate devient, le "EnableEvents" ne sert à rien.
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Dim LO As ListObject
On Error Resume Next
Set LO = Sh.ListObjects(Sh.Name) 'nom du listobject = nom de la feuille
On Error GoTo 0
If Not LO Is Nothing Then Alternating LO
End Sub
Merci Bart,
Effectivement c'est bien par ordre d'ancienneté... Mais pas de solution pour connaitre son index.
Tant pis on va laisser comme ça
Bonne après-midi !