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

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

  • ChargeF.xlsx
    11.9 KB · Affichages: 9
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+
Merci job75. Ca marche.
Quand l'onglet FORMATEUR est "protégé" (c'est le cas), on a un code d'erreur. En le "déprotégeant" ca marche.
Ai je bien fait ?
Encore merci. Bonne journée.

Ommagawi

XLDnaute Junior
Merci pour cette réponse rapide.
Le problème c'est que la liste des formateurs est dynamique.
Il y a des rajouts et des suppression en cours d'année.
Je souhaiterai donc n'avoir que les noms figurants dans le tableau.
 

Pièces jointes

  • ChargeF V1+.xlsx
    12.2 KB · Affichages: 4

Phil69970

XLDnaute Accro
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

  • ChargeF V3.xlsx
    15.7 KB · Affichages: 4

job75

XLDnaute Barbatruc
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

  • ChargeF(1).xlsm
    24.1 KB · Affichages: 6

Ommagawi

XLDnaute Junior
Bonjour,
Je ne sais pas si je peux reprendre une discussion, mais j'essaie.
Comment compter le nombre de stagiaire que si l'état du stage est "Validé" ?
Je remets le fichier.
Merci
 

Pièces jointes

  • ChargeF(1) - Condition.xlsm
    25.7 KB · Affichages: 5

job75

XLDnaute Barbatruc
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

  • ChargeF(2).xlsm
    26.9 KB · Affichages: 2

job75

XLDnaute Barbatruc
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

  • ChargeF(3).xlsm
    27.8 KB · Affichages: 6

Ommagawi

XLDnaute Junior
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.
 

Ommagawi

XLDnaute Junior
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 ?
 

Discussions similaires

Réponses
7
Affichages
178