Bonsoir,
Essai fonction personnalisée (c'est dans le vent ! )
Function SOMNBOU(pl1 As Range, cd1, pl2 As Range, cd2, Optional plS As Range)
Dim nbs, n%, i%, S As Boolean
Application.Volatile
If pl1.Rows.Count <> pl2.Rows.Count Or pl1.Columns.Count <> pl2.Columns.Count Then
SOMNBOU = CVErr(xlErrValue)
Exit Function
ElseIf pl1.Rows.Count = 1 Or pl1.Columns.Count = 1 Then
n = IIf(pl1.Columns.Count > pl1.Rows.Count, pl1.Columns.Count, pl1.Rows.Count)
If Not plS Is Nothing Then
If plS.Rows.Count = pl1.Rows.Count And plS.Columns.Count = pl1.Columns.Count Then
S = True
Else
SOMNBOU = CVErr(xlErrValue)
Exit Function
End If
End If
Else
SOMNBOU = CVErr(xlErrValue)
Exit Function
End If
cd1 = Replace(cd1, ",", "."): cd2 = Replace(cd2, ",", ".")
If Not cd1 Like "[><=]*" Then cd1 = "=" & cd1
If Not cd2 Like "[><=]*" Then cd2 = "=" & cd2
For i = 1 To n
If Evaluate("=" & pl1.Cells(i) & cd1) Or Evaluate("=" & pl2.Cells(i) & cd2) Then
If S Then
nbs = nbs + plS.Cells(i)
Else
nbs = nbs + 1
End If
End If
Next i
SOMNBOU = nbs
End Function
La fonction renvoie soit une somme de valeurs soit un nombre de valeurs satisfaisant l'une ou l'autre (ou les deux) de deux conditions. Elle admet 5 arguments dont un optionnel.
Dans l'ordre : la plage sur laquelle est recherchée la condition 1, la condition 1, la plage sur laquelle est recherchée la condition 2, la condition 2, et enfin la plage sur laquelle s'effectue la somme des valeurs, ce dernier argument est optionnel, s'il est omis la fonction renvoie le nombre de valeurs.
Les conditions sont formulées de façon habituelle sous forme de chaîne intégrant des opérateurs de comparaison (>, >=, <, <=, =) ou non (l'absence d'opérateur équivaut à rechercher l'égalité).
Les plages doivent être sur une seule colonne ou une seule ligne et avoir le même nombre de lignes ou colonnes.
Cordialement.