Autres Additionner des nombres de deux colonnes avec un critère

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Ommagawi

XLDnaute Junior
Bonjour,
Dans mon exemple je souhaite faire la somme des stagiaires par formateurs.
Peut-on le faire avec un TCD ou faut-il utiliser une macro ?
Je ne peux pas utiliser la formule SI car les formateurs sont trop nombreux (plus de 50).
Merci de votre coopération.
 

Pièces jointes

Solution
Bonjour Ommagawi, le forum,

Le code que vous indiquez est clair : il faut un tableau structuré.

Or la feuille CUMULFORMATEUR est la seule feuille où il n'y en a pas !!!

Créez-le,, fermez et rouvrez le fichier et activez la feuille.

PS : pourquoi avoir ajouté Sheets("FORMATEUR").Unprotect qui ne sert strictement à rien ?

A+
Re

Voici la V3
Tu inscris les noms dans la colonne "nom formateur" et le total s'inscrit tout seul
1641630885393.png


*Rappel comme c'est un tableau structuré il ne doit jamais avoir de ligne vide le tableau s’agrandit tout seul quand tu rajoutes un nom et il met la/les formules adéquates automatiquement

*Merci de ton retour

@Phil69970
 

Pièces jointes

Bonjour Ommagawi, Phil69970,

Une solution VBA très classique.

Voyez le fichier joint et cette macro dans le code de la feuille "Résultat" :
VB:
Private Sub Worksheet_Activate()
Dim d As Object, tablo, i&, j%, x$, a, b, resu(), n&
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
With Sheets("Feuil1").[A1].CurrentRegion
    tablo = .Resize(, 4) 'matrice, plus rapde
    For i = 2 To UBound(tablo)
        For j = 2 To 3
            x = tablo(i, j)
            If x <> "" Then d(x) = d(x) + Val(tablo(i, 4))
    Next j, i
End With
'---transposition---
If d.Count Then
    a = d.keys: b = d.items
    ReDim resu(UBound(a), 1) 'base 0
    For n = 0 To UBound(a)
        resu(n, 0) = a(n)
        resu(n, 1) = b(n)
    Next n
End If
'---restitution---
If FilterMode Then ShowAllData 'si la feuille est filtrée
With [A2] '1ère cellule de destination, à adapter
    If n Then
        .Resize(n, 2) = resu
        .Resize(n, 2).Sort .Cells(1), xlAscending, Header:=xlYes 'tri alphabétique
    End If
    .Offset(n).Resize(Rows.Count - n - .Row + 1, 2).ClearContents 'RAZ en dessous
End With
End Sub
Elle se déclenche quand on active la feuille.

A+
 

Pièces jointes

Bonjour Ommagawi, le forum,

Il suffit de tester la 5ème colonne, fichier (2) :
VB:
With Sheets("FORMATEUR").[B1].CurrentRegion
    tablo = .Resize(, 5) 'matrice, plus rapde
    For i = 2 To UBound(tablo)
        If LCase(tablo(i, 5)) = "validé" Then 'compare en minuscules
            For j = 2 To 3
                x = tablo(i, j)
                If x <> "" Then d(x) = d(x) + Val(tablo(i, 4))
            Next j
        End If
    Next i
End With
A+
 

Pièces jointes

Puisque dans la 2ème feuille on a un tableau structuré il faut revoir la fin de la macro, fichier (3) :
VB:
'---restitution---
With ListObjects(1).Range.Resize(, 2) 'tableau structuré
    .AutoFilter: .AutoFilter 'si le tableau est filtré
    With .Rows(2)
        If n Then
            .Resize(n) = resu
            .Resize(n).Sort .Columns(2), xlDescending, Header:=xlYes 'tri décroissant
        End If
        .Offset(n).Resize(Rows.Count - n - .Row + 1).ClearContents 'RAZ en dessous
    End With
    On Error Resume Next 'si aucune SpecialCell
    .SpecialCells(xlCellTypeBlanks).Delete xlUp 'supprime les lignes vides s'il y en a
End With
End Sub
 

Pièces jointes

Bonjour Ommagawi, le forum,

Il suffit de tester la 5ème colonne, fichier (2) :
VB:
With Sheets("FORMATEUR").[B1].CurrentRegion
    tablo = .Resize(, 5) 'matrice, plus rapde
    For i = 2 To UBound(tablo)
        If LCase(tablo(i, 5)) = "validé" Then 'compare en minuscules
            For j = 2 To 3
                x = tablo(i, j)
                If x <> "" Then d(x) = d(x) + Val(tablo(i, 4))
            Next j
        End If
    Next i
End With
A+
Merci Job75. Bonne journée.
 
Puisque dans la 2ème feuille on a un tableau structuré il faut revoir la fin de la macro, fichier (3) :
VB:
'---restitution---
With ListObjects(1).Range.Resize(, 2) 'tableau structuré
    .AutoFilter: .AutoFilter 'si le tableau est filtré
    With .Rows(2)
        If n Then
            .Resize(n) = resu
            .Resize(n).Sort .Columns(2), xlDescending, Header:=xlYes 'tri décroissant
        End If
        .Offset(n).Resize(Rows.Count - n - .Row + 1).ClearContents 'RAZ en dessous
    End With
    On Error Resume Next 'si aucune SpecialCell
    .SpecialCells(xlCellTypeBlanks).Delete xlUp 'supprime les lignes vides s'il y en a
End With
End Sub
Bien pris.
Je profite de l'occasion pour rajouter un critère.
En effet je voudrai pouvoir avoir ce résultat par année :
en sélectionnant par exemple une cellule dans laquelle on marque l'année.
Est ce possible ?
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Retour