XL 2016 Modification couleur onglet sur variable

troopers87

XLDnaute Occasionnel
Bonjour à tous,

Je cherche à modifier la couleur de l'ensemble des onglets de mon classeur (une cinquantaine) selon la valeur d'une cellule nommée qui se situe dans chacune des feuilles. Je m'explique :
- chaque feuille contient une cellule nommée ETAT_projetx (avec x = le numéro du projet),
- chaque onglet a une position qui est égal à x + 3.

Par exemple : la feuille qui contient ETAT_projet5 est la feuille Sheets(8).

Voici où j'en suis dans mon code. Là où je pèche, c'est dans l'intégration de la fameuse variable "x" dans le nom de la cellule et dans numéro de la Sheets. J'espère être clair ! :p

VB:
'Private Sub Workbook_SheetCalculate(ByVal Sh As Object)

'Appliquer une couleur jaune à l'onglet de la feuille
If Range("ETAT_projet1").Value = "Terminé" Then
    ActiveSheet.Tab.ColorIndex = 4
ElseIf Range("ETAT_projet3").Value = "En retard" Then
    Sheets(3).Tab.ColorIndex = 3
End If

'1 = noir
'2 = blanc
'3 = rouge
'4 = vert
'5 = bleu
'6 =  jaune
'7 = rose
'8 = cyan
'9 = bordeau
'10 = vert sombre

'End Sub
 

Modeste geedee

XLDnaute Barbatruc
Bonsour®
- chaque feuille contient une cellule nommée ETAT_projetx (avec x = le numéro du projet),
- chaque onglet a une position qui est égal à x + 3.
nommer la plage : ETAT_projetx
faire une table d'équivalence selon état
'noir --- > vbblack= ?????
' blanc ---> vbwhite= ?????
' rouge ----> vbred ="en retard"
' vert ---> vbgreen = "terminé"
' bleu ---> vbblue= ?????
' jaune ---vbyellow= ?????
' violet ---vbmagenta= ?????
'cyan---vbcyan= ?????

VB:
With ActiveSheet
select case Range("ETAT").Value
case "terminé"
.Tab.Color = vbgreen
case "en retard"
.Tab.Color = vbred
case ???
.Tab.Color = vb???
case ?????
.Tab.Color = vb???
'---
Case Else
.Tab.Color = vbnone
end select
End with
 
Dernière édition:

cp4

XLDnaute Barbatruc
Bonjour à tous,

Je cherche à modifier la couleur de l'ensemble des onglets de mon classeur (une cinquantaine) selon la valeur d'une cellule nommée qui se situe dans chacune des feuilles. Je m'explique :
- chaque feuille contient une cellule nommée ETAT_projetx (avec x = le numéro du projet),
- chaque onglet a une position qui est égal à x + 3.

Par exemple : la feuille qui contient ETAT_projet5 est la feuille Sheets(8).

Voici où j'en suis dans mon code. Là où je pèche, c'est dans l'intégration de la fameuse variable "x" dans le nom de la cellule et dans numéro de la Sheets. J'espère être clair ! :p

VB:
'Private Sub Workbook_SheetCalculate(ByVal Sh As Object)

'Appliquer une couleur jaune à l'onglet de la feuille
If Range("ETAT_projet1").Value = "Terminé" Then
    ActiveSheet.Tab.ColorIndex = 4
ElseIf Range("ETAT_projet3").Value = "En retard" Then
    Sheets(3).Tab.ColorIndex = 3
End If
'End Sub
Bonsoir,

Tu n'aurais pas par hasard un petit fichier sans données confidentielles.

Bonne soirée.

Edit: Bonsoir Modeste Geedee;)
 

troopers87

XLDnaute Occasionnel
Bonjour à vous deux et merci pour votre intérêt,

Je vous joins un fichier d'exemple dépersonnalisé. J'espère qu'il vous conviendra.

Modeste Geedee, j'ai du mal à prendre en compte vos conseils car je pense qu'effectivement, il vous manquait le fichier pour saisir le fonctionnement global de ma demande. Toutes mes excuses !
 

