Compter le nombre d'heures/jour d'une plage horaire de plusieurs jours

Bonjour à tous, je suis JP et c'est ma première sur ce forum. Je viens vous demander de l'aide par rapport à un problème simple mais dont la solution n'est pas évidente (pour moi en tout cas :) ).

Si je vulgarise, je demande à mes employés de noter les heures sur lesquelles ils travaillent sur une production (ça peut aller de quelques minutes à plusieurs jours) d'un produit X.

Exemple:

image

" Ici 3 plages horaires, dont certaines qui chevauchent 2 jours différents"

Ensuite, j'aimerais que dans un autre tableau, soit regroupé le nombre d'heure(s) par jour consacrée(s) à la fabrication du produit.

Ici je vous ai pris un exemple assez simple que je remplis à la main, mais j'aimerais trouver la bonne formule (ou passer par une macro si il le faut) pour pouvoir compléter de la manière la plus automatisée la colonne Nombre d'heures travaillées / jour. Car la difficulté est qu'il y a plusieurs plages horaires, qu'une plage horaire peut chevaucher plusieurs jours, qu'il y a des discontinuités entre les plages, etc...

Pour le moment je n'ai trouver aucune vraie piste... j'en suis désolé ... Le problème est simple mais je n'ai pas encore trouvé de solution sans passer par des "usines à gaz".

Vous trouverez le fichier en PJ même si il vous apportera pas grand chose ...

Merci pour votre aide

JP

Salut,

Je te propose une première solution par macro. Dans le fichier ci-joint, si tu modifies une donnée des colonnes A et B, les résultats en colonnes E et F sont actualisés à chaque fois.

Si ce premier jet te convient, on peut approfondir la chose, revoir la mise en forme, corriger les erreurs que tu pourrais trouver à l'utilisation, ne pas afficher les jours qui auraient 0:00 heures, etc.

Cordialement.

Merci !!! pardonne moi l'expression mais tu es le prince de la ville !

J'ai testé 2/3 configurations "spéciales" ça à l'air de bien fonctionner.

Je te remercie pour ta proposition d'accompagnement, mais tu m'as déjà bien aidé, maintenant à moi de me débrouiller pour peaufiner quelques détails si besoin.

Sub Worksheet_Change(ByVal Target As Range)
    Dim PremDate As Long, DerDate As Long, i As Long, j As Integer, Compteur As Byte, Compteur_Jour
    Dim FeuilleDeTemps As Worksheet, DataTRS As Worksheet

    Set FeuilleDeTemps = ThisWorkbook.Worksheets("Feuille de temps")
    Set DataTRS = ThisWorkbook.Worksheets("Data TRS")

    If Not Intersect(Target, FeuilleDeTemps.Range("B12:D51")) Is Nothing Then

        Application.EnableEvents = False

        DataTRS.Range("E12:F51").ClearContents

        PremDate = Int(FeuilleDeTemps.Range("B12"))
        DerDate = Int(FeuilleDeTemps.Range("D51"))
        Compteur = 12

        For i = PremDate To DerDate
            DataTRS.Range("E" & Compteur) = PremDate + Compteur - 12
            For j = 12 To 51
                If Int(FeuilleDeTemps.Range("B" & j)) * 1 = DataTRS.Range("E" & Compteur) And Int(FeuilleDeTemps.Range("D" & j)) * 1 = DataTRS.Range("E" & Compteur) Then
                    Compteur_Jour = Compteur_Jour + FeuilleDeTemps.Range("E" & j)
                ElseIf Int(FeuilleDeTemps.Range("B" & j)) * 1 = DataTRS.Range("E" & Compteur) And Int(FeuilleDeTemps.Range("D" & j)) * 1 > DataTRS.Range("E" & Compteur) Then
                    Compteur_Jour = Compteur_Jour + 1 - (FeuilleDeTemps.Range("B" & j) - Int(FeuilleDeTemps.Range("B" & j)))
                ElseIf Int(FeuilleDeTemps.Range("B" & j)) * 1 < DataTRS.Range("E" & Compteur) And Int(FeuilleDeTemps.Range("D" & j)) * 1 = DataTRS.Range("E" & Compteur) Then
                    Compteur_Jour = Compteur_Jour + FeuilleDeTemps.Range("D" & j) - Int(FeuilleDeTemps.Range("D" & j))
                End If
            Next j
            DataTRS.Range("F" & Compteur) = Compteur_Jour
            Compteur = Compteur + 1
            Compteur_Jour = 0
        Next i

        DataTRS.Columns("E:E").NumberFormat = "dd/mm/yyyy;@"
        DataTRS.Columns("F:F").NumberFormat = "[h]:mm"

        Application.EnableEvents = True

    End If

End Sub
Re-bonjour,

La solution de Yvouille fonctionne parfaitement, c'est exactement ce que je recherchais.

J'ai bien étudié le code, j'ai fait des modifs, cependant lorsque je souhaites transposer le code à mon fichier (qui est un peu différent) je n'arrive pas à refaire fonctionner la macro.

