Somme sur plusieurs paramètres

  • Initiateur de la discussion Initiateur de la discussion sabben
  • Date de début Date de début

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 !

sabben

XLDnaute Nouveau
Bonjour à tous,

J'ai un calcul que je n'arrive pas à conceptualiser sur excel, je l'ai fait sur sql, mais sur excel j'aimerai vraiment savoir comment c'est possible

Je suis dans le monde de l'automobile.

J'ai des ordres de réparation, c'est à dire une intervention que je nomme numer interv , j'ai des salariés qui sont codifiés Nom_Sal, et j'ai un nombre d'heure NB_H sur 1 table.

Je voudrais la somme des heures (NB_H) par numér interv dans lequel le salarié Num_Sal est intervenu.

On peut avoir évidemment 2 ou 3 salariés par numér interv (si 3 personnes ont bossés sur l'intervention par exemple).


(Voir en PJ l'image svp)



J'aimerai que le calcul soit automatisé pour chaque personne afin de faire un état de la producitivité de chacun !

Comment puis-je faire?

merci !
1027095
 
Oui, mais quand tu refais ses calculs avec ses explications, il me semble qu'il en oublie (des heures)
toi aussi quand tu ne fais voir que 3 intervention alors que 1050 a en plus aidé a l'intervention 14110001
Par contre, en regardant mes calculs, j'ai du etre genereux (des heures comptées deux fois)
je verifierai demain

Crdlmt
 
Déjà merci à vous deux !
Je vais vous joindre le fichier excel, le vrai, parce qu'en fait vous y verrez peut-être plus clair, aussi, comment puis je faire cela de manière automatique sans passer par un sous tableau car comme vous pouvez le voir j'ai beaucoup de données.

Les données ne sont pas les mêmes, mais le principe est le même, pour chaque mec je veux le nombre d'heures total des interventions (lui ou ses collègues) sur lesquelles il a bossé ne serait ce qu'une seconde !

@job75 : c'est parfait mais comment puis-je automatiser ça ? J'ai énormément de données
@djidji : désolé mais il ne me semble pas que le 1050 ait bossé sur le 14110011

merci infiniement à vous
 

Pièces jointes

Bonjour sabben, djidji59430, le forum,
comment puis je faire cela de manière automatique sans passer par un sous tableau
Avec le VBA pas de problème :
VB:
Sub Total_heures()
Dim F As Worksheet, dest As Range, tablo, d1 As Object, i&, d2 As Object, x$, a, b
Set F = Sheets("BDD") 'à adapter
Set dest = F.[H1] 'à adapter
tablo = F.[A1].CurrentRegion
Application.ScreenUpdating = False
If F.FilterMode Then F.ShowAllData 'si la feuille est filtrée
dest(2).Resize(F.Rows.Count - dest.Row, 2).Delete xlUp 'RAZ
'---Somme des heures par N° interv---
Set d1 = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(tablo)
    d1(CStr(tablo(i, 3))) = d1(CStr(tablo(i, 3))) + Val(Replace(tablo(i, 1), ",", "."))
Next
If d1.Count = 0 Then Exit Sub
'---Somme des heures par N° salarié & N° intervenant---
Set d2 = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(tablo)
    x = tablo(i, 2) & Chr(1) & tablo(i, 3)
    If Not d2.exists(x) Then d2(x) = d1(CStr(tablo(i, 3)))
Next
'---Somme des heures par N° salarié---
a = d2.keys: b = d2.items
d1.RemoveAll
For i = 0 To UBound(a)
    x = Left(a(i), InStr(a(i), Chr(1)) - 1)
    d1(x) = d1(x) + b(i)
Next
'---restitution---
dest(2).Resize(d1.Count) = Application.Transpose(d1.keys) 'Transpose limitée à 65536 lignes
dest(2, 2).Resize(d1.Count) = Application.Transpose(d1.items)
dest(2).Resize(d1.Count, 2).Interior.ColorIndex = 6 'jaune
dest(2).Resize(d1.Count, 2).Borders.Weight = xlThin 'bordures
dest(2).Resize(d1.Count, 2).Sort dest, xlAscending, Header:=xlNo 'tri
End Sub
Fichier .xlsm joint, cliquer sur le bouton en G1.

A+
 

Pièces jointes

Dernière édition:
Il y avait une erreur dans la macro précédente.

La paire 1350-19110550 existe 2 fois en lignes 5 et 10.

De ce fait la somme des heures pour 19110550 (12,03) était comptée 2 fois pour le salarié 1350.

Je viens donc de corriger la 2ème boucle de la macro :
VB:
For i = 2 To UBound(tablo)
    x = tablo(i, 2) & Chr(1) & tablo(i, 3)
    If Not d2.exists(x) Then d2(x) = d1(CStr(tablo(i, 3)))
Next
 
Wahou ! Vraiment merci enooooooooooormément ! Vraiment merci merci merci , je sais que cela représente du temps.

Si je peux me permettre j'ai du coup un deuxième casse tête qui devrait peut être être plus facile pour vous.. Je me permets de vous renvoyer le fichier.

J'ai un second tableau, et dans ce tableau, je souhaite avoir la somme des heures (col1) où mes salariés (toujours les mêmes numéros) ont bossés une fois (pour le vérif , pour le salarié 1260 je dois trouver 124.5)

C'est à dire, dans ce nouveau tableau je n'ai pas le nom du salarié, mais j'ai le numéro de l'opération, et je veux la somme des heures des opérations où mon salarié a travaillé...

Je sais pas si je suis clair, en gros ce nouveau tableau dépend également de celui précédent.

Pouvez vous m'aider ? Vraiment merci infiniement !!
 

Pièces jointes

Le dernier fichier en retour avec la 2ème macro :
VB:
Sub Total_heures2()
Dim F As Worksheet, dest As Range, tablo, d1 As Object, i&, d2 As Object
Set F = Sheets("BDD") 'à adapter
Set dest = F.[P1] 'à adapter
Application.ScreenUpdating = False
If F.FilterMode Then F.ShowAllData 'si la feuille est filtrée
dest(2).Resize(F.Rows.Count - dest.Row, 2).Delete xlUp 'RAZ
'---Somme des heures par N° interv---
tablo = F.[K1].CurrentRegion
Set d1 = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(tablo)
    d1(CStr(tablo(i, 1))) = d1(CStr(tablo(i, 1))) + Val(Replace(tablo(i, 2), ",", "."))
Next
If d1.Count = 0 Then Exit Sub
'---Somme des heures par N° salarié---
tablo = F.[A1].CurrentRegion
Set d2 = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(tablo)
    d2(CStr(tablo(i, 2))) = d2(CStr(tablo(i, 2))) + d1(CStr(tablo(i, 3)))
Next
If d2.Count = 0 Then Exit Sub
'---restitution---
dest(2).Resize(d2.Count) = Application.Transpose(d2.keys) 'Transpose limitée à 65536 lignes
dest(2, 2).Resize(d2.Count) = Application.Transpose(d2.items)
dest(2).Resize(d2.Count, 2).Interior.ColorIndex = 6 'jaune
dest(2).Resize(d2.Count, 2).Borders.Weight = xlThin 'bordures
dest(2).Resize(d2.Count, 2).Sort dest, xlAscending, Header:=xlNo 'tri
End Sub
 

Pièces jointes

Vraiment JOB je te remercie.. Je n'aurai jamais réussi à faire ça.. Chapeau l"artiste !
Sais-tu comment actualiser la macro sans appuyer sur le bouton ? Histoire que les calculs soient automatisés car la bdd va être rafraichie..

Merci inifniement !
 
Bonjour sabben,

On peut se passer de boutons, voyez ce fichier (2) et cette macro évènementielle :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False 'désactive les évènements
Total_heures1
Total_heures2
Application.EnableEvents = True 'réactive les évènements
End Sub
A+
 

Pièces jointes

- 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
Retour