Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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+

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

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


*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
Réactions: cp4

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
Réactions: cp4

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
Réactions: cp4

Ommagawi

XLDnaute Junior
Merci Job75. Bonne journée.
 

Ommagawi

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

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…