(RESOLU) - Mise en forme conditionnelle

jlm94

XLDnaute Junior
Bonjour,

Pour mon projet de planning, j'ai crée de nombreuses mise en formes conditionnelles
(une couleur par prénom) mais chaque mois, je dois les actualiser en fonctions des nouveaux recrutements (contrats courts d'animateurs, qui changent chaque mois).
Les animateurs sont affectés sur plusieurs planning selon les secteurs d'activité.
Et je voudrais savoir s'il existe un moyen de centraliser les mis en formes pour les affecter à plusieurs planning,
car je me vois mal reproduire les mêmes 50 ou 100 MEFC, pour chaque planning et les modifier chaque mois.
je joins 2 planning avec quelques mise en formes pour exemple.
mes MEFC sont du type:

j'ai pensé qu'il serait peut-être possible de créer en VB un menu ou il serait possible de choisir:
le texte: Paul
la couleur de remplissage (en code RVB): 255-255-255
la couleur du texte (en code RVB): 255-255-255
et la plage de cellules concernées: (ou toutes les cellules si c'est plus simple )

Je ne maîtrise pas la programmation alors, n'hésitez pas à me le dire si je prends mes rêves pour des réalités.
En vous remerciant par avance pour votre aide ou vos suggestions.

jlm94
 

Pièces jointes

  • Planning A.xlsx
    55 KB · Affichages: 42
  • Planning C.xlsx
    72.8 KB · Affichages: 54
  • Planning Individuels.xlsm
    96.5 KB · Affichages: 43
  • Planning B.xlsx
    28.4 KB · Affichages: 39
  • Planning Individuels.xlsm
    96.5 KB · Affichages: 44
  • Planning Individuels.xlsm
    96.5 KB · Affichages: 46
Dernière édition:

sourcier08

XLDnaute Occasionnel
Re : Mise en forme conditionnelle

Bonsoir jlm94, le forum,

Je suis sous 2007. Ça ne doit pas trop changer de 2010.

Regardes si ce fichier te conviendrait. Je ferai le suivant si ça te convient comme ça. S'il y a des modifications à faire, n'hésites pas (sans abuser ^^).


J'ai quand-même quelques questions qui me trottent dans la tête.
Est-ce que tes tableaux sont définitifs (taille figée) ?
À quoi sert la cellule vide à droite du nom ?
Prévois-tu d'ajouter d'autres feuilles ?
Une autre possibilité t’intéresserait ?

@++
 

Pièces jointes

  • Planning Aéroports.xlsm
    74.2 KB · Affichages: 54
Dernière édition:

jlm94

XLDnaute Junior
Re : Mise en forme conditionnelle

Bonjour,
merci pour le travail que tu as déjà réalisé,
je répond a tes questions avant de te poser les miennes;
- Chaque petite colonne a coté des cellules ou figurent les noms servent a mettre des commentaires (mais elles n'ont pas de liaison avec les planning individuels.
- Oui je prévois de rajouter 1 classeur contenant deux onglets planning dans le futur.

Pour te simplifier la compréhension global de mon projet planning, je joins tous le dossier comprenant les planning Généraux
A, B et C ainsi que les planning individuels.
Mon projet implémente en automatique les planning individuels à partir des planning généraux A, B et C.


Mon besoin principal est:
Affecter des MFC du type:
Si la cellule contient le texte: XXXXX appliquer la MFC (couleur de remplissage et couleur de texte)
affectée la MFC aux cellules de C11 a CZ41 pour les plannings A, B, et C.
Et si possible de pouvoir voir la liste des MFC déjà créées, car les animateurs ne sont pas les mêmes d'un mois sur l'autre.

l'idéal serait que je puisse voir (par menu déroulant ou autre) la liste des MFC créées avec en plus une fonction supprimer
pour les ajouter ou modifier ton interface est super.

J'espère que je ne suis pas trop brouillon dans mes explications mais c'est pas évident d'exprimer ce que je voudrais.

Merci par avance.

PS: lorsque j'ouvre ton fichier, il existe une liaison vers "planning Aéroport-4.xlsx" qu'il ne trouve pas. Est-ce normal ?
et lorsque je crée une MFC elle ne s'applique que sur la cellule ou je me trouve, et lorsque je supprime le nom dans la cellule?
La MFC persiste.

A bientôt j'espere.

jlm94
 

sourcier08

XLDnaute Occasionnel
Re : Mise en forme conditionnelle

Bonsoir,

Tu dis que la zone de MFC va de C11 à CZ41. Pourtant, dans le fichier, ton tableau s'arrête à BD41. Cellule BB41 pour le dernier nom.

J'avais pensé à simplifier la chose.
J'ai donc fait un petit code avec BB41, que tu peux modifier par la suite.

Explications sur le fichier :
J'ai ajouté une feuille que j'ai nommé "Liste". Dans celle-ci, tu y mettras simplement ta mise en forme conditionnelle. En fait, tu dois juste colorer comme ça te chante directement dans la cellule. Pas besoin d'aller sur l'outil de MFC.

Une fois que tu as appliqué la couleur de fond et de texte à tous tes noms, tu n'as plus qu'à cliquer sur le bouton "Appliquer les couleurs".

Le code est bien plus court, tu as un visuel direct de ce que tu appliques et c'est certainement plus pratique pour toi. Tu peux enlever ou ajouter des noms, c'est sans soucis. La seule règle à respecter est que cette liste ne doit pas contenir de cellules vides.

J'ai aussi ajouté un côté pratique, lorsque tu supprimeras des noms dans ton planning, tu n'auras qu'à revenir cliquer sur le bouton "Appliquer les couleurs" dans la feuille "Liste" et tes cellules redeviendront blanches (ou plutôt vierges).

Dis-moi si ça t'irait.

Code:
Option Explicit
Sub appliquer_couleur()
Dim h As Integer, i As Integer
Dim choix As String
Dim cel As Range

For h = 2 To Sheets("Liste").Range("A2").End(xlDown).Row 'boucle de la ligne 2 à la dernière ligne (variable) de la liste de noms

    choix = Sheets("Liste").Cells(h, 1).Value 'noms dans la feuille "liste"
    
    For i = 1 To Sheets.Count - 1 'de la première à l'avant dernière feuille
        
        For Each cel In Sheets(i).Range("C11:BB41") 'zone modifiable : Cellule C11 à BB41
            
            If cel.Value = choix Then
                cel.Interior.Color = Sheets("Liste").Cells(h, 1).Interior.Color
                cel.Font.Color = Sheets("Liste").Cells(h, 1).Font.Color
            ElseIf cel.Value = "" Then
                cel.Interior.Color = xlNone
                cel.Font.Color = xlAutomatic
            End If
                            
        Next cel
    Next i
Next h

End Sub

@++
 

Pièces jointes

  • Planning A.xlsm
    67 KB · Affichages: 47
  • Planning A.xlsm
    67 KB · Affichages: 44
  • Planning A.xlsm
    67 KB · Affichages: 45
Dernière édition:

sourcier08

XLDnaute Occasionnel
Re : Mise en forme conditionnelle

Après réflexion,

J'ai trouvé comment faire la mise en forme directement dans le planning.

L'onglet "Liste" sert donc à faire la mise en forme conditionnelle des cellules.

Pour la MFC, c'est donc une macro événementielle qui s'en charge. Le code est placé sur chaque feuille du classeur, sauf la feuille "Liste".

J'ai quand-même laissé la macro par clic sur le bouton, dans la feuille "Liste", en place.
Code:
Option Explicit
Dim fplage As Range, cel As Range

Private Sub Worksheet_Change(ByVal Target As Range)

Application.ScreenUpdating = False

'****************************************************************************************************************
' Consulter la gestion des erreurs en cas d'erreur et renvoyer le message associé (voir en fin de macro)*********
'****************************************************************************************************************

    On Error GoTo gestion_erreur
        
'****************************************************************************************************************



If Not Intersect(Target, Range("C11:BB41")) Is Nothing Then 'plage modifiable :cellule C41 à BB41
           
    Set fplage = Sheets("Liste").Range("A2:A" & Sheets("Liste").Range("A1").End(xlDown).Row)
  
    For Each cel In Intersect(Target, Range("C11:BB41"))
        
        If cel = "" Then
        
            cel.Interior.ColorIndex = xlNone
            cel.Font.ColorIndex = xlAutomatic
                        
        ElseIf cel <> "" Then
        
            Target.Interior.Color = fplage.Find(Target.Value, , LookIn:=xlValues, lookat:=xlWhole).Interior.Color
            Target.Font.Color = fplage.Find(Target.Value, , LookIn:=xlValues, lookat:=xlWhole).Font.Color
            
        End If
        
    Next cel
        
End If



'****************************************************************************************************************
' Gestion des erreurs *******************************************************************************************
'****************************************************************************************************************

gestion_erreur:

    If Err.Number = 91 Then
        MsgBox "Le nom introduit n'existe pas dans la liste ", vbExclamation, "Nom absent de la liste"
    End If
        
'****************************************************************************************************************


Application.ScreenUpdating = True

End Sub

Regardes si ça te va. Ajoute des noms dans ta feuille "Liste" en premier lieu, mets-les en couleurs puis va sur n'importe quelle autre feuille ajouter le même nom.
Fait une faute de frappe lorsque tu ajoutes un nom dans le planning. Supprimes un nom du planning.

Bref, Il faut que tu testes le fichier avec tous les cas de figures que tu penses rencontrer.

S'il y a le moindre soucis, dis-moi ce qui cloche.


Bonne journée !
 

Pièces jointes

  • Planning A.xlsm
    70.2 KB · Affichages: 44
  • Planning A.xlsm
    70.2 KB · Affichages: 50
  • Planning A.xlsm
    70.2 KB · Affichages: 47
Dernière édition:

jlm94

XLDnaute Junior
Re : Mise en forme conditionnelle

sourcier08,
Je dirais plutôt Sorcier, par quelle magie (blanche bien sur !!!) arrives tu à un tel résultat ????
Non je plaisante, j'ai fais pas mal de tests et ça colle vraiment à mes besoins,
et cette 2e version sera je pense beaucoup plus simple dans la gestion au quotidien par mes utilisateurs qui ces planning.

J'ai juste une question:
La macro peut-elle être affectée aux différents classeurs "Planning-A" "Planning-B" et "Planning -C"
car mon besoin principal comme évoqué était surtout de pouvoir utiliser une liste de MFC pour plusieurs classeurs planning.
(les plages de cellules étant les mêmes pour tous les planning C11-BB41)

Concernant la gestion au quotidien, je pense à quelque chose:
Je n'ai pas crée tous les planning dans le même classeur car nous en avons un par secteur d'activité,
Le A (avec les 3 onglets) pour les Aéroports
Le B pour le marché local
le C pour un client Particulier.
et les responsables de secteur travaillent très souvent en même temps chacun sur leur planning.
Si l'onglet liste se trouve sur le A, celui qui travaille sur le B ne pourra pas modifier la liste.
Donc serait-il envisageable de créer un classeur qui ne contiendrai que l'onglet Liste,
et d'associer la macro aux différents classeurs.

Comme tu as certainement deviné, je ne maîtrise pas les Macro alors n'hésite pas à me dire si peut-être je délire
dans mes demandes,
mais nous sommes tellement enthousiasmés par ce que tu as fais que je souhaiterai vraiment pouvoir l'utiliser pour nos planning.

Encore Merci par avance.
 

sourcier08

XLDnaute Occasionnel
Re : Mise en forme conditionnelle

Pour affecter la macro aux différents planning, il me suffira de faire un copier/coller de la macro dans les autres classeurs.

Pour ce qui est de créer un classeur juste pour la liste, ça risque d'être un peu plus dur mais je regarderai ça demain à tête reposée. Il y a certaines conditions à respecter. Je pense surtout au niveau de l'emplacement des fichiers. Mais ça doit être largement faisable.
 

jlm94

XLDnaute Junior
Re : Mise en forme conditionnelle

Merci pour on aide,
concernant les planning, si cela peut arranger les choses nous ferons en sorte que tous les classeurs:
Planning A ; Planning B ; Planning C et Planning Individuels soient dans un même répertoire.

Pourras-tu, SVP, me donner la procédure pour copier coller la macro dans les classeurs au cas ou nous aillons un nouveau planning dans le futur.

Encore merci, en attente de te lire.

Bonne soirée.

JLM94
 

sourcier08

XLDnaute Occasionnel
Re : Mise en forme conditionnelle

Tous comptes faits, j'ai eu le temps de le faire ce soir.

Tu ouvres ton fichier Planning, tu ouvres ensuite l'éditeur VBA (Alt + F11) puis, à gauche tu dois avoir l'explorateur de projet VBA.

Tu peux voir tes feuilles avec le nom que tu leur a donné (entre parenthèses).
Double-cliques sur l'une de tes feuilles et colle le code. Une fois que tu as fait ça pour toutes tes feuilles, tu peux fermer l'éditeur VBA (avec la croix blanche sur fond rouge, en haut à droite).

Ensuite, en sauvegardant le fichier, ça sauvegarde aussi les macros.

Pour l'utilisation du fichier "Liste", pas besoin de l'ouvrir avant, il s'ouvrira de lui-même en cas de nouvelle entrée.
J'ai mis l'option de sauvegarde automatique sur ce fichier. Il est possible de la désactiver en supprimant simplement les lignes:

Code:
Application.DisplayAlerts = False 'désactiver les alertes
Workbooks("Liste.xlsx").Save 'on sauvegarde les dernières modifications du classeur "Liste"
Workbooks("Liste.xlsx").Close
Application.DisplayAlerts = True 'réactiver les alertes

Voici le code complet :
(pas si long que ça, c'est juste très aéré pour plus de clareté)

Code:
Option Explicit
Dim fplage As Range, cel As Range
Dim estouvert As Byte
Dim chemin As String, fichier1 As String, fichier2 As String
Dim fich As Workbook


Private Sub Worksheet_Change(ByVal Target As Range)

Application.ScreenUpdating = False



'****************************************************************************************************************
' Consulter la gestion des erreurs en cas d'erreur et renvoyer le message associé (voir en fin de macro)*********
'****************************************************************************************************************
    
    On Error GoTo gestion_erreur
    
'****************************************************************************************************************
'****************************************************************************************************************



chemin = ThisWorkbook.Path 'chemin du fichier actuel
fichier1 = ThisWorkbook.Name 'nom du fichier actuel
fichier2 = chemin & "\Liste.xlsx" 'chemin du fichier "Liste.xlsx"



'****************************************************************************************************************
' Contrôler si le classeur "Liste" est ouvert *******************************************************************
'****************************************************************************************************************

estouvert = 0 'donner la valeur 0 à cette variable

For Each fich In Workbooks
    If fich.Name = "Liste.xlsx" Then estouvert = 1 'passer à 1 si le fichier est ouvert
Next

If estouvert = 0 Then Workbooks.Open (fichier2) 's'il n'est pas ouvert, on l'ouvre et on l'active
Windows("Liste.xlsx").Activate 'on revient sur le premier classeur

Set fplage = Sheets(1).Range("A2:A" & Sheets(1).Range("A1").End(xlDown).Row) 'plage de recherche


'****************************************************************************************************************
'****************************************************************************************************************



If Not Intersect(Target, Range("C11:BB41")) Is Nothing Then 'plage modifiable :cellule C41 à BB41

    For Each cel In Intersect(Target, Range("C11:BB41"))
        
        If cel = "" Then
        
            cel.Interior.ColorIndex = xlNone
            cel.Font.ColorIndex = xlAutomatic
                        
        ElseIf cel <> "" Then
        
            cel.Interior.Color = fplage.Find(Target.Value, , LookIn:=xlValues, lookat:=xlWhole).Interior.Color
            cel.Font.Color = fplage.Find(Target.Value, , LookIn:=xlValues, lookat:=xlWhole).Font.Color
            
        End If
        
    Next cel
        
End If

Application.DisplayAlerts = False 'désactiver les alertes
Workbooks("Liste.xlsx").Save 'on sauvegarde les dernières modifications du classeur "Liste"
Workbooks("Liste.xlsx").Close
Application.DisplayAlerts = True 'réactiver les alertes

'****************************************************************************************************************
' Gestion des erreurs *******************************************************************************************
'****************************************************************************************************************

gestion_erreur:

    If Err.Number = 91 Then
        MsgBox "Le nom introduit n'existe pas dans la liste " & chr(13) & chr(13) & _
        "Allez sur le classeur Liste et ajoutez le nom." & chr(13) & _
        "Revenez sur le planning et réintroduisez le nouveau nom." _
        , vbExclamation, "Nom absent de la liste"
    End If
        
'****************************************************************************************************************
'****************************************************************************************************************



Application.ScreenUpdating = True

End Sub
 

Pièces jointes

  • Liste.xlsx
    8.4 KB · Affichages: 37
  • Liste.xlsx
    8.4 KB · Affichages: 35
  • Liste.xlsx
    8.4 KB · Affichages: 36
  • Planning A.xlsm
    70.1 KB · Affichages: 44
  • Planning A.xlsm
    70.1 KB · Affichages: 47
  • Planning A.xlsm
    70.1 KB · Affichages: 52
Dernière édition:

sourcier08

XLDnaute Occasionnel
Re : Mise en forme conditionnelle

J'oubliais de préciser que les fichiers, tu dois les "enregistrer sous" puis "classeur prenant en charge les macros".

Seul le fichier "Liste" doit rester en fichier ".xlsx"
Tous les autres doivent prendre en charge les macros et auront l'extension de fichier ". xlsm"

Bonne soirée.
 
Dernière édition:

jlm94

XLDnaute Junior
Re : (RESOLU) - Mise en forme conditionnelle

Bonsoir,
Je viens juste à l'instant de tout mettre en place
Mises en page, listes des coloris, création de tous mes onglets Planning individuels (env 80)
et Tout ce que tu as développé pour mon projet fonctionne à Merveille.
La gestion des coloris, d'une simplicité !!!!!!

je te remercie encore pour tout le temps que tu as consacré à mes demandes.
En te souhaitant d’excellentes fêtes de fin d'année.
Bon courage.

jlm94
 

Discussions similaires

Réponses
12
Affichages
227

Statistiques des forums

Discussions
312 321
Messages
2 087 266
Membres
103 502
dernier inscrit
talebafia