Bonjour DjiDji59430,
je suis ravi que mon fichier t'a aidé à comprendre la logique de l'exercice ! comme tu as repris mon fichier et mon exemple numérique, je crois que tu aurais pu le mentionner, n'est-ce pas ?
au début, j'ai cru que tu n'avais pas vu qu'en exécutant ma macro, ça affiche les résultats en colonne P ; je me suis dit : « tiens, DjiDji a repris mon fichier juste pour mettre les résultats en colonne R ? »
puis j'ai vu ta formule matricielle en R1 ; ça, c'est très bien d'avoir proposé une solution par formule, bravo !
y'a juste un p'tit défaut : c'est par rapport à la valeur 10 que j'avais choisie pour x, et 10 est une constante !
j'avais choisi des nombres tout à fait au hasard, et si j'ai choisi 10 pour x c'est de façon purement arbitraire.
du demandeur.
si tu avais mieux regardé ma solution, tu aurais vu qu'elle utilise pour x la valeur de la cellule B7
➯ c'est une variable que l'utilisateur peut choisir à son gré.
comme tu as repris mon fichier, il te suffit juste de faire Alt F11 pour voir mon code VBA :
Option Explicit
Sub Essai()
Dim total%, i As Byte, j As Byte
For i = 1 To 5
total = 0
For j = 1 To 10
If Cells(i, j) = [B7] Then total = total + Cells(i, j + 4)
Next j
Cells(i, 16) = total
Next i
End Sub
note bien que le test est : If Cells(i, j) = [B7] Then
j'ai réécrit ainsi ta formule matricielle (sera à valider par Ctrl Maj Entrée) :
=SIERREUR(INDEX($A1:$N1;PETITE.VALEUR(SI($A1:$N1=B$7;COLONNE($A:$N));1)+4)+SIERREUR(INDEX($A1:$N1;PETITE.VALEUR(SI($A1:$N1=B$7;COLONNE($A:$N));2)+4);0);0)
j'ai remplacé les deux 10 par B$7 mais pas seulement ! car j'ai ajouté la fonction SIERREUR() pour éviter ceci :
tu peux voir que c'est bien mieux comme ça :
j'ai aussi supprimé ma sub Essai() pour en faire une procédure événementielle ; ainsi, quand on change la valeur x de B7, les résultats de la sub aussi sont modifiés, pas seulement ceux de la formule matricielle.
Option Explicit
Dim total%, i As Byte, j As Byte
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .CountLarge > 1 Then Exit Sub
If .Address <> "$B$7" Then Exit Sub
For i = 1 To 5
total = 0
For j = 1 To 10
If Cells(i, j) = .Value Then total = total + Cells(i, j + 4)
Next j
Cells(i, 16) = total
Next i
End With
End Sub
voici le nouveau fichier correspondant :
dhany