MFC dynamique sur une plage

Bonjour le forum,

Je voudrais une mise en forme conditionnelle qui soit dynamique sur une plage nommée "plageValider" de "B5:I100". Lorsque je supprime une ligne alors la formule ne doit pas bouger. Voici la formule que je souhaite rendre dynamique "=OU(ET($B5=VRAI;$I5=1);ET($B5=VRAI;$I5>1))".

D'avance merci.

Nazée

7mfc-couleur.xlsm (19.74 Ko)

Bonjour nazee

Ceci ne réponds pas directement à la question mais ta formule peux se résumé à

=ET($B5=VRAI;$I5>0)

Cordialement

Bonjour,

Bonjour nazee

Ceci ne réponds pas directement à la question mais ta formule peux se résumé à

=ET($B5=VRAI;$I5>0)

Cordialement

=ET($B5=VRAI;$I5>=1)

Pour être exact. Puisque les valeurs en question sont des pourcentages = nombres à virgules.

Par contre pas trop compris la question... Pourquoi ne pas utiliser un tableau structuré tout simplement ?

Bonjour,

C'est un grand fichier déjà construit et je souhaite juste appliquer cette MFC. C'est pour mettre en évidence les valeurs qui sont égales à 100% ou supérieures à 100%.

Cette formule

=ET($B5=VRAI;$I5>=1)"

me convient parfaitement mais je voudrais l'appliquer dynamiquement sur plage définie d'une partie du tableau. C'est pour cela que je veux utiliser une plage nommée.

Pour info si je définis une plage nommée "plgTest" en A1:A10, puis que j'insère une ligne en A5 la plage devient A1:A11

Et si je supprime une ligne en A5, la plage devient A1:A10 de nouveau. Et quand j'y applique un format conditionnel, il suit le même procédé… Donc a priori pas de problème. Ajoutez simplement la MFC en séletionnant toute la plage.

Justement c'est pour éviter ce décalage.

Lorsque je définie "plgTest" en "A1:A10" et bien je voudrais que la MFC reste sur cette plage, que je supprime ou j'ajoute une ligne.

Ah... J'ai compris.

Je ne pas trop comment faire cela "proprement". Je pense qu'il faudrait ajouter dans la MFC une condition sur la LIGNE() en se basant sur la 1e ligne de la plage nommée. En fait on garderait comme plage nommée simplement la 1e ligne. Puis dans la condition il faut ajouter :

ET($B5=VRAI; $I5>=1; LIGNE() – LIGNE(maPlage) < 10)

Pour garder la MFC sur ces 10 lignes. Attention par contre à ne pas supprimer la plage de référence, auquel cas plutôt utiliser une ligne d'en tête comme référence.

Mais autrement je ne vois pas désolé.

La formule est bonne mais la plage du gestionnaire des règles des mises en formes n'est pas stable. Peut on la rendre auto-ajustable pour une plage définie (ex : sur les dix premières lignes) ? Que l'on supprime ou l'on ajoute des lignes, on a toujours la même plage.

Bonjour

On ne peux, a ma connaissance, utiliser une plage dynamique comme support de MFC.

Comme proposé par saboh12617, l'utilisation d'un tableau structuré résoudrai le problème.

Cordialement

Pour faire cela il faudrait utiliser un tableau structuré.

Ou bien appliquer la MFC sur une plage plus longue que votre tableau (lourd si le tableau est long).

Ou bien utiliser du VBA pour réappliquer la MFC après remplissage du tableau…

Vous voyez que les tableaux structurés sont quand même drolement pratiques, c'est se tirer dans les pieds que de ne pas les utiliser.

Pour bien comprendre, la MFC bouge avec les cellules, et il n'y a pas moyen de la faire "flotter" au-dessus du tableau. Elle y est liée.

Merci à tous les deux.

J'ai développé également un code à la place la MFC d'Excel.

Il fonctionne bien mais je cherchais de la vitesse.

Encore merci.

Nazée

Merci pour votre retour. Désolé mais vous atteignez les limites du possible avec les contraintes actuelles. Bon courage.

Pour info, une bonne macro devrait être instantanée sur ce genre de problème. Si vous voulez, on peut regarder ce qui pèche.

Oui, je veux bien, s'il vous plait. La macro est également incluse dans le fichier que j'ai donné.

Elle est constituée d'un module de classe et un module standard.

Module de classe :

Option Explicit

'Convertir un pourcentage en décimal
Public Function xFPourcentDecimal(vPourcent As String) As Double
    'Supprimer les espaces et les caractères non numériques
    vPourcent = Trim(vPourcent)
    vPourcent = Replace(vPourcent, "%", "")

    'Convertir la chaîne en nombre décimal
    On Error Resume Next
    xFPourcentDecimal = CDbl(vPourcent)
    If Err.Number <> 0 Then
        xFPourcentDecimal = 0
        Err.Clear
    End If
    On Error GoTo 0
End Function

Module standard :

Option Explicit

'Variables communes pour convertir un pourcentage en décimal de la classe "xFc_Pourcent"
Public vPourcent As New xFc_Pourcent

'Appliquer une couleur Vert dans la feuille "Traitement"
Sub xPColeursTrait()
    Dim vValDecimal As Double
    Dim vValeurText As String
    Dim i As Long, vDernierLig1 As Long

    'La formule de la mise en évidence
    '=ET($B5=VRAI;$I5>=1)

    'Désactiver les événements
    xPDesactMiseJour

    'La feuille de calcul
    xPFeuils

    'Créer une instance de la classe xFc_Pourcent
    Set vPourcent = New xFc_Pourcent

    'La dernière ligne utilisée dans la colonne "C" de la feuille "Traitement"
    vDernierLig1 = vDernierLigne.xFcDernierLig(vWS1, "C", 5)

    'Appliquer une couleur
    For i = 5 To vDernierLig1 'vDernierLigne
        'La valeur de la colonne I en tant que texte
        vValeurText = vWS1.Cells(i, 9).Text

        'Vérifier si la valeur contient un pourcentage
        If InStr(vValeurText, "%") > 0 Then
            'Convertir la valeur de la colonne "I" en décimal
            vValDecimal = vPourcent.xFPourcentDecimal(vValeurText)

            If vWS1.Cells(i, 2).Value = True And vValDecimal >= 100 Then
                vWS1.Range("B" & i & ":I" & i).Interior.Color = RGB(0, 176, 80) 'Vert
            Else
                vWS1.Range("B" & i & ":I" & i).Interior.colorIndex = xlNone 'Réinitialiser la couleur de fond
            End If
        Else
            'Si la valeur n'est pas un pourcentage, réinitialiser la couleur de fond
            vWS1.Range("B" & i & ":I" & i).Interior.colorIndex = xlNone
        End If
    Next i

    'Résactiver les événements
    xPReactMiseJour
End Sub
Rechercher des sujets similaires à "mfc dynamique plage"