Couleur d’onglet fonction du résultat d’une formule

Skud

XLDnaute Junior
Bonjour à tout le forum,

Je souhaiterais mettre en couleur l’onglet d’un fichier en fonction du résultat d’une formule.

Le code suivant ne fonctionne uniquement que si je revalide la formule (F2 puis Entrée), ce qui n’est pas très pratique avec 40 onglets et autant de formules à valider !

Code:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
 ' C13 étant le résultat d'une formule d’une autre feuille
    If Target.Address = "$C$13" Then
        If Target.Text = "Pas débutée" Then
        ActiveWorkbook.Sheets(Sh.Name).Tab.ColorIndex = 3
        ElseIf Target.Text = "En cours" Then
        ActiveWorkbook.Sheets(Sh.Name).Tab.ColorIndex = 4
        ElseIf Target.Text = "Annulée" Then
        ActiveWorkbook.Sheets(Sh.Name).Tab.ColorIndex = 5
        ElseIf Target.Text = "Terminée" Then
        ActiveWorkbook.Sheets(Sh.Name).Tab.ColorIndex = 6
        End If
    End If
End Sub

J’ai essayé de placer le code au niveau des feuilles avec un « Worksheet_SelectionChange » ou un « Worksheet_Calculate » en retirant l’option de calcul automatique, mais sans succès…

Je me tourne donc vers vous !

Merci pour votre aide.
 

wilfried_42

XLDnaute Barbatruc
Re : Couleur d’onglet fonction du résultat d’une formule

Bonjour skud

logiquement si la cellule est le résultat d'une formule, ta macro ne fera rien
si tu actives le calcul automatique, avec l'interruption calculate ça fonctionne, puisque les calculs se font avant le lancement de cette macro evenementielle
à placer dans thisworkbook et à tester
Code:
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
       select case range("C13").value
               case  "Pas débutée" 
                     Sh.Tab.ColorIndex = 3
               case  "En cours" 
                     Sh.Tab.ColorIndex = 4
               case "Annulée"
                     Sh.Tab.ColorIndex = 5
               case "Terminée"
                     Sh.Tab.ColorIndex = 6
        End select
End Sub
 

JNP

XLDnaute Barbatruc
Re : Couleur d’onglet fonction du résultat d’une formule

Bonjour Skud, Wilfried 42 :),
Pourquoi pas passer par l'évènement activate de chaque feuille ?
Code:
Private Sub Worksheet_Activate()
 ' C13 étant le résultat d'une formule d’une autre feuille
Select Case Range("C13")
    Case "Pas débutée"
        Me.Tab.ColorIndex = 3
    Case "En cours"
        Me.Tab.ColorIndex = 4
    Case "Annulée"
        Me.Tab.ColorIndex = 5
    Case "Terminée"
        Me.Tab.ColorIndex = 6
End Select
End Sub
Bonne journée :cool:
 

Skud

XLDnaute Junior
Re : Couleur d’onglet fonction du résultat d’une formule

Bonjour et Merci Wilfried42 et JNP

J’ai testé vos deux solutions :

Pour la solution de Wilfried42, cela ne résout malheureusement pas mon problème. Même en repassant en calcul automatique je suis obligé de revalider ma formule.

Pour JNP, j’avais déjà testé cette solution mais je suis obligé d’activer tous les onglets un par un pour que cela les mette tous à jour. Or j’ai une quarantaine d’onglets et cela n’est pas très pratique.
D’accord je suis un peu difficile !
Mais le résultat provient d’une formule INDEX et EQUIV qui récupère l’info dans un tableau de suivi, qui est mis à jour régulièrement.

En tous cas merci à tous les deux.

Je suis donc preneur d’une autre solution.
 

JNP

XLDnaute Barbatruc
Re : Couleur d’onglet fonction du résultat d’une formule

Re :),
Une petite sub qui va activer tous tes onglets
Code:
Sub Actualisation()
Dim WS As Worksheet
For Each WS In ThisWorkbook.Worksheets
    WS.Activate
