Calculer valeur mini des cellules colorées par MFC

Bonjour à tous et à toutes

J'essaie d'effectuer cette macro depuis 2 jours, je n'arrive pas à trouver la solution. C'est pour cela que je fais appel à votre aide.

Je cherche à calculer la valeur mini de la matrice A1:A50. Mais uniquement des valeurs se trouvant dans une cellule de couleur. (La couleur à était mis de manière automatique par MFC.

Mon problème est que la condition pour que la cellule soit coloriée par MFC est trop compliqué pour que je puisse la réutiliser dans mon calcul de valeur mini.

Je pense qu'il faut que je passe par une macro qui vient récupérer les valeurs de toutes les cellules qui ont une couleur non vide dans la zone A1:A10.

Bonjour,

Ce n'est pas possible par VBA de trouver une couleur de MFC. Pour ça, il faut que dans ta macro tu utilises ta condition de MFC. Montre la formule de ta condition et on va voir ce qu'il est possible de faire.

Bonjour Theze

Merci pour ces informations.

Je te joins mon tableau.

18v1.xlsm (179.40 Ko)

Explications :

Feuille 3 : la MFC s'applique sur le tableau A1097 : J1252

Les conditions de MFC sont différentes pour chaque colonne et pour chaque zone (Colonne A:)

La MFC colorie les cellules si :

  • Recherche de la valeur de l'angle B: dans le tableau C730 : J1093
  • EX : La colonne CD pour la zone 0° +90° les conditions sont : C: < 0 & D:<0
Si les deux conditions sont remplies je colorie en vert la cellule du tableau (A1097 : J 1252) pour le même angle.

Je cherche à calculer la valeur mini par colonne des cellules vertes. Ce calcul se fait ligne 1254.

Merci pour ton aide.

Ben

Bonjour,

Ici je suis sous Excel 2003 ce qui fait que les MFC de ton classeur en .xlsm ont disparues donc je ne pourrait t'aider qu'une fois chez moi ce WE car j'ai Excel 2007

Bonjour,

Depuis qu'Eric a appelé notre attention sur la propriété DisplayFormat, on peut calculer sur des couleurs résultant de MFC.

Le handicap est que l'on ne peut bâtir de fonction personnalisée... mais on peut opérer le calcul avec une procédure :

Sub CalculerMiniVert()
    Dim Mini(3 To 10), clr&, k%, c As Range
    clr = RGB(226, 239, 218)
    With ActiveSheet
        For k = 3 To 10
            Mini(k) = ""
            For Each c In .Range(.Cells(1098, k), .Cells(1252, k))
                If c.DisplayFormat.Interior.Color = clr Then
                    If c.Value < Mini(k) Then Mini(k) = c.Value
                End If
            Next c
        Next k
        .Range("C1254").Resize(, 8).Value = Mini
    End With
End Sub

Cordialement.

Un moyen de tourner éventuellement la chose.

Module Standard :

Public Mini(3 To 10)

Function MINVERT(k As Integer)
    Application.Volatile
    If Not IsEmpty(Mini(k)) Then
        MINVERT = Mini(k)
    Else
        MINVERT = CVErr(xlErrNA)
    End If
End Function

Affichage N/A si variable non initialisée car sinon afficherait 0 qui prêterait à confusion.

Module feuille :

Private Sub Worksheet_Activate()
    Dim clr&, k%, c As Range
    clr = RGB(226, 239, 218)
    With Me
        For k = 3 To 10
            Mini(k) = ""
            For Each c In .Range(.Cells(1098, k), .Cells(1252, k))
                If c.DisplayFormat.Interior.Color = clr Then
                    If c.Value < Mini(k) Then Mini(k) = c.Value
                End If
            Next c
        Next k
        .Calculate
    End With
End Sub

Test : A l'ouverture, la variable n'est pas initialisée : la fonction affiche N/A.

On passe sur l'autre feuille et on revient, le calcul se fait.

Cordialement.

Bonjour MFerrand & bonjour Theze

Un grand merci à vous deux.

MFerrand ta fonction marche parfaitement. Je vais pouvoir avancer sur la suite.

A bientôt

Benjamin

J’ai peut-être parlé un peu trop vite. J’ai l’impression que la fonction ne se met pas à jour. Car si je modifie à la main les valeurs du tableau, tout en m’assurant que les couleurs ne changent pas, la valeur « minvert » ne se met pas à jour. Même si je demande à Excel de recalculer la page « F9 ».

J’ai exporté les macros dans un autre fichier. Et là, la cellule reste vide. Comme si le résultat était : « ».

As-tu une explication pour ces deux problèmes ? Est-ce que je fais une mauvaise manipulation ?

Ben

Bonjour,

Ce qu'il faut bien comprendre, c'est que la fonction ne calcule pas, elle se borne à renvoyer la valeur stockée dans une variable.

Le calcul est fait par ailleurs et aboutit à stocker les résultats dans une variable où la fonction peut les récupérer.

Si la fonction réalisait le calcul où si elle lançait elle-même le calcul fait par ailleurs, elle ne fournirait comme résultat qu'une valeur d'erreur : #VALEUR! Pourquoi ? Mystère à chercher dans les arcanes de Microsoft... qui s'est borné à indiquer que la propriété utilisée pour le calcul ne pouvait pas être utilisée dans une fonction personnalisée !

Au cas particulier, le calcul étant fait par une procédure évènementielle qui s'exécute à l'activation de la feuille, forcer le recalcul est inopérant tant que le calcul par cette procédure n'a pas été refait, il faut donc sortir de la feuille et y revenir pour avoir un recalcul...

Le choix est d'une part entre un calcul remontant aux conditions provoquant la mise en couleur MFC, tel que te le proposait Theze, qui a l'avantage de pouvoir donner lieu à une fonction dont le recalcul sera immédiat, mais qui peut être parfois un peu plus compliquée à réaliser selon la multiplicité des conditions à prendre en compte. Ou bien un calcul, à l'instar du calcul fait à partir de la couleur de fond des cellules, réalisé sur la couleur apparente résultant de la MFC, mais qui ne peut donner lieu en tant que tel à une fonction.

Sur ce type de calcul, le choix est entre une procédure de calcul lancée comme toute macro ordinaire (bouton, raccourci...) (ou qui peut également être attachée à un évènement), telle ma première proposition, qui opère le calcul et affecte les résultats là où tu les attends. Ou la simulation en quelque sorte d'une fonction : une variable de niveau module (publique si elle doit être alimentée de l'extérieur du module) recueille les résultats [la variable Mini est un tableau d'indices 3 à 10, alignés sur tes numéros de colonne pour plus de facilité d'utilisation, destiné à accueillir les 8 valeurs résultant du calcul respectivement sur chacune des colonnes], et la fonction, en lui passant le numéro de colonne voulu, se borne à renvoyer le résultat concernant la colonne demandée en le prélevant dans la variable où il est stocké.

Evidemment, la mise à jour ne dépend plus de la fonction elle-même, mais de la procédure qui effectue le calcul. Dans ma proposition, cette procédure est lancée automatiquement à l'activation de la feuille, il semblait que cet évènement soit le plus pratique à utiliser dans ce cas, mais on peut en choisir un autre, ou on peut faire recalculer par une macro lancée par l'utilisateur...

Une fois que tu as bien cerné les contraintes de la méthode, à toi de choisir les modalités qui te conviennent le mieux, ou bien de revenir à un calcul basé sur les conditions, qui aura le mérite d'être plus transparent pour l'utilisateur.

Cordialement.

Rechercher des sujets similaires à "calculer valeur mini colorees mfc"