Pièces jointes

  • Exemple.xlsm
    15.1 KB · Affichages: 16

troopers87

XLDnaute Occasionnel
Bonjour cp4 et merci pour ton aide !

C'est super !
1. J'ai retiré la condition "If Ws.Name Like "Projet*" Then" car mes onglets peuvent avoir d'autres appelations que "Projets #"
2. L'absence de recours au nom de chaque cellule me pose souci. En effet, si jamais à l'avenir, je suis amené à changer l'emplacement de ma cellule "Etat projet", alors il faudra que je le modifie dans le code. N'y a-t-il pas la possibilité de palier à cela ?

Bonne journée, et merci encore !
 

cp4

XLDnaute Barbatruc
Bonjour cp4 et merci pour ton aide !

C'est super !
1. J'ai retiré la condition "If Ws.Name Like "Projet*" Then" car mes onglets peuvent avoir d'autres appelations que "Projets #"
2. L'absence de recours au nom de chaque cellule me pose souci. En effet, si jamais à l'avenir, je suis amené à changer l'emplacement de ma cellule "Etat projet", alors il faudra que je le modifie dans le code. N'y a-t-il pas la possibilité de palier à cela ?

Bonne journée, et merci encore !
Bonjour,
Qu'as-tu mis à la place de Like "Projet*", afin que l'on reste synchroniser dans notre approche.
Je verrai cet après-midi ton souci d'emplacement des cellules "Etat projet".
Si je comprends bien tu as plusieurs onglets projet car dans ton fichier il n'y a que 3?
@+
 

troopers87

XLDnaute Occasionnel
CP4,

Pour le moment, je n'ai fait que supprimer la ligne de condition (je te joins le fichier afin que nous soyons en phase, tu as raison !).

Pour ce qui est du nombre d'onglets projets dans mon fichier final, je peux en avoir 50, voir plus ! D'où ma recherche d'industrialiser cela. Une chose est immuable : l'index de la feuille est égal à Etat projet x+2. C'est pourquoi je cherche quelque chose du genre (attention, ça va piquer les yeux ^^) :

If Range("ETAT_projetx") = "En cours" Then Sheets(x+2).Tab.ColorIndex = 4

J'espère que cela t'aidera à y voir plus clair :) Merci pour ton intérêt, dans tous les cas.
 

Pièces jointes

  • Copie de Exemple.xlsm
    22.3 KB · Affichages: 12

cp4

XLDnaute Barbatruc
Rebonjour,

Si j'ai bien compris le nommage de tes onglets est aléatoire (c-à-d que tu ne t'es pas imposé une règle pour nommer tes onglets) et que la cellule de validation peut se trouvait n'importe où sur la feuille.

Tu compliques les choses mais je vais voir ce que je peux faire.

Bonne journée.
 

troopers87

XLDnaute Occasionnel
Ahah ! Globalement c'est ça, mais ne noircissons pas le tableau ;)

