Fonctions de couleur et MFC

Il existe une possibilité en VBA pour récupérer la couleur affichée d'une cellule (en tenant compte des mises en forme conditionnelles) mais il n'est techniquement pas possible* de récupérer la couleur à l'aide d'une fonction personnalisée à insérer sur une feuille Excel.

Pour que les fonctions puissent malgré tout tenir compte de la couleur affichée d'une cellule (avec MFC), il faut donc trouver une solution en VBA qui soit complètement indépendante des fonctions insérées sur la feuille ...


Exemple de cas

Le tableau suivant contient des cellules colorées par MFC et l'objectif ici est d'obtenir le numéro de couleur de chaque cellule grâce à la fonction NO_COULEUR du pack de fonctions :

excel fonction couleur mfc

Sans surprise, vous pouvez constater que les couleurs appliquées par la mise en forme conditionnelle ont été ignorées.

Puisqu'une fonction sur une feuille ne peut pas tenir compte de la couleur affichée, une possibilité est d'utiliser l'événement Worksheet_Change (qui se déclenche après une modification dans la feuille) et de modifier la couleur de la cellule pour lui donner la valeur de celle affichée :

Private Sub Worksheet_Change(ByVal Target As Range)

    'Si modification d'une plage de cellules qui peut influer sur la MFC => mettre à jour les couleurs
    If Not Application.Intersect(Target, [B2:G7]) Is Nothing Then
        
        Application.ScreenUpdating = False

        'Copie des couleurs affichées
        For Each c In [B2:G7]
            c.Interior.Color = c.DisplayFormat.Interior.Color
        Next
        
    End If
    
End Sub

Grâce à cela, la couleur de la cellule sera la même que la couleur appliquée par la MFC et toutes les fonctions de couleur pourront donc ensuite l'utiliser normalement :

excel fonction couleur mfc

En cas de changement dans la plage B2 à G7, les couleurs seront automatiquement mises à jour :

excel fonction couleur feuille mfc
* Nouveau : une astuce permettant de contourner la limitation de DisplayFormat a été découverte !