Function valdif&(r As Range)
Dim oCell As Range, oColl As Scripting.Dictionary
Application.Volatile
Set oColl = CreateObject("Scripting.Dictionary")
For Each oCell In r.Cells
If IsNumeric(oCell) Then If oCell.Value <> 0 And Not oColl.Exists(CStr(oCell.Value)) Then oColl.Add CStr(oCell.Value), oCell.Value
Next
valdif = oColl.Count
End Function
Une petite modification pour ne pas tenir compte d'éventuels zéros devant les nombres :
VB:
Function valdif2&(r As Range)
Dim oCell As Range, oColl As Scripting.Dictionary
Application.Volatile
Set oColl = CreateObject("Scripting.Dictionary")
For Each oCell In r.Cells
If IsNumeric(oCell) Then If oCell.Value <> 0 And Not oColl.Exists(CStr(0 + oCell.Value)) Then oColl.Add CStr(0 + oCell.Value), oCell.Value
Next
valdif2 = oColl.Count
End Function
Comparaison des différentes solutions dans le classeur joint.
Quel travail :O je te remercie, je vais maintenant inévitablement choisir ta deuxième solution qui, répond à tous les cas possibles !
Mille fois merci !
Etant toujours entrain d'adapter ces solutions à mon cas, j'ai deux question:
@: ROGER2327 : Est-ce que la fonction =valdif2() fonctionne en matricielle? car je n'arrive pas à la faire marcher... j'ai joint un petit fichier ou j'ai mis mon essaie en bleu mais qui me donne une #VALEUR
Code:
=valdif(SI((B3:B22="Bien")*1;L3:L22))
@: David : Est-ce normal qu'à la fin de tes deux dernières formules il y ai :
LIGNE(C1:C21))))
alors que la plage utilisée pour tout le reste de tes formules est (C2:C21)