Je vous mets en PJ le fichier. La grande différence et que les heures de débuts/fins se trouvent sur une autre feuille et que les deux colonnes sont séparées par une colonne tiers.

Si ça peut faciliter l'écriture de la macro, cette dernière n'est pas obligé de se réaliser dès qu'une cellule est modifié.

C'est à dire que l'utilisateur rentre toutes ses heures de débuts/fin et une fois qu'il a fini, il lance à la main la macro qui va venir faire son job.

Pourquoi je dis ça, c'est qu'à coté j'ai une autre macro (qui appelle plein de petites macros que j'ai faites) que l'utilisateur lance manuellement lorsqu'il a fini de rentrer toutes ses heures pour en gros "Archiver" la feuille de temps. Donc au lieu de faire tourner la macro dès qu'une modification est faites, je peux la faire tourner qu'une fois à la fin

Salut,

Ca aurait été plus simple de fournir de suite le bon fichier. Je m'occupe de cela au plus tard demain soir.

Chaleureusement.

Tu as raison, j'avais préféré simplifier le problème pour être sur de toucher un public plus large persuadé que la solution serait une petite bidouille "assez" simple et non une macro avec un certain degré de difficulté...

Re,

Tu as quand même un peu joué à l'apprenti-sorcier lorsque tu as modifié ce code ; il y a beaucoup de choses approximatives et donc incorrectes. Et je trouve dommage que je t'ai fournis des parties de code bien précises que tu as transformées et ''machins'' vaguement ressemblants. Par exemple ''For j = 12 To .Range("D" & Rows.Count).End(xlUp).Row" transformé en "For j = 12 To 51"

Puisque tu as les saisies sur une feuille et les résultats sur une autre feuille, je te propose d'actualiser ces résultats à l'activation de la feuille "Data TRS". Voir le fichier ci-joint. Ainsi ces résultats seront toujours actualisés au bon moment.

Lorsque tu travailles sur deux feuilles mais que l'une des deux est active, les instructions du genre "Range("A1")" font référence à la feuille active par défaut. Tu n'as donc pas besoin de préciser de quelle feuille il s'agit. A l'activation de la feuille "Data TRS", tu peux donc faire référence à cette feuille par défaut.

Et je trouve plus facile de faire référence à une autre feuille avec l'instruction ''With Sheets("xxx")/End with" qu'avec l'instruction ''Set". Il suffit alors d'inscrire devant une référence un . et le tour est joué. Par exemple dans cet exemple, ".Range("A1")" concerne la cellule A1 de la feuille "xxx".

A te relire.

bonjour J_P Herbien, Yvouille,

une solution avec un dictionnaire

Je vous remercie pour vos réponses rapides. Même si ta réponse était plutôt correcte BsAlv, j'ai préféré prendre la macro de Yvouille qui était plus adaptée à mon cas.

Et pour info, Yvouille ta macro est parfaite, seule petit bémol, lorsqu'une plage horaire couvre une journée entière, le résultat affiché est 00:00 au lieu de 24:00

Exemple:

Heure de début: 04/05/23 22:00

Heure de fin : 06/05/23 2:00

Durée: 28:00

04/05/23 : 2:00

05/05/23 : 00:00 (au lieu de 24:00)

06/05/23 : 2:00

Salut J-P,

Je pense que tu te trompes. Sur le fichier que je t'ai fourni, les jours entiers sont bien indiqués par 24:00.

image

Maintenant, si tu travailles sur un autre fichier, à toi de voir d'où vient le problème.

Avec l'instruction Columns("B:B").NumberFormat = "[h]:mm" que j'ai placé sur mon fichier, ça fonctionne.

Montre-moi ton fichier réel et je t'aide à résoudre ton problème.

Amicalement.

bonjour J_P Herbien, Yvouille,

moi, j'avais déjà multiplié le résultat avec 24 pour avoir des "heures", donc si on enlève cela et on utilise aussi le format "[h]:mm" ... et pour le reste, on n'avait à adapter la plage dans aA = Sheets("Feuille de temps").Range("B12:D51").Value2

Yvouille,

En effet dans ton exemple, cela a marché car la plage du 07/05 était découpée en deux dans "Feuille de temps".

Mais dans le cas où la plage couvre la journée entière (commence J-1 et fini J+1), alors le résultat affiché est de 0. J'ai repris ton fichier pour faire l'exemple ci-dessous. (voir journée du 07/05/2023).

image image

Salut,

Je n'avais pas pensé à cette constellation. J'ai donc ajouté une condition à la macro.

Cordialement.

Bonjour à tous,

Je tarde un peu à répondre mais j'aimerais vous remercier tout le monde pour m'avoir aidé à résoudre le sujet et tout particulièrement Yvouille !

Bonne journée à vous amateur d'Excel / VBA

Rechercher des sujets similaires à "compter nombre heures jour plage horaire jours"