Oui : les onglets peuvent être nommés librement par l'utilisateur. Pour cela, je pensais faire appel à Sheets(x), par exemple.
Oui : la cellule de validation peut changer de place (si un jour, j'ai besoin de faire évoluer le fichier, par exemple). C'est pourquoi j'ai toujours recours aux plages nommées dans mes macros. C'est plus compliqué à coder, mais c'est bien plus souple, ensuite :)
 

cp4

XLDnaute Barbatruc
Ahah ! Globalement c'est ça, mais ne noircissons pas le tableau ;)

Oui : les onglets peuvent être nommés librement par l'utilisateur. Pour cela, je pensais faire appel à Sheets(x), par exemple.
Oui : la cellule de validation peut changer de place (si un jour, j'ai besoin de faire évoluer le fichier, par exemple). C'est pourquoi j'ai toujours recours aux plages nommées dans mes macros. C'est plus compliqué à coder, mais c'est bien plus souple, ensuite :)
Tu rigoles bien. C'est beaucoup plus compliqué de récupérer les plages nommées surtout si les références des cellules changent d'une feuille à l'autre.
Pour ma part, je réserve toujours le haut de mes feuilles pour mettre tout ce qui va me permettre de travailler et le bas est réservée à ma base de travail. Ainsi je peux faire évoluer ma feuille sans problème.
Je vais devoir ouvrir une discussion pour solutionner ta COLLE.:(
 

troopers87

XLDnaute Occasionnel
Bonjour CP4,

Bon sang, on s'en rapproche ! C'est génial !
Je m'attendais à une solution s'en rapprochant, mais pour moi : impossible de mettre cela sur pied ! Bravo !

Mon seul souci est le nom recours à une variable qui prenne en compte le fameux "ETAT_projetx". De fait, si je nomme une autre cellule avec un nom, le fichier plante. N'est-il pas possible de préciser "If Range("Etat_projet"&cmp.Name) = "En cours" Then afin que la condition ne se focalise que sur ces états ?
 

cp4

XLDnaute Barbatruc
Bonjour CP4,

Bon sang, on s'en rapproche ! C'est génial !
Je m'attendais à une solution s'en rapprochant, mais pour moi : impossible de mettre cela sur pied ! Bravo !

Mon seul souci est le nom recours à une variable qui prenne en compte le fameux "ETAT_projetx". De fait, si je nomme une autre cellule avec un nom, le fichier plante. N'est-il pas possible de préciser "If Range("Etat_projet"&cmp.Name) = "En cours" Then afin que la condition ne se focalise que sur ces états ?
cmp.name donne le nom des cellules nommées, par exemple Etat_projet1.
Ton "If Range("Etat_projet"&cmp.Name) va te lever une erreur.
Je ne comprends plus ce que tu veux obtenir.
Tu te compliques la vie pour d'insignifiants détails.

edit: J'ai créé une nouvelle feuille, j'ai nommé une cellule Etat_projet5. Le code fonctionne parfaitement. Bizarre que tu me dises qu'on se rapproche du résultat escompté.
 
Dernière édition:

troopers87

XLDnaute Occasionnel
Bonjour CP4,

Pardon pour mon délai de réponse, il me fallait un peu de temps pour prendre du recul sur ton dernier retour :)
Je comprends que tu perçoives mon souhait de recourir systématiquement à des plages nommées comme un détail insignifiant. Pourtant, je suis persuadé que cela apporte énormément en termes d'ergonomie lorsque la structure du fichier est modifiée. En effet, il arrive parfois que les fichiers soient modifiés et que certaines cellules soient déplacées : si la plage est nommée, cela ne nécessite pas de modification du code, ce qui n'est pas le cas si on fait référence à un Range("F8"), par exemple.

Là où a été mon erreur, c'est que je n'avais pas précisé que chaque feuille avait plusieurs plages nommées (Etat_projet5, Avancement_projet5, Nom_projet5... par exemple). Je ne pensais pas que cela serait dimensionnant dans le code que tu allais me proposer. Toutes mes excuses.

En résumé : oui, le code fonctionne parfaitement, mais je ne peux pas l'appliquer à mon fichier définitif. Si tu en as assez (ce que je crois percevoir dans ton dernier message), nous pouvons nous arrêter là : je me débrouillerai autrement. Si tu as encore un peu de carburant, je te propose d'envisager le fichier suivant : il est identique au précédent, sauf que j'ai ajouté une plage nommée sur chaque feuille (NOM_projetx).

Il se trouve qu'ajouter une plage nommée ne perturbe pas le fonctionnement de ton code (sauf dans le cas où je nomme un fichier "En cours", "En retard" ou "Terminé", ce qui ne sera jamais le cas) : parfait ! Peux-tu me dire si il est possible de spécifier que la variable "cpm.name" ne doit faire référence qu'à des plages nommées du type "ETAT_projet" sans le chiffre qu'il y a derrière ?

Merci d'avance pour ton aide et ta patience :)
 

Pièces jointes

  • Copie de Exemple.xlsm
    23.2 KB · Affichages: 17

Discussions similaires

Réponses
6
Affichages
1 K
Réponses
1
Affichages
1 K

Statistiques des forums

Discussions
311 720
Messages
2 081 924
Membres
101 841
dernier inscrit
ferid87