Microsoft 365 Calcul de plages horaires

NONO14

XLDnaute Impliqué
Bonsoir,
Dans le fichier exemple ci-joint et dans la feuille Tab_Pointage il y a un tableau (t_Saisie) dans lequel se trouvent des heures.
Dans la colonne 12 je souhaite avoir le total des heures par plage mais uniquement si la plage est complète.
Par exemple H1 et H2 complètes alors H2-H1, mais si il y H3 mais que H4 est vide alors ne calculer que la 1ère plage.
J'ai créé un code pour faire le calcul, mais si il manque un horaire dans une plage le calcul ne fonctionne pas.
Pouvez-vous m'aider à résoudre ce problème s'il vous plaît ?
Je vous en remercie par avance

VB:
Sub CalculerTotalHeures()
    Dim Ws As Worksheet
    Dim Tbl As ListObject
    Dim Cell As Range
    Dim TotalHeures As Double
    Dim Start1 As Variant, Dep1 As Variant
    Dim Start2 As Variant, Dep2 As Variant
    Dim Start3 As Variant, Dep3 As Variant
    
    ' Définir la feuille et le tableau structuré
    Set Ws = Sheets("Tab_Pointage")
    Set Tbl = Ws.ListObjects("t_Saisie") ' Nom du tableau structuré
    
    
    ' Parcourir chaque ligne du tableau structuré
    For Each Cell In Tbl.ListColumns(1).DataBodyRange
        TotalHeures = 0
        ' Récupérer les heures des différentes colonnes
        Start1 = Cell.Offset(0, 5).Value
        Dep1 = Cell.Offset(0, 6).Value
        Start2 = Cell.Offset(0, 7).Value
        Dep2 = Cell.Offset(0, 8).Value
        Start3 = Cell.Offset(0, 9).Value
        Dep3 = Cell.Offset(0, 10).Value
        
        ' Calculer les heures si les plages sont complètes
        If IsNumeric(Start1) And IsNumeric(Dep1) Then
            TotalHeures = TotalHeures + (Dep1 - Start1)
        End If
        
        If IsNumeric(Start2) And IsNumeric(Dep2) Then
            TotalHeures = TotalHeures + (Dep2 - Start2)
        End If
        
        If IsNumeric(Start3) And IsNumeric(Dep3) Then
            TotalHeures = TotalHeures + (Dep3 - Start3)
        End If

        ' Afficher le résultat dans la colonne 12
        Cell.Offset(0, 11).Value = TotalHeures
    Next Cell
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
CalculerTotalHeures
End Sub
 

Pièces jointes

  • Classeur1.xlsm
    18.5 KB · Affichages: 5

TooFatBoy

XLDnaute Barbatruc
Bonjour,

Une proposition :
VB:
Sub CalculerTotalHeures()
'
Dim Cell As Range
Dim TotalHeures As Double
Dim Start1, Dep1, Start2, Dep2, Start3, Dep3

    ' Parcourir chaque ligne du tableau structuré
    For Each Cell In Range("t_Saisie[Code agent]")
        TotalHeures = 0
        ' Récupérer les heures des différentes colonnes
        Start1 = Cell.Offset(0, 5).Value
        Dep1 = Cell.Offset(0, 6).Value
        Start2 = Cell.Offset(0, 7).Value
        Dep2 = Cell.Offset(0, 8).Value
        Start3 = Cell.Offset(0, 9).Value
        Dep3 = Cell.Offset(0, 10).Value
        ' Calculer les heures si les plages sont complètes
        If Start1 <> "" And Dep1 <> "" Then TotalHeures = TotalHeures + (Dep1 - Start1)
        If Start2 <> "" And Dep2 <> "" Then TotalHeures = TotalHeures + (Dep2 - Start2)
        If Start3 <> "" And Dep3 <> "" Then TotalHeures = TotalHeures + (Dep3 - Start3)
        ' Afficher le résultat dans la colonne 12
        Cell.Offset(0, 11).Value = TotalHeures
    Next Cell

