XL 2021 Moyenne par code et par mois

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 !

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

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

Dernière édition:
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

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

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

- 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

Discussions similaires

Réponses
12
Affichages
431
Réponses
11
Affichages
419
  • Question Question
Microsoft 365 Erreur code Vba
Réponses
21
Affichages
890
Retour