Toutes mes réponses sur les forums
-
AuteurMessages
-
Daniel
ParticipantBonjour h.boisteau, le Forum,
Voici une solution à la question posée, peut-être certaines étapes notamment l’avant dernière peut être supprimée (TriSurIndex_2)
let
Source = Excel.CurrentWorkbook(){[Name=”Tableau1″]}[Content],
ModificationTypeDonnees = Table.TransformColumnTypes(Source,{{“date”, type datetime}, {“machine”, type text}, {“données”, Int64.Type}}),
AjoutIndexCol = Table.AddIndexColumn(ModificationTypeDonnees, “Index”, 1, 1, Int64.Type),
TriSurIndex_1 = Table.Sort(AjoutIndexCol,{{“Index”, Order.Ascending}}),
RunningTotalMachine = Table.AddColumn(
TriSurIndex_1,
“Machine Running Total”,
(OutTable) =>
List.Sum(
Table.SelectRows(
TriSurIndex_1,
(InTable) => InTable[Index] <= OutTable[Index]
and
InTable[machine] = OutTable[machine])[données]
)
),
TriSurIndex_2 = Table.Sort(RunningTotalMachine,{{“Index”, Order.Ascending}}),
SuppressionIndexCol = Table.RemoveColumns(TriSurIndex_2,{“Index”})
in
SuppressionIndexColCordialement
Daniel28 juillet 2023 à 12 h 48 min en réponse à : Extraire une valeur Min avec une condition variable #130623Daniel
ParticipantBonjour y.monte, le Forum,
En partant de ta table contenant tes données, faire une requête permettant de charger les données en Power Query et faire toutes les modifications à faire. Une fois que cela est fait, dupliquer cette requête et regrouper par CDNO avec comme opération Min sur la colonne BLNO, cela donnera pour chaque CDNO le plus petit numéro de BLNO.
Exemple : tabDataGroupCDNO
let
Source = Excel.CurrentWorkbook(){[Name=”Tableau1″]}[Content],
#”Type modifié” = Table.TransformColumnTypes(Source,{{“CDNO”, Int64.Type}, {“BLNO”, Int64.Type}, {“1ER BL”, Int64.Type}}),
#”Colonnes supprimées” = Table.RemoveColumns(#”Type modifié”,{“1ER BL”}),
#”Lignes groupées” = Table.Group(#”Colonnes supprimées”, {“CDNO”}, {{“BLs”, each List.Min([BLNO]), type nullable number}})
in
#”Lignes groupées”
Fin de l’exempleEn reprenant la 1ère requête (celle ayant servi de support à la duplication), on va fusionner les deux requêtes en sélectionnant le CDNO. Ensuite il suffit de développer la table ainsi créée en ne gardant que la colonne BLs de la requête tabDataGroupCDNO
Exemple :
let
Source = Excel.CurrentWorkbook(){[Name=”Tableau1″]}[Content],
#”Type modifié” = Table.TransformColumnTypes(Source,{{“CDNO”, Int64.Type}, {“BLNO”, Int64.Type}, {“1ER BL”, Int64.Type}}),
#”Colonnes supprimées” = Table.RemoveColumns(#”Type modifié”,{“1ER BL”}),
#”Requêtes fusionnées” = Table.NestedJoin(#”Colonnes supprimées”, {“CDNO”}, tabDataGroupCDNO, {“CDNO”}, “tabDataGroupCDNO”, JoinKind.LeftOuter),
#”tabDataGroupCDNO développé” = Table.ExpandTableColumn(#”Requêtes fusionnées”, “tabDataGroupCDNO”, {“BLs”}, {“BLs”})
in
#”tabDataGroupCDNO développé”
Fin de l’exempleEn espérant que cela t’aidera à résoudre le problème rencontré, d’autres solutions sont certainement possibles.
Cordialement
DanielDaniel
ParticipantBonjour hboisteau, le Forum,
Ci-après, ma contribution concernant ta demande
let
Source = Excel.CurrentWorkbook(){[Name=”Tableau1″]}[Content],
ModificationTypeDonnees = Table.TransformColumnTypes(Source,{{“Date”, type datetime}, {“Point de ventes”, type text}, {“Ventes”, Int64.Type}}),
AnneeMois = Table.AddColumn(ModificationTypeDonnees, “AnnéeMois”, each let
_Annee = Date.Year([Date]),
_Mois = Date.Month([Date]),
_AnneeMois = Text.From(_Annee) & ” – ” & Text.From(_Mois)
in _AnneeMois),
GroupAnneeMoisPtVente = Table.Group(AnneeMois, {“AnnéeMois”, “Point de ventes”}, {{“Min”, each List.Min([Ventes]), type nullable number}, {“Max”, each List.Max([Ventes]), type nullable number}})
in
GroupAnneeMoisPtVenteCordialement
DanielDaniel
ParticipantBonjour MLagrange, Kim, le Forum,
Peut-être allez-vous pouvoir vous inspirer de cette méthode trouvée sur le Net ?
https://excel-malin.com/codes-sources-vba/msgbox-qui-se-ferme-automatiquement/
Sinon, on peut aussi utiliser un UserForm que l’on contrôlera complétement et le fermer dès que le traitement sera terminé.
En espérant que cela vous aidera.
Cordialement
Daniel14 avril 2023 à 11 h 31 min en réponse à : Fonction pour remplacer des caractères dans le texte d’une colonne #127393Daniel
ParticipantBonjour Jérôme, le Forum,
Merci pour ton retour.
On peut aussi utiliser Try …. otherwise pour régler le problème des lignes nulles comme suitlet
Source = Excel.CurrentWorkbook(){[Name=”Tableau1″]}[Content],// Utilisation de la fonction Power Query TransformColumns qui permet d’exécuter une ou plusieurs fonctions sur cette colonne sans passer par la création de colonnes temporaires
// le tiret que tu peux voir correspond à l’item de la table en cours (en l’occurence Source est la table et Ville est la colonne de la table)
AjoutColonneVillesTmp = Table.TransformColumns(Source,
{
{“Villes”,each try fnEnleverAbreviations(fnEnleverAccents(_)) otherwise _}
}
),
#”Type modifié” = Table.TransformColumnTypes(AjoutColonneVillesTmp,{{“Villes”, type text}})
in
#”Type modifié”
Cordialement
DanielDaniel
ParticipantBonjour Christophe, le Forum,
Autre solution, là encore la fin n’est pas parfaite mais cela répond au besoin exprimé.
Requête tabDepart (2)
let
Source = Excel.CurrentWorkbook(){[Name=”tabDepart”]}[Content],
ModificationDataTypes = Table.TransformColumnTypes(Source,{{“CodeClient”, Int64.Type}, {“NomContact”, type text}, {“TelephoneContact”, type text}, {“EmailContact”, type text}, {“FonctionContact”, type text}}),
GrouperSurCodeClient = Table.Group(ModificationDataTypes, {“CodeClient”}, {{“AllRows”, each _, type table [CodeClient=nullable number, NomContact=nullable text, TelephoneContact=nullable text, EmailContact=nullable text, FonctionContact=nullable text]}}),
TransformColonneAllRows = Table.TransformColumns(GrouperSurCodeClient, {“AllRows”, each
let
GrouperNomContacts = Table.AddColumn(GrouperSurCodeClient , “NomContact”, each Text.Combine([AllRows][NomContact],”|”)),
GrouperTelephoneContacts = Table.AddColumn(GrouperNomContacts , “TelephoneContact”, each Text.Combine([AllRows][TelephoneContact],”|”)),
GrouperEmailContacts = Table.AddColumn(GrouperTelephoneContacts , “EmailContact”, each Text.Combine([AllRows][EmailContact],”|”)),
GrouperFonctionContacts = Table.AddColumn(GrouperEmailContacts , “FonctionContact”, each Text.Combine([AllRows][FonctionContact],”|”)),
NombreOccurenceNom = Table.AddColumn(GrouperFonctionContacts , “NbOccNomContact”, each Text.Length(Text.Select([NomContact] , “|”)) + 1),
NombreOccurenceTel = Table.AddColumn(NombreOccurenceNom , “NbOccTelContact”, each Text.Length(Text.Select([TelephoneContact] , “|”)) + 1),
NombreOccurenceEmail = Table.AddColumn(NombreOccurenceTel , “NbOccEmailContact”, each Text.Length(Text.Select([EmailContact] , “|”)) + 1),
NombreOccurenceFct = Table.AddColumn(NombreOccurenceEmail , “NbOccFctContact”, each Text.Length(Text.Select([FonctionContact] , “|”)) + 1)
in NombreOccurenceFct
}),
DevelopperTableData = Table.ExpandTableColumn(TransformColonneAllRows, “AllRows”, {“CodeClient”, “NomContact”, “TelephoneContact”, “EmailContact”, “FonctionContact”, “NbOccNomContact”, “NbOccTelContact”, “NbOccEmailContact”, “NbOccFctContact”}, {“CodeClient.1”, “NomContact”, “TelephoneContact”, “EmailContact”, “FonctionContact”, “NbOccNomContact”, “NbOccTelContact”, “NbOccEmailContact”, “NbOccFctContact”}),
FractionnerColonneNomContact = Table.SplitColumn(DevelopperTableData, “NomContact”, Splitter.SplitTextByDelimiter(“|”, QuoteStyle.Csv), List.Max(DevelopperTableData[NbOccNomContact])),
FractionnerColonneTelContact = Table.SplitColumn(FractionnerColonneNomContact, “TelephoneContact”, Splitter.SplitTextByDelimiter(“|”, QuoteStyle.Csv), List.Max(DevelopperTableData[NbOccTelContact])),
FractionnerColonneEmailContact = Table.SplitColumn(FractionnerColonneTelContact, “EmailContact”, Splitter.SplitTextByDelimiter(“|”, QuoteStyle.Csv), List.Max(DevelopperTableData[NbOccEmailContact])),
FractionnerColonneFctContact = Table.SplitColumn(FractionnerColonneEmailContact, “FonctionContact”, Splitter.SplitTextByDelimiter(“|”, QuoteStyle.Csv), List.Max(DevelopperTableData[NbOccFctContact])),
AjoutColonneControle = Table.AddColumn(FractionnerColonneFctContact, “Contrôle”, each if [CodeClient] <> [CodeClient.1] then 0 else 1),
FiltreLigneControleEgalesZero = Table.SelectRows(AjoutColonneControle, each ([Contrôle] = 1)),
SuppressionColonnes = Table.RemoveColumns(FiltreLigneControleEgalesZero,{“NbOccNomContact”, “NbOccTelContact”, “NbOccEmailContact”, “NbOccFctContact”,”Contrôle”}),
PermutationdesColonnes = Table.ReorderColumns(SuppressionColonnes,{“CodeClient”, “NomContact.1”, “TelephoneContact.1”, “EmailContact.1”, “FonctionContact.1”, “NomContact.2”, “EmailContact.2”, “FonctionContact.2”, “NomContact.3”, “EmailContact.3”, “FonctionContact.3”})
in
PermutationdesColonnes
Cordialement
DanielAttachments:
You must be logged in to view attached files.Daniel
ParticipantBonjour Christophe, Eric, le Forum,
Une autre piste de solution, je joins un fichier pour visualiser le résultat.
Requête :
let
Source = Excel.CurrentWorkbook(){[Name=”tabDepart”]}[Content],
ColonnesList = List.Skip(Table.ColumnNames( Source),1),
ModificationDataTypes = Table.TransformColumnTypes(Source,{{“CodeClient”, type text}, {“NomContact”, type text}, {“TelephoneContact”, type text}, {“EmailContact”, type text}, {“FonctionContact”, type text}}),
FusionColonnesContacts = Table.CombineColumns(ModificationDataTypes,{“NomContact”, “TelephoneContact”, “EmailContact”, “FonctionContact”},Combiner.CombineTextByDelimiter(“|”, QuoteStyle.None),”InfosClient”),
GrouperSurCodeClient = Table.Group(FusionColonnesContacts, {“CodeClient”}, {{“AllRows”, each _, type table [Code client=nullable number, NomContact=nullable text, TelephoneContact=nullable text, EmailContact=nullable text, FonctionContact=nullable text]}}),
TransposeColonnesContact = Table.AddColumn(GrouperSurCodeClient,”TransposeColonnes”, each Table.Transpose(Table.SelectColumns([AllRows],{“InfosClient”}))),
DevelopperColonnesContacts = Table.ExpandTableColumn(TransposeColonnesContact, “TransposeColonnes”, {“Column1”, “Column2”, “Column3”}, {“Contact 1”, “Contact 2”, “Contact 3”}),
FractionneColonneContact1 = Table.SplitColumn(DevelopperColonnesContacts, “Contact 1”, Splitter.SplitTextByDelimiter(“|”, QuoteStyle.Csv), {“NomContact 1”, “TelephoneContact 1”, “EmailContact 1”, “FonctionContact 1”}),
FractionneColonneContact2 = Table.SplitColumn(FractionneColonneContact1, “Contact 2”, Splitter.SplitTextByDelimiter(“|”, QuoteStyle.Csv), {“NomContact 2”, “TelephoneContact 2”, “EmailContact 2”, “FonctionContact 2”}),
FractionneColonneContact3 = Table.SplitColumn(FractionneColonneContact2, “Contact 3”, Splitter.SplitTextByDelimiter(“|”, QuoteStyle.Csv), {“NomContact 3”, “TelephoneContact 3”, “EmailContact 3”, “FonctionContact 3”}),
ModificationDataTypes_1 = Table.TransformColumnTypes(FractionneColonneContact3,{{“NomContact 1”, type text}, {“TelephoneContact 1”, type text}, {“EmailContact 1”, type text}, {“FonctionContact 1”, type text},{“NomContact 2”, type text}, {“TelephoneContact 2”, type text}, {“EmailContact 2”, type text}, {“FonctionContact 2”, type text},{“NomContact 3”, type text}, {“TelephoneContact 3”, type text}, {“EmailContact 3”, type text}, {“FonctionContact 3”, type text}}),
SuppressionColonneAllRows = Table.RemoveColumns(ModificationDataTypes_1,{“AllRows”})
in
SuppressionColonneAllRowsCe n’est pas parfait sur la fin car le fractionnement des trois colonnes implique qu’il n’y en ait pas plus de trois autrement il faudra adapter la requête afin d’ajouter un ou plusieurs fractionnements.
Peut-être cela te donnera-t-il des pistes de réflexions tout au moins je l’espère.
Cordialement
DanielAttachments:
You must be logged in to view attached files.Daniel
ParticipantBonjour alexleseche2, le Forum,
1 – Création d’une table de dates (utilisation des fonctions TimeIntelligence)
2 – Duplication de cette table de dates, la nouvelle table que j’ai nommée dimDateS pour table Dates Segment.
Ce qui nous donne dimDates et dimDatesS comme table de dates.
3 – Liaison à faire entre la tables des quittances (date début) et dimDates (date)
4 – Création de la mesure suivante :
Montant quittance (periode) =
VAR DateFinSegment = MAX( DimDatesF[Date] )
VAR DateDebutSegment = min(DimDatesF[Date])
VAR DateDebutQuittance = MIN( tabQuittances[Date début])
VAR DateFinQuittance = MIN( tabQuittances[Date fin])
VAR nbJours = DATEDIFF(IF(DateDebutQuittance > DateDebutSegment, DateDebutQuittance, DateDebutSegment), IF(DateFinQuittance < DateFinSegment, DateFinQuittance, DateFinSegment), DAY)+1
VAR nbJoursQuittance = DATEDIFF(MIN(tabQuittances[Date début]), MAX(tabQuittances[Date fin]), DAY)+1
VAR MttQuittanceParJour = [Mtt_Quittance]/nbJoursQuittance
RETURN
SUMX(VALUES(tabQuittances[Quittance]), mttQuittanceParJour*nbJours)Dans le fichier joint, tu trouveras deux colonnes de calcul
“MttPeriodeSegment” utilisant plusieurs mesures pour le calcul, je ne les détaille pas ici (voir fichier pbix) et “Montant quittance (periode)” regroupant toutes ces mesures dans des variables. Les deux donnant le résultat attendu.
D’autres membres auront certainement d’autres solutions à te proposer.
Cordialement
DanielAttachments:
You must be logged in to view attached files.Daniel
ParticipantBonjour hboisteau, le Forum,
Je faisais juste référence à ton post du 25/02/23 ou si je ne m’abuse une question similaire était posée et à laquelle j’avais apporté des éléments de réponse. Si je me trompe, alors mes excuses, mais il est difficile de répondre à partir d’une vue finale sans connaître le modèle de données. La fonction DAX ‘SamePerdiodLastYear([calendrier[Date]’ devrait être utilisée pour le calcul correspondant aux valeurs de l’année passée.
Cordialement
DanielDaniel
ParticipantBonjour hboisseau, le Forum,
Le fichier joint est-il le résultat final à obtenir ou est-ce que ce sont les données à importer ?
Une table de dates doit être incorporée pour utiliser les fonctions Time intelligence. Pour les mesures voir le post du 25/02/23 cela devrait te donner des pistes.
Cordialement
DanielDaniel
ParticipantBonjour hboisteau, le Forum,
L’utilisation des fonction de Time Intelligence nécessite la création d’une table de dates, reprenant toutes les dates d’une année ou plus si nécessaire. L’ajout de colonnes dans cette table peuvent là aussi être conseillées comme le nom du mois, le numéro du mois, l’année ou le trimestre et d’autres encore selon le besoin.
J’ai modifié légèrement ton tableau (voir pièce jointe). Chargement dans Power BI et création de mesures.
TotalJournalier = SUM(tabDataResultatJournalier[Résultat journalier])
SameDateLastMonth = IF(ISBLANK([TotalJournalier]),BLANK(),CALCULATE([TotalJournalier], DATEADD(dimDates[Date], -1, MONTH)))
Différence_Jour = if(ISBLANK([SameDateLastMonth]),BLANK(),[TotalJournalier] – [SameDateLastMonth])CumulMensuel = if(ISBLANK([TotalJournalier]),BLANK(),CALCULATE([TotalJournalier],DATESMTD(dimDates[Date])))
SamePeriodLastMonth = IF(ISBLANK([CumulMensuel]),BLANK(),CALCULATE([CumulMensuel], DATEADD(dimDates[Date], -1, MONTH)))
Différence_Mois = if(ISBLANK([SamePeriodLastMonth]),BLANK(),[CumulMensuel] – [SamePeriodLastMonth])CumulAnnuel = if(ISBLANK([TotalJournalier]),BLANK(),CALCULATE([TotalJournalier],DATESYTD(dimDates[Date])))
SamePeriodLastYear = IF(ISBLANK([CumulAnnuel]),BLANK(),CALCULATE([CumulAnnuel], DATEADD(dimDates[Date], -1, MONTH)))
Différence_Annee = if(ISBLANK([SamePeriodLastYear]),BLANK(),[CumulAnnuel] – [SamePeriodLastYear])En les plaçant dans un visuel de type Matrice, cela donne le résultat escompté (voir image en pièce jointe).
En espérant que cela t’aidera.
Cordialement
DanielAttachments:
You must be logged in to view attached files.Daniel
ParticipantBonjour Yohan, le Forum,
J’aurais tendance à créer une colonne calculée dans le modèle de données qui calculerait le nombre de jours en fonction de tes trois cas
Exemple
Nb_Jours =
VAR __JourSemDebut = WEEKDAY(Dates[Date début])
VAR __JourSemFin = WEEKDAY(Dates[Date fin])
VAR __JoursTravailles = NETWORKDAYS(Dates[Date début], Dates[Date fin],true)
RETURN
if(__JourSemDebut=5 && __JourSemFin = 1,__JoursTravailles+1,__JoursTravailles)if(__JourSemDebut=5 && __JourSemFin = 1 représente le cas ou la date de début tombe un Jeudi et la date de fin un dimanche, auquel cas on ajoute un jour représentant le Samedi au nombre de jours considérés comme travaillés. Les deux autres cas, un simple calcul des jours travaillés entre deux dates devrait suffire.
D’autres solutions seront probablement proposées par d’autres membres, n’ayant pas trouvé plus simple, je te propose cette solution.
Cordialement
DanielDaniel
ParticipantBonjour r_naish24, le Forum,
Est-ce que tu ajoute bien une colonne (onglet Modélisation, nouvelle colonne) et non pas une mesure (qui normalement dans ce cas doit te retourner cette erreur).
En ajoutant une colonne et en reprenant la formule indiqué dans ton post, chez moi cela fonctionne bien.
Cordialement
DanielDaniel
ParticipantBonjour hboisteau, le Forum,
Pour répondre à la demande, par rapport aux données fournies, voici deux propositions :
1ère solution (voir l’exemple 2), assez simple dépivoter les colonnes contenant les valeurs ce qui nous donne une colonne Attribut contenant les noms (Valeur 1, Valeur 2, Valeur 3) et une colonne Valeur contenant les différents nombres. Ensuite, pour les étapes suivantes on peut repartir de l’exemple que j’ai donné dans un précédent post.
2ème solution : (voir l’exemple 3), je me suis inspiré d’une réponse fournie par Stéphane Lorin (merci à lui).
En fait, avec un requête contenant les données d’origine, une 2ème calculant les écarts et une 3ème regroupant les deux précédentes, on obtient bien le résultat. Peut-être que d’autres solutions plus optimales seront proposées.
La présentation des données dans les différents exemples, dépend surtout de l’utilisation des données dans un tableau de bord, je pense qu’une présentation sous la forme du 2ème exemple se prête mieux à des synthèses (matrices dans Power BI par exemple ou tableaux croisés dynamiques dans Excel).
Voir fichier ci-joint (hboisteau_1-1.xlsx). autre fichier joint par erreur
Cordialement
DanielAttachments:
You must be logged in to view attached files.20 février 2023 à 12 h 44 min en réponse à : Calcul de date entre dernier jour travaillé et premir jour de reprise travail #125791Daniel
ParticipantBonjour konanothnielr, le Forum,
Ok, je comprends alors peut-être que la fonction suivante OFFSET devrait, je pense répondre à cette problématique. Regarde le lien ci-dessous sur le site de Microsoft.
https://learn.microsoft.com/en-us/dax/offset-function-dax
Exemple d’utilisation
Previous sumo of Price = CALCULATE(
SUM(Sheet1[Price]),
OFFSET(
-1,
ALLSELECTED(Sheet1[Color])))Cordialement
DanielAttachments:
You must be logged in to view attached files. -
AuteurMessages