Function SommeParConditionMFC(PlageSomme As Range) As Double
Dim Cellule As Range
Dim MFC As FormatCondition
Dim ConditionRemplie As Boolean
Dim Total As Double
Total = 0
For Each Cellule In PlageSomme
ConditionRemplie = False
' On boucle sur toutes les règles de MFC appliquées à la cellule
If Cellule.FormatConditions.Count > 0 Then
For Each MFC In Cellule.FormatConditions
' On ne traite ici que les MFC de type "Formule" ou "Valeur de la cellule"
On Error Resume Next
Select Case MFC.Type
Case 1 ' xlCellValue (Valeur de la cellule est...)
ConditionRemplie = VerifierConditionValeur(Cellule, MFC)
Case 2 ' xlExpression (La formule est...)
' Evaluate permet de tester la formule de la MFC dans le contexte de la cellule
ConditionRemplie = Application.Evaluate(ModifierFormulePourCellule(MFC.Formula1, Cellule))
End Select
On Error GoTo 0
' Si une condition est vraie (et que "Interrompre si vrai" est actif, on s'arrête là)
If ConditionRemplie Then
Total = Total + Cellule.Value
Exit For ' Sort de la boucle des MFC pour cette cellule
End If
Next MFC
End If
Next Cellule
SommeParConditionMFC = Total
End Function
' Fonction support pour adapter la formule relative de la MFC à chaque cellule
Private Function ModifierFormulePourCellule(Formule As String, Cellule As Range) As String
ModifierFormulePourCellule = Application.ConvertFormula(Formule, xlA1, xlA1, , Cellule)
End Function
' Fonction support pour les MFC de type "Valeur de la cellule"
Private Function VerifierConditionValeur(Cell As Range, MFC As FormatCondition) As Boolean
Dim Val1, Val2
Val1 = Application.Evaluate(MFC.Formula1)
Select Case MFC.Operator
Case xlGreater: VerifierConditionValeur = (Cell.Value > Val1)
Case xlLess: VerifierConditionValeur = (Cell.Value < Val1)
Case xlEqual: VerifierConditionValeur = (Cell.Value = Val1)
Case xlBetween:
Val2 = Application.Evaluate(MFC.Formula2)
VerifierConditionValeur = (Cell.Value >= Val1 And Cell.Value <= Val2)
' Ajoutez d'autres cas (xlNotEqual, etc.) si nécessaire
End Select
End Function