XL 2016 retranscrire des périodes (date début-date de fin) sur un calendrier

OA29

XLDnaute Nouveau
1667053460821.png
 

Pièces jointes

  • transcription périodes absence.xlsx
    9.8 KB · Affichages: 12

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Deux propositions par power query (intégré à votre version).
Je ne sais quelle requête sera la plus rapide sur de grands volumes de données.
Si vous les testez, merci de nous signaler laquelle est la plus rapide des deux requêtes.

[aparté]
Hello @mapomme
[/aparté]
 

Pièces jointes

  • PQ-Transciption périodes abscence.xlsx
    29.4 KB · Affichages: 6

OA29

XLDnaute Nouveau
Merci à vous deux pour vos réponses.

@ mapomme : ça fonctionne même si, pour le moment, je ne comprends pas vraiment la formule.

@ Hasco : je n'ai pas réussi à faire fonctionner la proposition et donc impossible de comparer les deux options.

@ tous : j'avais oublié une subtilité sur les périodes : la dernière peut être en cours, c'est à dire qu'il y a une date de début mais pas de date de fin ; la date de fin à prendre en compte serait alors celle du jour (aujourd'hui()) afin de tenir le calendrier à jour dans le suivi des absences.

encore merci pour vos retours,
bonne soirée
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,
@ tous : j'avais oublié une subtilité sur les périodes : la dernière peut être en cours, c'est à dire qu'il y a une date de début mais pas de date de fin ; la date de fin à prendre en compte serait alors celle du jour (aujourd'hui()) afin de tenir le calendrier à jour dans le suivi des absences.
Nouvelle formule en G2 à copier vers le bas :
VB:
=REPT("absent";SOMMEPROD(--((E2>=A$2:A$999)*(E2<=SI((A$2:A$999<>"")*(B$2:B$999="")>0;AUJOURDHUI();B$2:B$999))))>0)

Voir fichier joint.
 

Pièces jointes

  • OA29- périodes absences- v1.xlsx
    11.6 KB · Affichages: 7
Dernière édition:

chris

XLDnaute Barbatruc
Bonjour à tous
@ Hasco : je n'ai pas réussi à faire fonctionner la proposition et donc impossible de comparer les deux options.

Mais encore ? As-tu actualisé ?

Si tu as 2016 il n'y a aucune raison pour ce cela ne fonctionne pas

Le fichier modifié avec une ligne sans date de fin
 

Pièces jointes

  • PQ-Transciption périodes abscence2.xlsx
    23 KB · Affichages: 10

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @goube :),
Quelle est l'utilité des signes -- dans la formule SOMMEPROD et dans quel cas l'utiliser ?

C'est très bien vu car dans mes formules le "--" est inutile.
C'est une question d'habitude. Et comme on dit: "ça ne mange de pain".

Quand l'expression entre les parenthèses de SOMMEPROD ne renvoie que des VRAI ou FAUX, SOMMEPPROD ne sait pas faire la somme. SOMMEPROD renvoie 0. Pour que SOMMEPROD soit correcte il faut transformer les VRAI et FAUX en nombres. On peut le faire en prenant deux fois leur opposé (--), en les multipliant par 1 (*1) ou encore en utilisant la fonction N().

Dans mes précédentes formules, les termes de la SOMMEPROD sont des produits de deux valeurs booléennes. Le produit de deux valeurs booléennes est converti automatiquement par excel en nombres (0 ou 1). Donc les "--" sont inutiles.

Voir illustration dans le fichier joint.
 

Pièces jointes

  • OA29- périodes absences- v1a.xlsx
    10.2 KB · Affichages: 3
Dernière édition:

Amilo

XLDnaute Accro
Bonjour à tous,
Une autre proposition avec Power query,

Edit : comme je ne suis pas certain d'avoir compris, je mets 2 résultats différents (voir "Test 1" et "Test 2")

Cordialement
 

Pièces jointes

  • PQ_transcription périodes absence_.xlsx
    27.2 KB · Affichages: 7
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour le fil, le forum,

Pour faire bon poids voyez cette macro dans le code de la feuille :
VB:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim P As Range, tabP, Q As Range, tabQ, datmin&, datmax&, d As Object, i&, deb&, fin&, dat
Set P = [A1].CurrentRegion.Resize(, 2): tabP = P.Value2 'matrice, plus rapide
Set Q = [E1].CurrentRegion.Resize(, 2): tabQ = Q.Value2 'matrice, plus rapide
datmin = Application.Min(Q.Columns(1))
datmax = Application.Max(Q.Columns(1))
'---mémorise les dates du tableau P---
Set d = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(tabP)
    deb = Val(tabP(i, 1))
    If deb > 0 Then
        deb = IIf(deb > datmin, deb, datmin)
        fin = Val(tabP(i, 2))
        If fin = 0 Then fin = Date
        fin = IIf(fin < datmax, fin, datmax)
        For dat = deb To fin
            d(dat) = "absent"
        Next dat
    End If
Next i
'---remplissage du tableau Q---
For i = 2 To UBound(tabQ)
    tabQ(i, 2) = d(tabQ(i, 1))
Next i
'---restitution---
Application.EnableEvents = False 'désactive les évènements
Q = tabQ
Application.EnableEvents = True 'réactive les évènements
End Sub
Elle se déclenche automatiquement quand on modifie ou valide une cellule quelconque.

A+
 

Pièces jointes

  • Absences VBA(1).xlsm
    18.8 KB · Affichages: 5

job75

XLDnaute Barbatruc
Comparaison des durées des calculs :

- formules matricielles du post #6 => 3,2 millièmes de seconde, pour cela j'ai rendu les formules volatiles

- calcul du tableau VBA du post #12 => 0,45 millième de seconde.

La macro est rapide car elle utilise des tableaux VBA et le Dictionary.
 

Discussions similaires

Statistiques des forums

Discussions
314 487
Messages
2 110 119
Membres
110 676
dernier inscrit
Hoolaurent