End Sub

et une autre version :
VB:
Sub CalculerTotalHeures()
'
Dim LigneDuTS As Long
Dim TotalHeures As Double
Dim Deb1, Fin1, Deb2, Fin2, Deb3, Fin3

    ' Parcourir chaque ligne du tableau structuré
    For LigneDuTS = 1 To Range("t_Saisie[TOTAL du Jour]").Count

        ' Récupérer les heures des différentes colonnes
        Deb1 = Range("t_Saisie[Heure d''arrivée 1]")(LigneDuTS).Value2
        Fin1 = Range("t_Saisie[Heure de départ 1]")(LigneDuTS).Value2
        Deb2 = Range("t_Saisie[Heure d''arrivée 2]")(LigneDuTS).Value2
        Fin2 = Range("t_Saisie[Heure de départ 2]")(LigneDuTS).Value2
        Deb3 = Range("t_Saisie[Heure d''arrivée 3]")(LigneDuTS).Value2
        Fin3 = Range("t_Saisie[Heure de départ 3]")(LigneDuTS).Value2

        ' Calculer les heures si les plages sont complètes
        TotalHeures = 0
        If Deb1 <> "" And Fin1 <> "" Then TotalHeures = TotalHeures + (Fin1 - Deb1)
        If Deb2 <> "" And Fin2 <> "" Then TotalHeures = TotalHeures + (Fin2 - Deb2)
        If Deb3 <> "" And Fin3 <> "" Then TotalHeures = TotalHeures + (Fin3 - Deb3)

        ' Afficher le résultat dans la colonne "TOTAL du Jour"
        Range("t_Saisie[TOTAL du Jour]")(LigneDuTS).Value2 = TotalHeures

    Next LigneDuTS

End Sub


1- Est-il vraiment nécessaire de calculer toute la colonne ?

