XL 2021 Moyenne par code et par mois

NLSCt

XLDnaute Nouveau
Bonjour,
J'ai un fichier Excel qui regroupe les heures par mois et par codes affaires (je mets un exemple en PJ)
Le fichier original contient une trentaine de noms donc de feuille, en final j'ai une feuille Bilan qui comptabilise toutes les heures
J'aurai souhaité répartir (avec si possible par pourcentage) les heures de "BOB et MARCEL, EMILE et les 30 autres personnes" sur Daniel en fonction des codes affaires par mois.
Dans l'exemple j'ai mis janvier et février mais les feuilles ont le calendrier complet jusqu'à décembre. en bout le chaque feuille le total des heures par mois, qui est récupérer sur la feuille Bilan en fonction des noms des onglets.
merci d'avance
Cdlt
 

Pièces jointes

  • MOYENN.xlsm
    16 KB · Affichages: 12
Solution
Bonsoir NLSCt, bienvenue sur XLD,

Voyez le fichier joint et cette fonction VBA :
VB:
Function SommeH(Feuille$, Affaire$, Tmois$)
Application.Volatile
Dim mois As Byte, lig&, col%
mois = Month("1/" & Tmois)
On Error Resume Next
With Sheets(Feuille)
    lig = Application.Match(Affaire, .Columns(1), 0)
    For col = 2 To .Cells(2, .Columns.Count).End(xlToLeft).Column
        If IsDate(.Cells(2, col)) Then _
            If Month(.Cells(2, col)) = mois Then _
                If IsNumeric(.Cells(lig, col)) Then SommeH = SommeH + .Cells(lig, col)
    Next
End With
End Function
Le code doit être placé impérativement dans un module standard.

Formule en Bilan!B3 à adapter pour chaque mois =SommeH($A3;B$2;$A$1)

Attention, mettez...

job75

XLDnaute Barbatruc
Bonsoir NLSCt, bienvenue sur XLD,

Voyez le fichier joint et cette fonction VBA :
VB:
Function SommeH(Feuille$, Affaire$, Tmois$)
Application.Volatile
Dim mois As Byte, lig&, col%
mois = Month("1/" & Tmois)
On Error Resume Next
With Sheets(Feuille)
    lig = Application.Match(Affaire, .Columns(1), 0)
    For col = 2 To .Cells(2, .Columns.Count).End(xlToLeft).Column
        If IsDate(.Cells(2, col)) Then _
            If Month(.Cells(2, col)) = mois Then _
                If IsNumeric(.Cells(lig, col)) Then SommeH = SommeH + .Cells(lig, col)
    Next
End With
End Function
Le code doit être placé impérativement dans un module standard.

Formule en Bilan!B3 à adapter pour chaque mois =SommeH($A3;B$2;$A$1)

Attention, mettez les noms des mois en minuscules car il ne faut pas oublier les accents.

A+
 

Pièces jointes

  • MOYENN.xlsm
    24.2 KB · Affichages: 5
Dernière édition:

gbinforme

XLDnaute Impliqué
Bonjour,
Je ne suis pas sûr d'avoir compris ta demande mais je t'ai fait une procédure qui te constitue ton bilan des autres feuilles par mois et code affaire.
Je n'ai pas compris quel pourcentage tu souhaites mais à partir de ce tableau tu peux l'avoir sans doute si tu précise ta demande.
 

Pièces jointes

  • MOYENN.xlsm
    26.6 KB · Affichages: 2

job75

XLDnaute Barbatruc
Bonjour NLSCt, gbinforme, le forum,

Une solution avec une liste de validation en Bilan!A1 :
VB:
Private Sub Worksheet_Activate()
Worksheet_Change [A1] 'lance la macro
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, [A1]) Is Nothing Then Exit Sub
Dim mois As Byte, lig&, col%, w As Worksheet, i&, j As Variant, k%, s#
Application.ScreenUpdating = False
Rows("2:" & Rows.Count).ClearContents 'RAZ
If Not IsDate("1/" & [A1]) Then Exit Sub
mois = Month("1/" & [A1])
lig = 3: col = 2
For Each w In Worksheets
    If IsDate(w.Range("B2")) Then
        Cells(lig, 1) = w.Name
        For i = 3 To w.Cells(w.Rows.Count, 1).End(xlUp).Row
            If w.Cells(i, 1) <> "" Then
                j = Application.Match(w.Cells(i, 1), Rows(2), 0)
                If IsError(j) Then Cells(2, col) = w.Cells(i, 1): j = col: col = col + 1
                s = 0
                For k = 2 To w.Cells(2, w.Columns.Count).End(xlToLeft).Column
                    If IsDate(w.Cells(2, k)) Then _
                        If Month(w.Cells(2, k)) = mois Then _
                            If IsNumeric(w.Cells(i, k)) Then s = s + w.Cells(i, k)
                Next k
                Cells(lig, j) = s
            End If
        Next i
        lig = lig + 1
    End If
Next w
Application.DisplayAlerts = False
Rows(1).UnMerge 'défusionne
[B1].Resize(, Columns.Count - 1).Clear 'RAZ à droite
Rows(1).Resize(, col - 1).Merge 'fusionne
Rows(2).HorizontalAlignment = xlCenter 'centrage
Rows(2).VerticalAlignment = xlCenter
End Sub
Le code s'exécute quand on modifie ou valide A1 ou qu'on active la feuille.

A+
 

Pièces jointes

  • MOYENN.xlsm
    26.5 KB · Affichages: 4

NLSCt

XLDnaute Nouveau
Les formules fonctionnent parfaitement, mais, je reste avec mon soucis de répartition des heures pour Daniel. Daniel par exemple travail, que sur certains codes affaires (exemple 00-014 et 00-020) est il possible de lui répartir les heures des autres salariés (BOB EMILE et MARCEL). Une règle de 3 ne fonctionne pas puisque Daniel travail lui 7.75 par jour et qu'il faut répartir les heures des codes (ou Daniel travail) des autres salariés sur son temps de travail, en espérant avoir était assez clair !!.
merci
 

Pièces jointes

  • MOYENN.xlsm
    16.1 KB · Affichages: 4

Discussions similaires

Réponses
21
Affichages
599

Statistiques des forums

Discussions
313 296
Messages
2 096 923
Membres
106 787
dernier inscrit
Rachid ALIOU