Toutes mes réponses sur les forums
-
AuteurMessages
-
27 mars 2023 à 2 h 18 min en réponse à : Déterminer la date de fin de semaine à partir de l’année et du N° semaine #126958
Stéphane Lorin
ParticipantBonjour
Attention : le 3e argument de #duration correspond aux minutes et non aux jours.
Vous ajoutez 7 min et non 7 jours
StéphaneStéphane Lorin
ParticipantBonjour
Je pense qu’il est plus simple de créer une fonction personnalisée
Vous appliquez ensuite cette fonction lors du regroupementla fonction “Dépivot” :
(Données as table) as table =>
let
Index = Table.AddIndexColumn(Données, “Index”, 1, 1, Int64.Type),
UnPivot = Table.UnpivotOtherColumns(Index, {“CodeClient”, “Index”}, “Attribut”, “Valeur”),
Attribut = Table.CombineColumns(Table.TransformColumnTypes(UnPivot, {{“Index”, type text}}, “fr”),{“Attribut”, “Index”},Combiner.CombineTextByDelimiter(” “, QuoteStyle.None),”Attribut.1”),
Pivot = Table.Pivot(Attribut, List.Distinct(Attribut[Attribut.1]), “Attribut.1”, “Valeur”)
in
PivotA appliquer manuellement dans le Group
Table.Group(Etape-Précédente, {“CodeClient”}, {{“Données”, each Dépivot(_)}})
il ne reste plus qu’à développer les colonnes
Stéphane
Stéphane Lorin
ParticipantBonjour
vous dites “si la table est absente du dossier”
une table est un élément d’un fichier Excel qui est lui-même enregistré dans un dossier (ou sous-dossier).
vous cherchez le nom d’une table dans tous les fichiers du dossier ?Sinon vous pouvez utiliser try … otherwise … afin de passer à l’étape suivante.
Stéphane
Stéphane Lorin
ParticipantBonjour
si vous avez Excel 365, je vous propose
=TRIER(FILTRE(planning[[Colonne1]:[Colonne17]];NB.SI(planning[[Colonne1]:[Colonne17]];planning[[Colonne1]:[Colonne17]])=1);;;VRAI)
Cela va prendre les valeurs uniques et les trier dans l’ordre croissant
Stéphane
Stéphane Lorin
ParticipantComme je l’écrivais tout à l’heure, je n’ai pas accès à votre base et votre requête commence par
Source = Excel.Workbook(File.Contents(“\\datas\profils$\Administration\Desktop\Fusion contacts2.xlsx”), null, true)
J’ai donc une erreur à l’ouverture, si vous voulez de l’aide il faut fournir un fichier exploitable
Voici un code qui fonctionne mais il faudra l’adapter à votre source (1er étape)
let
Source = Excel.CurrentWorkbook(){[Name=”Table_Contacts”]}[Content],
#”Lignes groupées” = Table.Group(Source, {“CodeClient”}, {{“Nombre”, each Table.AddIndexColumn(_,”Index”,1), type table }}),
#”Nombre développé” = Table.ExpandTableColumn(#”Lignes groupées”, “Nombre”, {“NomContact”, “AdresseContact”, “CodePostalContact”, “CommuneContact”, “TelephoneContact”, “EmailContact”, “FonctionContact”, “Index”}, {“NomContact”, “AdresseContact”, “CodePostalContact”, “CommuneContact”, “TelephoneContact”, “EmailContact”, “FonctionContact”, “Index”}),
#”Supprimer le tableau croisé dynamique des autres colonnes” = Table.UnpivotOtherColumns(#”Nombre développé”, {“CodeClient”, “Index”}, “Attribut”, “Valeur”),
#”Colonnes fusionnées” = Table.CombineColumns(Table.TransformColumnTypes(#”Supprimer le tableau croisé dynamique des autres colonnes”, {{“Index”, type text}}, “fr”),{“Attribut”, “Index”},Combiner.CombineTextByDelimiter(” “, QuoteStyle.None),”Attribut.1″),
#”Colonne dynamique” = Table.Pivot(#”Colonnes fusionnées”, List.Distinct(#”Colonnes fusionnées”[Attribut.1]), “Attribut.1”, “Valeur”)
in
#”Colonne dynamique”Stéphane
Stéphane Lorin
ParticipantBonjour
votre fichier pointe vers une source externe que je ne peux évidemment pas ouvrir.
il faut créer un tableau dans votre fichier exemple et partir de ce tableau ContactsA la lecture du code je vois que vous ajoutez l’index après le développement des colonnes regroupées, je vous expliquais hier de créer l’index sur chaque table du regroupement
Table.Group(Source, {“CodeClient”}, {{“Données”, each Table.AddIndexColumn(_,”Index”,1)}})
Stéphane
Stéphane Lorin
ParticipantBonjour
C’est possible, voir exemple en PJ
Vous ajoutez un index, vous dépivotez toutes vos colonnes, puis vous pivotez 2 par 2 pour faire vos contrôles et vous pivotez de nouveau pour récupérer les 15 contrôles.
Il ne reste plus qu’à fusionner les contrôles avec votre source initialeA adapter à vos données
StéphaneAttachments:
You must be logged in to view attached files.Stéphane Lorin
ParticipantRegardez l’étape Regroupement de mon code ci-dessus
Table.Group(Source, {“CodeClient”}, {{“Données”, each Table.AddIndexColumn(_,”Index”,1)}})Je modifie le code manuellement en ajoutant l’index à chaque table (avant le développement des colonnes), comme ça il y a un contact 1, 2, 3… pour chaque client.
Ensuite à l’étape dépivot, on conserve les codes clients et l’index et on dépivote toutes les autres colonnes, en attribut on a maintenant Nom, Adresse, Fonction…
Puis on combine les colonnes Attribut et Index pour avoir Nom1, Adresse1, Fonction1, Nom2, Adresse2,…
Enfin on pivote cette colonne Attribut+Index pour avoir en colonne Nom1, Adresse1, Fonction1, Nom2, Adresse2,…Stéphane
Stéphane Lorin
ParticipantBonjour
Le code proposé est bien du Power Query (langage M) et non en VBA
Il faut commencer par stocker vos données dans des tableaux “structurés” (insertion/tableau)
Ce que vous souhaitez est une transformation assez “classique” qui revient régulièrement sur les forums.
Une possibilité est de regrouper votre table “contacts” par Codeclient, d’ajouter un Index afin de numéroter les contacts, de dépivoter les colonnes pour obtenir “Nom1”, “Adresse1″, Fonction1”, “Nom2″, Adresse2”, “Fonction2″… Enfin vous pivoter l’ensemble pour obtenir une ligne par Codeclient.
La dernière étape est une fusion entre votre table “Clients” et votre table “Contacts” transformée.Voici le code Power Query pour transformer la table “Contacts”
let
Source = Excel.CurrentWorkbook(){[Name=”Contacts”]}[Content],
Regroupement = Table.Group(Source, {“CodeClient”}, {{“Données”, each Table.AddIndexColumn(_,”Index”,1)}}),
Développement = Table.ExpandTableColumn(Regroupement, “Données”, {“NomContact”, “AdresseContact”, “CodePostalContact”, “CommuneContact”, “TelephoneContact”, “EmailContact”, “FonctionContact”, “Index”}, {“NomContact”, “AdresseContact”, “CodePostalContact”, “CommuneContact”, “TelephoneContact”, “EmailContact”, “FonctionContact”, “Index”}),
Dépivot = Table.UnpivotOtherColumns(Développement, {“CodeClient”, “Index”}, “Attribut”, “Valeur”),
#”Fusion Colonne” = Table.CombineColumns(Table.TransformColumnTypes(Dépivot, {{“Index”, type text}}, “fr-FR”),{“Attribut”, “Index”},Combiner.CombineTextByDelimiter(” “, QuoteStyle.None),”Attribut.1″),
Pivot = Table.Pivot(#”Fusion Colonne”, List.Distinct(#”Fusion Colonne”[Attribut.1]), “Attribut.1”, “Valeur”)
in
PivotStéphane
Stéphane Lorin
ParticipantBonjour
vous ne précisez pas comment vous voulez regrouper les contacts en une seule ligne par client :
en collant les noms les uns derrière les autres,
en créant autant de colonnes que de contact
en créant des colonnes suivant la fonction
…voici exemple de code avec un regroupement pour créer une liste.
let
Source = Excel.CurrentWorkbook(){[Name=”Contacts”]}[Content],
#”Lignes groupées” = Table.Group(Source, {“CodeClient”}, {{“Contact”, each [NomContact], type list}})
in
#”Lignes groupées”Vous pouvez ensuite développer la liste sur des colonnes ou la concaténer.
Vous réaliserez la fusion avec la table des clients dans une autre requête.Stéphane
Stéphane Lorin
ParticipantBonjour
La réponse de ChatGPT est assez bluffante mais je doute que ça renvoi le résultat attendu en l’état. je ne trouve pas la fonction Date.IsWorkday dans Power Query (pas présente sur le site https://learn.microsoft.com/fr-fr/powerquery-m) et la fonction va renvoyer le dernier jour ouvré dans les trois jours suivant la date demandée.
Je propose pour ma part de créer une nouvelle colonne avec une liste de date de 10 jours (pour être large !), de ne conserver que les jours de la semaine et ceux qui ne sont pas fériés. puis de sélectionner le 3e jour (donc le 2 car power query commence les listes à 0)
each List.Select(List.Dates(Date.AddDays([Date],1),10,#duration(1,0,0,0)),each Date.DayOfWeek(_, Day.Monday)<5 and List.IsEmpty(List.Intersect({Fériés, {_}}))){2}
avec les dates initiales dans le champ [Date] et la liste “Fériés” désignant les jours fériés.
Stéphane
Stéphane Lorin
ParticipantDans ce que j’en ai compris, Power Query ne traite pas le code dans l’ordre mais n’exécute que le nécessaire.
Si la condition est remplie les dernières lignes de code ne seront pas exécutées.if Table.IsEmpty(#”Lignes filtrées3″) then MyTable0 else #”Lignes vides supprimées”
Sinon voici ma fonction n° de semaine adaptée avec le n° du jour de la semaine au format 2023-W02-4 pour ce 12 janvier 2023 (4eme jour de la 2eme semaine de l’année)
(Date as date) => let
Jour_Semaine = Date.DayOfWeek(Date,Day.Monday),
Jeudi_Semaine = Date.AddDays(Date,3-Jour_Semaine),
Premier_Jeudi_Année = #date(Date.Year(Jeudi_Semaine),1,7-Date.DayOfWeek(#date(Date.Year(Jeudi_Semaine),1,1),Day.Friday)),
Num_Semaine = Duration.Days(Jeudi_Semaine – Premier_Jeudi_Année)/7+1
in
Text.From(Date.Year(Jeudi_Semaine))&”-W”&Text.PadStart(Text.From(Num_Semaine),2,”0″)&”-“&Text.From(Jour_Semaine+1)Stéphane
Stéphane Lorin
ParticipantBonjour
Difficile de comprendre votre code, nous n’avons pas accès aux sources. Attention tout de même aux données confidentielles.
Vous pouvez utiliser Table.IsEmpty pour tester si votre table est vide.
dans le “in” final, if Table.IsEmpty SourceBefore then … else #”Lignes vides supprimées”
Sinon j’ai proposé dans cette discussion https://www.lecfomasque.com/sujet/numero-semaine-iso/ une fonction N° Semaine Iso bien plus simple que celle que vous utilisez.
Stéphane
Stéphane Lorin
ParticipantBonjour
Je vous ai proposé une autre possibilité sur un autre forum sans réponse de votre part. Inutile de poser votre question à plusieurs endroits si c’est pour ignorer leur réponse.
Il me semble plus facile de mettre en œuvre une solution par fusion via une colonne personnalisée en ajoutant la date de la veille (et une colonne d’Index pour le tri)
Voici le code
let
Source = Excel.CurrentWorkbook(){[Name=”Tableau1″]}[Content],
ModificationTypeData = Table.TransformColumnTypes(Source,{{“Date”, type date}, {“type”, type text}, {“valeur”, Int64.Type}}),
#”Index ajouté” = Table.AddIndexColumn(ModificationTypeData, “Index”, 0, 1, Int64.Type),
#”Personnalisée ajoutée” = Table.AddColumn(#”Index ajouté”, “Veille”, each Date.AddDays([Date],-1)),
#”Requêtes fusionnées” = Table.NestedJoin(#”Personnalisée ajoutée”, {“Veille”, “type”}, #”Personnalisée ajoutée”, {“Date”, “type”}, “Personnalisée ajoutée”, JoinKind.LeftOuter),
#”Personnalisée ajoutée développé” = Table.ExpandTableColumn(#”Requêtes fusionnées”, “Personnalisée ajoutée”, {“valeur”}, {“valeur veille”}),
#”Soustraction insérée” = Table.AddColumn(#”Personnalisée ajoutée développé”, “Ecart”, each [valeur] – [valeur veille], Int64.Type),
#”Lignes triées” = Table.Sort(#”Soustraction insérée”,{{“Index”, Order.Ascending}}),
#”Autres colonnes supprimées” = Table.SelectColumns(#”Lignes triées”,{“Date”, “type”, “valeur”, “Ecart”})
in
#”Autres colonnes supprimées”Stéphane
Stéphane Lorin
ParticipantBonjour
quelque chose comme
=C2&”-“&NB.SI.ENS(C$2:C2;C2)Si vous avez une volumétrie importante de données, il est intéressant d’utiliser Power Query pour transformer vos données
Stéphane
-
AuteurMessages