Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL pour MAC Afficher la somme de valeurs uniquement dans des cellules adjacentes en lignes

FRANKY92

XLDnaute Nouveau
Bonjour les champions
J'ai un tableau dans lequel sur chaque ligne figure un nom de salarié,ses jours de congés,de RTT, de récupération, de maladie, ou autre.
Je veux savoir lesquels de ces salariés ont bénéficié d'un minimum de 10 jours de congés CONSÉCUTIFS, en excluant ceux qui peuvent être indiqués ça et là.
Peut-on obtenir de sous totaux des lignes ?
Si mon explication ne suffit pas, me demander un tableau type.
Et ça urge .....merci d'avance
 

job75

XLDnaute Barbatruc
Une solution par fonction VBA dans le fichier joint :
VB:
Function NbJoursConsecutifs(Plage As Range, N%)
Dim critere$, pc%, i%, test As Byte, deb%, j%
critere = "#CP#REP#RTT#" 'à adapter
pc = Plage.Count
For i = 1 To pc
    test = InStr(critere, "#" & UCase(Plage(i)) & "#")
    If deb = 0 And test Then deb = i
    If deb And (test = 0 Or i = pc) Then j = i + Sgn(test) - deb: deb = 0: If j >= N Then NbJoursConsecutifs = NbJoursConsecutifs + j
Next
If IsEmpty(NbJoursConsecutifs) Then NbJoursConsecutifs = "" 'masque les valeurs zéro
End Function
Le code doit être placé impérativement dans un module standard (Module1).

Formule en AT3 à tirer vers le bas =NbJoursConsecutifs(B3:AS3;10)

Le nombre (paramètre) 10 peut être modifié.

Edit : j'ai corrigé le code (calcul de j) comme indiqué au post #19.
 

Pièces jointes

  • Congés successifs(1).xlsm
    31.6 KB · Affichages: 1
Dernière édition:

R@chid

XLDnaute Barbatruc
Supporter XLD
Bonjour @ tous,
tu peux calculer la plus grande série des jours consécutifs par cette formule matricielle en AT3 :
VB:
=MAX(FREQUENCE(SI(B3:AS3="CP";TRANSPOSE(LIGNE(INDIRECT("1:"&COLONNES(B3:AS3)))));SI(B3:AS3<>"CP";TRANSPOSE(LIGNE(INDIRECT("1:"&COLONNES(B3:AS3)))))))
@ valider par Ctrl+Maj+Entrée
@ tirer vers le bas

Cordialement
 

job75

XLDnaute Barbatruc
Bonjour FRANKY92, R@chid, le forum,

Bien sûr si l'on veut compter uniquement les congés payés CP on utilisera ce fichier (2) :
VB:
Function NbJoursConsecutifs(Plage As Range, N%)
Dim critere$, pc%, i%, test As Boolean, deb%, j%
critere = "CP" 'à adapter
pc = Plage.Count
For i = 1 To pc
    test = UCase(Plage(i)) = critere
    If deb = 0 And test Then deb = i
    If deb And (Not test Or i = pc) Then j = i - test - deb: deb = 0: If j >= N Then NbJoursConsecutifs = NbJoursConsecutifs + j
Next
If IsEmpty(NbJoursConsecutifs) Then NbJoursConsecutifs = "" 'masque les valeurs zéro
End Function
Edit : modifié le calcul de j.

A+
 

Pièces jointes

  • Congés successifs(2).xlsm
    31.5 KB · Affichages: 1
Dernière édition:

zebanx

XLDnaute Accro
Bonjour JOB75, Rachid, Francky92, le forum

Merci à Rachid et Job pour les formules et fonctions

@job75
Je n'ai pas tout compris à la rédaction pour cette fonction. En la modifiant un peu, de manière peut-être un peu plus accessible -), ça me parait bien fonctionner aussi.

Et pour les deux lignes à minima :
- critere = "#CP#REP#RTT#" 'à adapter
- test = InStr(critere, "#" & UCase(Plage(i)) & "#")

J'espère que ta fonction personnalisée sera intégrée dans le répertoire des "fonctions personnalisées".
Car je n'avais jamais vu auparavant cette syntaxe et qu'elles sont utiles et ...formidables.
Une très belle fonction, merci à toi.

Bonne journée à tous
zebanx

VB:
Function NbJC(Plage As Range, N%)
Dim critere$, pc%, i%, test As Byte, deb%, j%
critere = "#CP#REP#RTT#" 'à adapter
pc = Plage.Count
a = 0
For i = 1 To pc
    test = InStr(critere, "#" & UCase(Plage(i)) & "#")
   '--1 : Compte si N jours consécutifs pour les critères
    If test = 0 Then
       If a >= N Then NbJC = IIf(NbJC = 0, a, NbJC + a)
    a = 0
    End If
    If test > 0 Then a = a + 1
Next
If IsEmpty(NbJC) Then NbJC = "" 'masque les valeurs zéro
End Function
 

Pièces jointes

  • NBJC_UDF.xlsm
    26.1 KB · Affichages: 5

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…