XL 2013 Regrouper des sommes par noms

alain.raphael

XLDnaute Occasionnel
Bonjour à Tous,

Dans un fichier de 24000 lignes je dois contrôler regrouper des sommes par noms. Chaque prénoms est présents sur plusieurs lignes...il y a environ 1500 noms.

Je cherche donc à générer ces sommes mais la formule SOMMEPROD de convient pas....

Ci-joint un fichier exemple...

MERCI
 

Pièces jointes

  • ESSAI Regroup Prénoms.xlsx
    8.3 KB · Affichages: 9

Robert

XLDnaute Barbatruc
Bonjour le fil, bonjour le forum,

Ne manquait plus que la proposition VBA !... La voici :

VB:
Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim K As Integer 'déclare la variable K (incrément)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)

Set O = Worksheets("Feuil1") 'définit l'onglet O
TV = O.Range("H8").CurrentRegion 'définit le tableau des valeurs TV
O.Range("M8").CurrentRegion.ClearContents 'effance d'éventuelles anciennes données à partir de M8
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 1 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV
    D(TV(I, 1)) = "" 'alimente le dictionnaire D avec les données en colonne 1 de TV
Next I 'prochaine ligne de la boucle
TMP = D.Keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionnaire D sans doublon
K = 1 'initialise la variable K
For J = 0 To UBound(TMP) 'boucle 1 : sur tous les éléments J du tableau temporaire TMP
    For I = 1 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV
        If TV(I, 1) = TMP(J) Then 'si la donnée ligne I colonne 1 de TV est égale à l'élément J de TMP
            ReDim Preserve TL(1 To 2, 1 To K) 'redimensionne le tableau des lignes TL (2 lignes, K colonnes)
            TL(1, K) = TV(I, 1) 'récupère le nom dans la ligne 1
            TL(2, K) = TL(2, K) + TV(I, 2) 'fait la somme dans la ligne 2
        End If 'fin de la condition
    Next I 'prochaine ligne de la boucle 2
    K = K + 1 'incrémente K
Next J 'prochain élément de la boucle 1
'si K est supérieure à 1 renvoie dans M8 redimensionnée le tableau TL transposé
If K > 1 Then O.Range("M8").Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL)
End Sub
 
Haut Bas