Application.Volatile
não é suficiente ......... a função será calculada toda vez que a planilha for calculada e isso pode não acontecer se você apenas mudar de cor.
EDIT # 1:
Primeiro, fazemos uma mudança de uma linha para o seu UDF () para que ele aceite um argumento variante opcional que não usa!:
Public Function SumByColor(rng As Range, clr As String, Optional v As Variant) As Double
Application.Volatile
Dim s As Double
s = 0
Dim r As Range
Dim c As Long
If clr = "red" Then
c = RGB(256, 0, 0)
End If
If clr = "black" Then
c = RGB(0, 0, 0)
End If
For Each r In rng
If r.Font.Color = c Then
s = s + r.Value
End If
Next r
SumByColor = s
End Function
e, em seguida, na planilha, use algo como:
=SumByColor(A1:A14,"red",NOW())
A idéia é que, se você tocar em F9 , NOW()
será recalculado e o mesmo será UDF () .