Problème somme entre plusieurs plages

Bonjour le forum,

Sur le fichier Excel joint, j'ai un bouton qui me permet de lister l'objectif écrit dans la cellule C10 dans les différentes plages de la colonne B ("objectif").

Le processus commence à partir de la plage horaire correspondant à l'heure actuelle, puis se termine à la plage horaire de fin de poste prévue, sélectionnée par l'utilisateur dans la cellule D13.

Dans l'exemple ci-joint, j'ai un objectif global de 2 388. Lorsque je lance le code et que le début et la fin de poste sont dans le même poste (matin, après-midi, nuit), la somme totale calculée est bien de 2 388.

Cependant, si la période couvre deux postes différents, le code me retire l'équivalent d'une plage horaire d'objectif. Par exemple, si c'est de 11h-12h à 20h-21h (donc matin et après-midi), je n'obtiens pas la somme de 2 388 dans la colonne B objectif par heure.

voici le fichier :

19test.xlsm (32.40 Ko)
image

Voici le code :

Sub RepartirObjectif()
    Dim ws As Worksheet
    Dim heureActuelle As Date
    Dim finPoste As String
    Dim objectif As Double
    Dim heureDebut As Range
    Dim heureFin As Range
    Dim heure As Range
    Dim heuresValides As Integer
    Dim objectifParHeure As Double
    Dim reliquat As Double
    Dim heureDebutStr As String
    Dim heureFinStr As String
    Dim heureDebutTime As Date
    Dim heureFinTime As Date
    Dim cellulesValides As Collection
    Set cellulesValides = New Collection

    ' Initialisation des variables
    Set ws = ThisWorkbook.Sheets("Dashboard")
    heureActuelle = TimeValue(Now)
    finPoste = ws.Range("D13").Value
    objectif = ws.Range("C10").Value

    ws.Range("B18:B24,B31:B38,B45:B53").ClearContents

    ' Trouver l'heure de début en fonction de l'heure actuelle
    For Each heure In ws.Range("A18:A24,A31:A38,A45:A53")
        heureDebutStr = Trim(Split(heure.Value, "-")(0))
        heureFinStr = Trim(Split(heure.Value, "-")(1))

        If IsNumeric(Replace(heureDebutStr, "h", "")) And IsNumeric(Replace(heureFinStr, "h", "")) Then
            heureDebutTime = TimeSerial(CInt(Replace(heureDebutStr, "h", "")), 0, 0)
            heureFinTime = TimeSerial(CInt(Replace(heureFinStr, "h", "")), 0, 0)

            If heureActuelle >= heureDebutTime And heureActuelle < heureFinTime Then
                Set heureDebut = heure.Offset(0, 1)
                Exit For
            End If
        End If
    Next heure

    ' Vérifier si heureDebut a été définie
    If heureDebut Is Nothing Then
        MsgBox "L'heure de début n'a pas pu être déterminée. Veuillez vérifier les plages horaires."
        Exit Sub
    End If

    ' Trouver l'heure de fin en fonction de la fin de poste
    For Each heure In ws.Range("A18:A24,A31:A38,A45:A53")
        If heure.Value = finPoste Then
            Set heureFin = heure.Offset(0, 1)
            Exit For
        End If
    Next heure

    ' Vérifier si heureFin a été définie
    If heureFin Is Nothing Then
        MsgBox "L'heure de fin n'a pas pu être déterminée. Veuillez vérifier la fin de poste sélectionnée."
        Exit Sub
    End If

    ' Collecter les cellules valides (non vides en colonne A)
    Dim currentRange As Range
    Set currentRange = ws.Range(heureDebut, heureFin)

    For Each heure In currentRange
        If Not IsEmpty(heure.Offset(0, -1).Value) Then
            cellulesValides.Add heure
        End If
    Next heure

    ' Calculer l'objectif par cellule valide
    heuresValides = cellulesValides.Count
    If heuresValides = 0 Then
        MsgBox "Aucune cellule valide trouvée pour la répartition de l'objectif."
        Exit Sub
    End If
    objectifParHeure = objectif / heuresValides
    reliquat = objectif - (Int(objectifParHeure) * heuresValides)

    ' Répartir l'objectif dans les cellules valides
    For Each heure In cellulesValides
        heure.Value = Int(objectifParHeure)
    Next heure

    ' Ajouter le reliquat à la première cellule valide
    If cellulesValides.Count > 0 Then
        cellulesValides(1).Value = cellulesValides(1).Value + reliquat
    End If

    MsgBox "Objectif réparti avec succès !"
End Sub

Merci d'avance pour votre aide,

Cordialement,

Bonsoir,

Ne serait-ce pas dû à un décalage, dans ce cas il faut le remettre ici:

image

Cdlt

Bonjour Arturo,

J'ai fais ça, mais non ça ne fonctionne pas, ça me décale les lignes.

Voici ce que j'ai :

image

Cordialement,

Bonjour,

En regardant de plus près, l'erreur vient du fait que le nombre d'heures calculé n'est pas bon, il faut retrancher 1 heure.

De plus, modifiez vos formules de la colonne C, il faut remplacer le résultat "" par 0, exemple:

=SI(B19="";0;C18+B19)

Cdlt

Arturo,

Merci beaucoup, oui c'est aussi meilleur comme ça pour la colonne C, merci.

Cdlt,

Re bonjour,

J’ai remarqué que, lorsque l’objectif est lissé sur les trois postes (matin, après-midi et nuit), la somme affichée dans la colonne B est inférieure au besoin réel (cellule C10).

Pouvez-vous essayer de voir ce problème svp ?

Cdlt,

Bonjour,

"J’ai remarqué que, lorsque l’objectif est lissé sur les trois postes (matin, après-midi et nuit), la somme affichée dans la colonne B est inférieure au besoin réel (cellule C10)". Pourriez-vous me fournir un ou des exemples concrets?

Rechercher des sujets similaires à "probleme somme entre plages"