Formule NB à condition que la donnée soit consécutive.

Bonjour,
https://mon-partage.fr/f/iESzWcrE/

j'ai un blocage sur un fichier excel de suivi des absences.
c'est un planning sur lequel les jours d'absence sont renseignés sur l'année entière. (colonne D à NE)
lorsqu'une personne est absente le jeudi 10.4.2020 nous renseignons un "1" dans la cellule de ce jour. )les cellules ou pas d'absence sont vides)

en fin d'année nous devons savoir le nombre d'arrêt dans les celulles (colonne NN à NY du tableau).
de 1 à 3 jours ,
puis de 4 à 8 jours
, puis de 9 à 21 jours
et enfin supérieurs à 21 jours.

Il me faudrait donc une formule qui me permettrait de savoir combien de fois le salarié a été absent de 1 à 3 jours dans l'année et ainsi de suite.

exemple si Mr DUPONT a été absent 5 fois 2 jours dans l'année, il faudrait que le résultat de la formule pour les arrêts de 1 à 3 jours soit =5
puis s'il a été absent 2 fois 25 jours, le résultat pour les arrêt supérieurs à 21 jours doit être = 2...

ça à l'air difficile à réaliser mais je tente quand même...
d'avance merci.

5 réponses

  1. Contributeur
    Bonjour à tous,

    oui, en l'état, par formule ça risque d'être plutôt à rallonge.

    Une fonction personnalisée à mettre dans un module standard :
    Function nbArret(plage As Range)
        Dim datas, col As Long, result(1 To 1, 1 To 4) As Long, nb As Long, ok As Boolean
        datas = plage.Value
        'nb = datas(1, 1)
        For col = 1 To UBound(datas, 2)
            If datas(1, col) = 1 Then
                nb = nb + 1
            Else
                If nb > 0 Then ok = True
            End If
            ok = ok Or col = UBound(datas, 2)
            If ok And nb > 0 Then
                Select Case nb
                    Case 1 To 3
                        result(1, 1) = result(1, 1) + 1
                    Case 4 To 8
                        result(1, 2) = result(1, 2) + 1
                    Case 9 To 21
                        result(1, 3) = result(1, 3) + 1
                    Case Else
                        result(1, 4) = result(1, 4) + 1
                End Select
                nb = 0: ok = False
            End If
        Next col
        nbArret = result
    End Function


    Pour inscrire la formule sur la feuille :
    - soit tu sélectionnes les 4 cellules résultats et :
    =nbArret(D6:NE6)

    Formule matricielle à valider avec Shift+Ctrl+Entrée
    La formule doit s'entourer de { } si la validation est correcte.
    Voir NN6:NQ6

    - soit tu sélectionnes une seule cellule et tu choisis la colonne du résultat voulu (de 1 à 4) avec Index() et :
    =INDEX(nbArret(D7:NE7);;1)

    Ca fait 4 appels à la fonction au lieu d'un, mais vu ton fichier ça ne devrait pas être gênant.
    https://www.cjoint.com/c/JDmifEIJNFV
    eric
    0
    1. Contributeur
      Bonjour
      le plus simple pour éviter du VBA serait d'incrémenter dans votre tableau les jours successifs d'absence:
      1 pour le premier jour, 2 pour le 2° 3 pur le 3° etc.. et recommencer à 1 pour chaque période
      ainsi on peut compter le calcul des jours uniquement par les valeurs NUM et les groupes par NB.SI.
      crdlmnt
      0
      1. Contributeur
        Bonjour Vaucluse, bonjour Ibraoc.

        "ça à l'air difficile à réaliser" : Tu as raison, je ne pense pas qu'on puisse trouver une solution sans VBA ; d'après moi seule une macro pourrait effectuer ces calculs.
        0
        1. Contributeur
          bonjour
          sans garantie de la solution, pour partager le classeur, ici par exemple:
          http://mon-partage.fr
          et revenez coller le lien créé sur le site
          ajoutez si besoin quelques explications dans le fichier
          crdlmnt
          1