Option Explicit
Function Couleur(r As Range)
For Each r In r
  If r.Interior.ColorIndex = 10 Then Couleur = Couleur + 1 '10 = vert foncé
Next
End Function
Function TriVerticalCouleur(r As Range)
Application.Volatile
If Application.Caller.Parent.Name = ActiveSheet.Name Then
  Dim nlig, ncol, a(), b(), c(), i
  nlig = r.Rows.Count
  ncol = r.Columns.Count - 2
  ReDim a(1 To nlig)
  ReDim b(1 To nlig)
  ReDim c(1 To nlig)
  For i = 1 To nlig
    a(i) = r(i, 1)
    If a(i) Then b(i) = Couleur(r(i, 3).Resize(, ncol)) 'le test fait gagner du temps
    c(i) = b(i) - i / 10000 'pour ne pas modifier l'ordre des ex aequo
  Next
  tri c, a, b, 1, nlig
  ReDim c(1 To nlig, 1 To 2)
  For i = 1 To nlig
    c(i, 1) = IIf(a(i), a(i), "")
    c(i, 2) = IIf(a(i), b(i), "")
  Next
  TriVerticalCouleur = c 'matrice
Else
  TriVerticalCouleur = Application.Caller 'référence circulaire => calcul itérarif
End If
End Function
Function TriHorizontalCouleur(r As Range)
Application.Volatile
If Application.Caller.Parent.Name = ActiveSheet.Name Then
  Dim nlig, ncol, a(), b(), c(), i
  nlig = r.Rows.Count - 1
  ncol = r.Columns.Count
  ReDim a(1 To ncol)
  ReDim b(1 To ncol)
  ReDim c(1 To ncol)
  For i = 1 To ncol
    a(i) = r(1, i)
    b(i) = Couleur(r(2, i).Resize(nlig))
    c(i) = b(i) - i / 10000 'pour ne pas modifier l'ordre des ex aequo
  Next
  tri c, a, b, 1, ncol
  ReDim c(1 To 2, 1 To ncol)
  For i = 1 To ncol
    c(1, i) = a(i)
    c(2, i) = b(i)
  Next
  TriHorizontalCouleur = c 'matrice
Else
  TriHorizontalCouleur = Application.Caller 'référence circulaire => calcul itérarif
End If
End Function
Sub tri(c, a, b, gauc, droi)  ' Quick sort
Dim ref, g, d, temp
ref = c((gauc + droi) \ 2)
g = gauc: d = droi
Do
    Do While c(g) > ref: g = g + 1: Loop
    Do While ref > c(d): d = d - 1: Loop
    If g <= d Then
      temp = c(g): c(g) = c(d): c(d) = temp
      temp = a(g): a(g) = a(d): a(d) = temp
      temp = b(g): b(g) = b(d): b(d) = temp
      g = g + 1: d = d - 1
    End If
Loop While g <= d
If g < droi Then Call tri(c, a, b, g, droi)
If gauc < d Then Call tri(c, a, b, gauc, d)
End Sub