Next
End Sub
Bonne journée :cool:
 

Skud

XLDnaute Junior
Re : Couleur d’onglet fonction du résultat d’une formule

Bien joué JNP !

Cela ne m'était même pas venu à l'idée d'actualiser toutes les feuilles d'un coup !
Je teste cela sur mon fichier et je reviens de suite !
 

JNP

XLDnaute Barbatruc
Re : Couleur d’onglet fonction du résultat d’une formule

Re :),
Dans ces cas là, le plus simple, c'est uniquement
Code:
Sub Actualisation()
Dim WS As Worksheet
For Each WS In ThisWorkbook.Worksheets
 ' C13 étant le résultat d'une formule d’une autre feuille
Select Case WS.Range("C13")
    Case "Pas débutée"
        WS.Tab.ColorIndex = 3
    Case "En cours"
        WS.Tab.ColorIndex = 4
    Case "Annulée"
        WS.Tab.ColorIndex = 5
    Case "Terminée"
        WS.Tab.ColorIndex = 6
End Select
Next
End Sub
Bonne journée :cool:
 

Skud

XLDnaute Junior
Re : Couleur d’onglet fonction du résultat d’une formule

Alors mes impressions après avoir testé :

Au départ j’avais ajouté l’activation des onglets dans un « Worksheet_SelectionChange » mais c’était un peu trop lourd. J’ai pas bcp réfléchi sur ce coup là !
J’ai donc ajouté un « Application.Intersect » sur 1 seule cellule et c’est déjà beaucoup plus gérable !

J’ai donc au niveau de la feuille où se trouve le tableau de suivi :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Application.Intersect(Target, Range("M2")) Is Nothing Then
    Dim WS As Worksheet
For Each WS In ThisWorkbook.Worksheets
    WS.Activate
Next
End If
‘Pour le retour au tableau de suivi
Sheets("XXXXX").Select
End Sub
Et au niveau de chaque feuille :

Code:
Private Sub Worksheet_Activate()
 On Error Resume Next
    Select Case Range("C13")
       Case "Pas débutée"
           Me.Tab.ColorIndex = 3
       Case "En cours"
           Me.Tab.ColorIndex = 45
       Case "Annulée"
           Me.Tab.ColorIndex = 48
       Case "Terminée"
           Me.Tab.ColorIndex = 50
    End Select
End Sub

A noter qu’heureusement que mes feuilles sont crées par une macro qui copie une feuille modèle.
Ainsi je n’ajoute le code ci-dessus qu’une seule fois et il est dupliqué lors de la copie, car sinon cela serait un peu lourd à gérer.

Merci donc à Wilfried42 de s’être penché sur mon problème.
Et Merci à JNP pour la solution.

Au plaisir de vous recroiser au détour d’un autre fil…
 

Skud

XLDnaute Junior
Re : Couleur d’onglet fonction du résultat d’une formule

C'est exactement ce qu'il me fallait !!!
C'est impeccable !

J'ai placé dans le module de la feuille de mon tableau de suivi :

Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim WS As Worksheet
For Each WS In ThisWorkbook.Worksheets
 ' C13 étant le résultat d'une formule d’une autre feuille
On Error Resume Next
Select Case WS.Range("C13")
    Case "Pas débutée"
        WS.Tab.ColorIndex = 3
    Case "En cours"
        WS.Tab.ColorIndex = 4
    Case "Annulée"
        WS.Tab.ColorIndex = 5
    Case "Terminée"
        WS.Tab.ColorIndex = 6
End Select
Next
End Sub

Avec un On error resume next pour l'onglet avec mon tableau de suivi car dans ce cas il ne faut pas changer la couleur de l'onglet.

Et ça fonctionne parfaitement !

MERCI à toi JNP
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 489
Messages
2 088 848
Membres
103 972
dernier inscrit
steeter