Bonsoir à tous,
oui, par formule ça risque d'être chaud.
Je te propose une fonction personnalisée peut-être plus facile à mettre en oeuvre sur des feuilles différentes.
Dans un module standard :
Function cout(indice As Range, ATM As Range) As Variant
Const code As String = "ATM,ADI,ADE"
Dim ind() As Long, pos As Long, lig As Long
ReDim ind(0 To (Len(code) + 1) / 4, 0 To 1)
' contrôle
If indice.Columns.Count > 1 Or ATM.Columns.Count > 1 Or indice.Rows.Count <> ATM.Rows.Count Then
cout = CVErr(xlErrValue)
Exit Function
End If
' calcul cout
For lig = 1 To ATM.Count
pos = InStr(code, UCase(ATM(lig, 1)))
If pos > 0 And ATM(lig, 1) <> "" Then
pos = pos \ 4
If indice(lig, 1) > ind(pos, 0) Then
ind(pos, 1) = ind(pos, 0)
ind(pos, 0) = indice(lig, 1)
ElseIf indice(lig, 1) > ind(pos, 1) Then
ind(pos, 1) = indice(lig, 1)
End If
End If
Next lig
For lig = 0 To UBound(ind)
cout = cout + ind(lig, 0) + ind(lig, 1) / 2
Next lig
End Function
Syntaxe :
=cout(plage_des_indice, plage_des_ATM)
Ex :
=cout(Q5:Q11;T5:T11)
Les plages doivent avoir 1 colonne de large et même longueur sinon #VALEUR!
Tu peux modifier la constante de la 1ère ligne : Const code As String = "ATM,ADI,ADE".
La macro s'adapte au nombre de codes définis, ils doivent être en majuscule ici (indifférent sur la feuille)
eric
eric