Somme sur plusieurs paramètres

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
 

job75

XLDnaute Barbatruc
Bonjour sabben, bienvenue sur XLD,

Plutôt qu'une image vous auriez pu joindre le fichier Excel non ?

Voyez le fichier joint, notez la formule matricielle en I2, à tirer vers la droite.

A+
 

Pièces jointes

  • Classeur(1).xlsx
    16.7 KB · Affichages: 12

djidji59430

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

sabben

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

  • TEST.xlsx
    317.1 KB · Affichages: 10

job75

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

  • TEST(1).xlsm
    58.8 KB · Affichages: 6
Dernière édition:

job75

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

sabben

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

  • testforum.xlsm
    57.5 KB · Affichages: 2

job75

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

  • testforum(1).xlsm
    63.7 KB · Affichages: 14

sabben

XLDnaute Nouveau
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 !
 

job75

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

  • testforum(2).xlsm
    60.5 KB · Affichages: 10

Discussions similaires

Statistiques des forums

Discussions
312 780
Messages
2 092 048
Membres
105 169
dernier inscrit
izarabooki