Forum Replies Created
-
AuthorPosts
-
Antoine Fixary
ParticipantBonjour, je veux bien aider, mais je ne comprends pas le besoin.
Merci de mieux expliquer votre besoin.
Cordialement
Antoine Fixary
ParticipantBonjour,
désolé, j’ai ouvert votre fichier et ça ma paru bien compliquié. J’ai une solution “clé en main” qui existe :
Elle utilise 2 fonctions qui calcule le nombre de jours ouvrés soit pour une année civile soit pour plusieurs années civiles (jusqu’à 3 ans).
Fonction fnJoursOuvresAnnee
A utiliser si l’on est certain que la période ne concerne toujours qu’une seule année :
// Calcul le nombre de jours ouvrées (hors week-end et jours fériés)
(DATE_DEBUT as date, DATE_FIN as date) as number =>
let
annee = Date.Year(DATE_DEBUT),////////////////////////////////
// Calcul du jour du dimanche de Pâques (nécessaire pour calcul des jours fériés)
////////////////////////////////
g = Number.Mod(annee,19),
c = Number.IntegerDivide(annee,100),
c4 = Number.IntegerDivide(c,4),
e=Number.IntegerDivide((8*c+13),25),
h=Number.Mod((19*g+ c-c4-e+15),30),
h2 = if (h=29) then 28 else if (h=28 and g>10) then h-1 else h,
k=Number.IntegerDivide(h2,28),
p=Number.IntegerDivide(29,(h2+1)),
q=Number.IntegerDivide((21-g),11),
i=(k*p*q-1)*k+h2,
b=Number.IntegerDivide(annee,4)+annee,
j1=b+i+2+c4-c,
j2=Number.Mod(j1,7),
r=28+i-j2,
paques=Date.AddDays(#date(annee,3,1), r-1),////////////////////////////////
// Création de la liste des jours fériés
////////////////////////////////
joursFeries = {#date(annee,1,1), // Jour de l’an
Date.AddDays(paques, -2), // Vendredi saint (férié en Alsace Moselle)
paques, // Dimanche de Pâques
Date.AddDays(paques, 1), // Lundi de Pâques
#date(annee,5,1), // Fête du travail
#date(annee,5,8), // Victoire 1945
Date.AddDays(paques, 39), // Ascension
Date.AddDays(paques, 49), // Pentecote
Date.AddDays(paques, 50), // Lundi de pentecote
#date(annee,7,14), // Fête nationale
#date(annee,8,15), // Assomption
#date(annee,11,1), // La Toussaint
#date(annee,11,11), // Armistice 1918
#date(annee,12,25), // Noel
#date(annee,12,26)}, // Saint-Etienne (férié en Alsace Moselle)////////////////////////////////
// Calcul du nombre de jours ouvrés entre 2 dates d’une même année
////////////////////////////////
liste_De_Date = List.Dates(DATE_DEBUT, Number.From(DATE_FIN – DATE_DEBUT)+1, #duration(1, 0, 0, 0)),
weekend = List.Select(liste_De_Date, each Date.DayOfWeek(_, Day.Monday) >= 5),
supprimer_Weekend = List.RemoveItems(liste_De_Date, weekend),
supprimer_JoursFeriés = List.RemoveItems(supprimer_Weekend, joursFeries),
nombre_De_Jours = List.Count(supprimer_JoursFeriés)
in
nombre_De_JoursFonction fnJoursOuvresMultiAnnee à utiliser si la période peut courir sur 1 ou
2 ans (nécessite fnJoursOuvresAnnee)// Calcul le nombre de jours ouvrées (hors week-end et jours feriés) jusqu’a des dates espacées de 2 ans.
(DATE_DEBUT as date, DATE_FIN as date) as number =>
let
anneeDebut = Date.Year(DATE_DEBUT),
anneeFin = Date.Year(DATE_FIN),
nombre_De_Jours = if anneeFin – anneeDebut = 0 then
fnJoursOuvresAnnee(DATE_DEBUT,DATE_FIN)
else if anneeFin – anneeDebut = 1 then
fnJoursOuvresAnnee(DATE_DEBUT,#date(anneeDebut,12,31)) + fnJoursOuvresAnnee(#date(anneeFin,1,1),DATE_FIN)
else if anneeFin – anneeDebut = 2 then
fnJoursOuvresAnnee(DATE_DEBUT,#date(anneeDebut,12,31)) + fnJoursOuvresAnnee(#date(anneeDebut+1,1,1),#date(anneeDebut+1,12,31)) + fnJoursOuvresAnnee(#date(anneeFin,1,1),DATE_FIN)
else
error “Ecart de plus de 2 ans entre les dates”
in
nombre_De_JoursAntoine Fixary
ParticipantBonjour,
je n’avais pas le temps de jeter un oeil avant.
Malheureusement, mes compétences en PowerQuery ne me permettent pas de vous proposer une solution.
Cordialement
Antoine Fixary
ParticipantBonjour,
pourriez-vous donner un exmple chiffré (mettre àjour votre fichier avec un exemple de ce que vous voulez cululer).
Merci, Antoine
Antoine Fixary
ParticipantBonjour,
ajouter une colonne personnalisée pour avoir un champ “Année-Mois” et regrouper par “Année_Mois” / N° Série.
Voir fichier joint en PJ.
Le résultat obtenu ne correspond pas au niveau des valeurs (si ça correspond à vos attentes, vous auriez pu, à minima, créer un exemple valable). Si ce n’est pas bon, précisez votre demande SVP.
Cordialement.
Attachments:
You must be logged in to view attached files.Antoine Fixary
ParticipantRe-bonjour,
désolé, ça dépasse mes compétences. Je n’ai jamais eu ce ces.
Par contre, vous pouvez peut-être ne garder que ces 2 colonnes pour faire le tri puis réintégrer les données manquantes avec une requete juste sur les lignes qui vous intéresse. Comme dit, sans avoir les données en main, c’est compliqué de répondre.
Belle journée.
Antoine Fixary
ParticipantBonjour,
votre besoin est-il toujours d’actualité.
De ce que je comprends, un tableau croisé dynamique permettrait d’avoir la vue d’ensemble.
Par contre, pour faire le TCD, il faudra “exploser” chaque ligne en autant de lignes que nécessaire.
Exemple : Si il y 5h du 01/01/20xx au 05/01/20xx, il faut 5 lignes avec une ligne par jour pour cet enregistrement et 1h pour chaque ligne si j’ai bien compris.
Faut-il prendre les jours travaillé en compte ?
J’attends votre retour pour avancer.
Cordialement.
Antoine Fixary
ParticipantBonjour,
si vous faites un tri par “Référence” puis “Date”. Puis vous mettez cette table en Buffer (Table.Buffer). Et enfin, vous supprimer les doublons pour la référence. Vous devriez obtenir votre résultat.
J’espère avoir été clair.
Cordialement
Antoine Fixary
ParticipantBonjour,
je n’ai jamais vu cette option dans Power Query d’Excel.
Ne serait ce pas une fonction uniquement disponible dans Power BI ?
Belle journée, Antoine
Antoine Fixary
ParticipantBonjour Kassandra,
j’avais le même problème dans Excel 16. Depuis que nous sommes passé à Excel 365, la format semble être conservé (à confirmer par d’autres).
Belle journée, Antoine
Antoine Fixary
ParticipantEncore une petite coquille (pourquoi on ne peut pas modifier ces posts ?)
Nouveau code à changer pour le calcul du la liste “joursFeries”, erreur mineure pour Pâques :
////////////////////////////////
// Création de la liste des jours fériés
////////////////////////////////
joursFeries = {#date(annee,1,1), // Jour de l’an
Date.AddDays(paques, -2), // Vendredi saint (férié en Alsace Moselle)
paques, // Dimanche de Pâques
Date.AddDays(paques, 1), // Lundi de Pâques
#date(annee,5,1), // Fête du travail
#date(annee,5,8), // Victoire 1945
Date.AddDays(paques, 39), // Ascension
Date.AddDays(paques, 49), // Pentecote
Date.AddDays(paques, 50), // Lundi de pentecote
#date(annee,7,14), // Fête nationale
#date(annee,8,15), // Assomption
#date(annee,11,1), // La Toussaint
#date(annee,11,11), // Armistice 1918
#date(annee,12,25), // Noel
#date(annee,12,26)}, // Saint-Etienne (férié en Alsace Moselle)Antoine Fixary
ParticipantBonjour,
n’ayant pas trouvé le moyen de modifié mon post précédent, ci-dessous mon code légèrement amélioré.
Si quelqu’un connait la syntaxe pour intégré du code sur ce forum, je suis intéressé, par ce n’est pas du BBcode à priori.
Toujours 2 fonctions en fonction des besoins :
Fonction fnJoursOuvresAnnee – A utiliser si l’on est certain que la période ne concerne toujours qu’une seule année :
// Calcul le nombre de jours ouvrées (hors week-end et jours fériés)
(DATE_DEBUT as date, DATE_FIN as date) as number =>
let
annee = Date.Year(DATE_DEBUT),////////////////////////////////
// Calcul du jour du dimanche de Pâques (nécessaire pour calcul des jours fériés)
////////////////////////////////
g = Number.Mod(annee,19),
c = Number.IntegerDivide(annee,100),
c4 = Number.IntegerDivide(c,4),
e=Number.IntegerDivide((8*c+13),25),
h=Number.Mod((19*g+ c-c4-e+15),30),
h2 = if (h=29) then 28 else if (h=28 and g>10) then h-1 else h,
k=Number.IntegerDivide(h2,28),
p=Number.IntegerDivide(29,(h2+1)),
q=Number.IntegerDivide((21-g),11),
i=(k*p*q-1)*k+h2,
b=Number.IntegerDivide(annee,4)+annee,
j1=b+i+2+c4-c,
j2=Number.Mod(j1,7),
r=28+i-j2,
paques=Date.AddDays(#date(annee,3,1), r-1),////////////////////////////////
// Création de la liste des jours fériés
////////////////////////////////
joursFeries = {#date(annee,1,1), // Jour de l’an
Date.AddDays(paques, -2), // Vendredi saint (férié en Alsace Moselle)
Date.AddDays(paques, 1), // Dimanche de Pâques
#date(annee,5,1), // Fête du travail
#date(annee,5,8), // Victoire 1945
Date.AddDays(paques, 39), // Ascension
Date.AddDays(paques, 49), // Pentecote
Date.AddDays(paques, 50), // Lundi de pentecote
#date(annee,7,14), // Fête nationale
#date(annee,8,15), // Assomption
#date(annee,11,1), // La Toussaint
#date(annee,11,11), // Armistice 1918
#date(annee,12,25), // Noel
#date(annee,12,26)}, // Saint-Etienne (férié en Alsace Moselle)////////////////////////////////
// Calcul du nombre de jours ouvrés entre 2 dates d’une même année
////////////////////////////////
liste_De_Date = List.Dates(DATE_DEBUT, Number.From(DATE_FIN – DATE_DEBUT)+1, #duration(1, 0, 0, 0)),
weekend = List.Select(liste_De_Date, each Date.DayOfWeek(_, Day.Monday) >= 5),
supprimer_Weekend = List.RemoveItems(liste_De_Date, weekend),
supprimer_JoursFeriés = List.RemoveItems(supprimer_Weekend, joursFeries),
nombre_De_Jours = List.Count(supprimer_JoursFeriés)
in
nombre_De_JoursFonction fnJoursOuvresMultiAnnee à utiliser si la période peut courir sur 1 ou
2 ans (nécessite fnJoursOuvresAnnee)// Calcul le nombre de jours ouvrées (hors week-end et jours feriés) jusqu’a des dates espacées de 2 ans.
(DATE_DEBUT as date, DATE_FIN as date) as number =>
let
anneeDebut = Date.Year(DATE_DEBUT),
anneeFin = Date.Year(DATE_FIN),
nombre_De_Jours = if anneeFin – anneeDebut = 0 then
fnJoursOuvresAnnee(DATE_DEBUT,DATE_FIN)
else if anneeFin – anneeDebut = 1 then
fnJoursOuvresAnnee(DATE_DEBUT,#date(anneeDebut,12,31)) + fnJoursOuvresAnnee(#date(anneeFin,1,1),DATE_FIN)
else if anneeFin – anneeDebut = 2 then
fnJoursOuvresAnnee(DATE_DEBUT,#date(anneeDebut,12,31)) + fnJoursOuvresAnnee(#date(anneeDebut+1,1,1),#date(anneeDebut+1,12,31)) + fnJoursOuvresAnnee(#date(anneeFin,1,1),DATE_FIN)
else
error “Ecart de plus de 2 ans entre les dates”
in
nombre_De_JoursBelle journée à tous.
Antoine Fixary
ParticipantBonjour, je viens après la guerre, mais jamais le même problème et les codes ci*dessus m’ont permis de le résoudre.
Ci-joint, mon humble contribution.
Fonction fnJoursOuvresAnnee
A utiliser si l’on est certain que la période ne concerne toujours qu’une seule année :
[code]
// Calcul le nombre de jours ouvrées (hors week-end et jours fériés)(DATE_DEBUT as date, DATE_FIN as date) as number =>
let
annee = Date.Year(DATE_DEBUT),////////////////////////////////
// Calcul du jour du dimanche de Pâques (nécessaire pour calcul des jours fériés)
////////////////////////////////
g = Number.Mod(annee,19),
c = Number.IntegerDivide(annee,100),
c4 = Number.IntegerDivide(c,4),
e=Number.IntegerDivide((8*c+13),25),
h=Number.Mod((19*g+ c-c4-e+15),30),
h2 = if (h=29) then 28 else if (h=28 and g>10) then h-1 else h,
k=Number.IntegerDivide(h2,28),
p=Number.IntegerDivide(29,(h2+1)),
q=Number.IntegerDivide((21-g),11),
i=(k*p*q-1)*k+h2,
b=Number.IntegerDivide(annee,4)+annee,
j1=b+i+2+c4-c,
j2=Number.Mod(j1,7),
r=28+i-j2,
jourDePaquesSTR=”01/03/”&Text.From(annee),
jourDePaquesDate = Date.FromText(jourDePaquesSTR),
paques=Date.AddDays(jourDePaquesDate, r-1),////////////////////////////////
// Création de la liste des jours fériés
////////////////////////////////
jourDeLAn = #date(annee,1,1),
paquesVendredi = Date.AddDays(paques, -2),
paquesLundi = Date.AddDays(paques, 1),
feteTravail = #date(annee,5,1),
victoire1945 = #date(annee,5,8),
ascension=Date.AddDays(paques, 39),
pentecote=Date.AddDays(paques, 49),
pentecoteLundi = Date.AddDays(pentecote, 1),
feteNationale = #date(annee,7,14),
assomption = #date(annee,8,15),
toussaint = #date(annee,11,1),
armistice1918 = #date(annee,11,11),
noel = #date(annee,12,25),
saintEtienne = #date(annee,12,26),
joursFeries = {jourDeLAn} & {paquesVendredi} & {paques} & {paquesLundi} & {feteTravail} & {victoire1945} & {ascension} & {pentecote} & {pentecoteLundi} & {feteNationale} & {assomption} & {toussaint} & {armistice1918} & {noel} & {saintEtienne},////////////////////////////////
// Calcul du nombre de jours ouvrés entre 2 dates d’une même année
////////////////////////////////
liste_De_Date = List.Dates(DATE_DEBUT, Number.From(DATE_FIN – DATE_DEBUT)+1, #duration(1, 0, 0, 0)),
weekend = List.Select(liste_De_Date, each Date.DayOfWeek(_, Day.Monday) >= 5),
supprimer_Weekend = List.RemoveItems(liste_De_Date, weekend),
supprimer_JoursFeriés = List.RemoveItems(supprimer_Weekend, joursFeries),
nombre_De_Jours = List.Count(supprimer_JoursFeriés)
in
nombre_De_Jours
[/code]Fonction fnJoursOuvresMultiAnnee à utliser si la période peut courir sur ou
ans (nécessite fnJoursOuvresAnnee)[code]
// Calcul le nombre de jours ouvrées (hors week-end et jours feriés) jusqu’a des dates espacées de 2 ans.(DATE_DEBUT as date, DATE_FIN as date) as number =>
let
anneeDebut = Date.Year(DATE_DEBUT),
anneeFin = Date.Year(DATE_FIN),
nombre_De_Jours = if anneeFin – anneeDebut = 0 then
fnJoursOuvresAnnee(DATE_DEBUT,DATE_FIN)
else if anneeFin – anneeDebut = 1 then
fnJoursOuvresAnnee(DATE_DEBUT,#date(anneeDebut,12,31)) + fnJoursOuvresAnnee(#date(anneeFin,1,1),DATE_FIN)
else if anneeFin – anneeDebut = 2 then
fnJoursOuvresAnnee(DATE_DEBUT,#date(anneeDebut,12,31)) + fnJoursOuvresAnnee(#date(anneeDebut+1,1,1),#date(anneeDebut+1,12,31)) + fnJoursOuvresAnnee(#date(anneeFin,1,1),DATE_FIN)
else
error “Ecart de plus de 2 ans entre les dates”
in
nombre_De_Jours
[/code]Ces codes ne sont pas nécessairement optimisés, mais ils font le job.
Belle journée
-
AuthorPosts