2- Ta colonne "Date" est du texte. :(
 
Dernière édition:

NONO14

XLDnaute Impliqué
Bonjour,

Une proposition :
VB:
Sub CalculerTotalHeures()
'
Dim Cell As Range
Dim TotalHeures As Double
Dim Start1, Dep1, Start2, Dep2, Start3, Dep3

    ' Parcourir chaque ligne du tableau structuré
    For Each Cell In Range("t_Saisie[Code agent]")
        TotalHeures = 0
        ' Récupérer les heures des différentes colonnes
        Start1 = Cell.Offset(0, 5).Value
        Dep1 = Cell.Offset(0, 6).Value
        Start2 = Cell.Offset(0, 7).Value
        Dep2 = Cell.Offset(0, 8).Value
        Start3 = Cell.Offset(0, 9).Value
        Dep3 = Cell.Offset(0, 10).Value
        ' Calculer les heures si les plages sont complètes
        If Start1 <> "" And Dep1 <> "" Then TotalHeures = TotalHeures + (Dep1 - Start1)
        If Start2 <> "" And Dep2 <> "" Then TotalHeures = TotalHeures + (Dep2 - Start2)
        If Start3 <> "" And Dep3 <> "" Then TotalHeures = TotalHeures + (Dep3 - Start3)
        ' Afficher le résultat dans la colonne 12
        Cell.Offset(0, 11).Value = TotalHeures
    Next Cell

End Sub

et une autre version :
VB:
Sub CalculerTotalHeures()
'
Dim LigneDuTS As Long
Dim TotalHeures As Double
Dim Deb1, Fin1, Deb2, Fin2, Deb3, Fin3

    ' Parcourir chaque ligne du tableau structuré
    For LigneDuTS = 1 To Range("t_Saisie[TOTAL du Jour]").Count

        ' Récupérer les heures des différentes colonnes
        Deb1 = Range("t_Saisie[Heure d''arrivée 1]")(LigneDuTS).Value2
        Fin1 = Range("t_Saisie[Heure de départ 1]")(LigneDuTS).Value2
        Deb2 = Range("t_Saisie[Heure d''arrivée 2]")(LigneDuTS).Value2
        Fin2 = Range("t_Saisie[Heure de départ 2]")(LigneDuTS).Value2
        Deb3 = Range("t_Saisie[Heure d''arrivée 3]")(LigneDuTS).Value2
        Fin3 = Range("t_Saisie[Heure de départ 3]")(LigneDuTS).Value2

        ' Calculer les heures si les plages sont complètes
        TotalHeures = 0
        If Deb1 <> "" And Fin1 <> "" Then TotalHeures = TotalHeures + (Fin1 - Deb1)
        If Deb2 <> "" And Fin2 <> "" Then TotalHeures = TotalHeures + (Fin2 - Deb2)
        If Deb3 <> "" And Fin3 <> "" Then TotalHeures = TotalHeures + (Fin3 - Deb3)

        ' Afficher le résultat dans la colonne "TOTAL du Jour"
        Range("t_Saisie[TOTAL du Jour]")(LigneDuTS).Value2 = TotalHeures

    Next LigneDuTS

End Sub


Est-il vraiment nécessaire de calculer toute la colonne ?
Merci TooFatBoy. C'est la ligne qu'il faut calculer pas la colonne.
 

NONO14

XLDnaute Impliqué
Oui, ça n'empêche pas le fonctionnement. C'est juste que ça calcule toute la colonne, peut-être pour rien.
Ok. Ce que je cherche c'est le calcul de la ligne, si toutes les plages sont complètes. Je pense que tu l'as compris. Ceci pour avoir un total d'heure journalier et qui cumulé nous donnera un total semaine et que l'on pourra comparer au contrat horaires de l'agent, afin de calculer les heures supplémentaires ou plus souvent des heures de récupération.
 

Phil69970

XLDnaute Barbatruc
Re

TFB

Moi j'ai compris que si la ligne n'est pas complète on ne calcule pas .
Dans la colonne 12 je souhaite avoir le total des heures par plage mais uniquement si la plage est complète.
Et pour la plage j'ai lu ceci
Par exemple H1 et H2 complètes alors H2-H1, mais si il y H3 mais que H4 est vide alors ne calculer que la 1ère plage.
J'en ai déduit et compris que la plage c'est la ligne mais j'ai peut être rien compris

Après le demandeur à peut être changer les données du problème mais j'avoue j'en suis resté au post de départ
Après il suffit de changer les valeurs pour avoir les valeurs que le demandeur veux avoir !!!
 

TooFatBoy

XLDnaute Barbatruc
Moi j'ai compris que si la ligne n'est pas complète on ne calcule pas .
OK.


Nono14 à dit:
Par exemple H1 et H2 complètes alors H2-H1, mais si il y H3 mais que H4 est vide alors ne calculer que la 1ère plage.
J'en ai déduit et compris que la plage c'est la ligne mais j'ai peut être rien compris
Moi je comprends qu'il y a trois plages : H1 et H2, H3 et H4, H5 et H6.
Et je comprends qu'il faut calculer chacune de ces trois plages si elle est complète, et ensuite faire la somme des plages calculées. ;)
 

NONO14

XLDnaute Impliqué
Re

TFB

Moi j'ai compris que si la ligne n'est pas complète on ne calcule pas .

Et pour la plage j'ai lu ceci

J'en ai déduit et compris que la plage c'est la ligne mais j'ai peut être rien compris

Après le demandeur à peut être changer les données du problème mais j'avoue j'en suis resté au post de départ
Après il suffit de changer les valeurs pour avoir les valeurs que le demandeur veux avoir !!!
Chaque plages à une arrivée et un départ. Il ne faut donc calculer que les plages complètes. Les autres sont ignorées temps qu'elles ne sont pas complétées.
Réponse depuis mon téléphone
 

Discussions similaires

Réponses
1
Affichages
399
Réponses
0
Affichages
317

Statistiques des forums

Discussions
314 720
Messages
2 112 187
Membres
111 457
dernier inscrit
anglade