Microsoft 365 Excel VBA

mo_owen

XLDnaute Nouveau
Bonjour à tous je suis novice en VBA et j'ai besoin de votre aide

Voici le fichier Excel ci joint

Il comporte trois feuilles excel. (ORIGINAL, RESULTAT ATTENDU, COPY_ORIGINAL_POUR_TEST).

Je voudrais si possible un code qui se rapproche de la suppression des doublons mais pas que. J'ai besoin d'un code qui garde le plus ancien et le plus récent dossier pour un numéro de dossier donné.

Cependant, Dans le fichier j'ai des doublons, un dossier unique, des triplons, quatriplons etc.....


Résultat attendu:
Besoin de 2 lignes (le plus ancien et la plus récent pour chaque numéro de dossier dossier en prenant en compte le code journal A) pour chaque dossier à savoir le premier dossier (le plus ancien dossier) et le dernier dossier (le plus récent) du même numéro de dossier.)

je récapitule : Si le code journal == A alors récupère le dossier le plus ancien et le plus récent; mais pour chaque numéro de dossier

Cordialement
Merci pour votre aide
 

Pièces jointes

  • TestFinal_Automatisation.xlsx
    12 KB · Affichages: 1
  • TestFinal_Automatisation.xls
    50.5 KB · Affichages: 0
Dernière édition:

mo_owen

XLDnaute Nouveau
Bonjour tous

Etapes depuis le début :
Tu mets ton vrai jeu de données sous forme de tableau structuré nommé Dossiers (on utilise les tableaux structurés depuis 19 ans dans Excel)
puis
  • depuis une cellule du tableau, Données, A partir d'un tableau : cela ouvre PowerQuery
  • il y a deux étapes listées à droite pour la requête qui s'est créée : renommer l'étape 2 de typage en Etat1
  • sélectionner la colonne N°DOSSIER clic droit, Regrouper par : en opérations utiliser le Min et le Max de DATE
  • Ajouter une colonne, Colonne Personnalisée, Nom Filtre, formule
    =if [D1] = [D2] then null else 1
  • filtrer cette colonne pour ne garder que 1
  • sélectionner les colonnes N°DOSSIER et Filtre, clic droit Dépivoter les autres colonnes
    Dans la barre de formule remplacer Valeur par DATE
  • supprimer les colonnes Filtre et Attribut
  • Accueil, Fusionner les requêtes : on ne peut choisir que la requête en cours.
    Sélectionner dans les 2 tableaux, les deux colonnes, Type de jointure Interne.
    Dans la barre de formule, remplacer le 2ème #"Colonnes supprimées" par Etat1 et
    "Colonnes supprimées" par "Etat1"
  • Cliquer sur la double flèche près du titre Etat1 : décocher tout sauf STATUT
  • Trier par N°DOSSIER et DATE
  • sortir par Fermer et Charger dans, Tableau et choisir la destination
Super ton explication merci beaucoup. Cela résout mon problème

J'ai deux dernières préoccupations :

1-Serait-il possible de savoir comment faire une différence de date lorsque les deux dates sur lesquelles l'on doit faire la différence sont dans la même colonne de date sous BI pour un même dossier. Sur Excel on fait soit A1-A2 ou A2-A1 si les dossiers se suivent mais sous BI on n'a pas cette possibilité, y'a t'il un moyen de faire ce calcul. Merci

2- y a t'il un moyen de faire le calcul suivant sans supprimer les autres dossiers. C'est a dire faire la différence de date entre le dossier le plus récent et le dossier le plus ancien pour un même numéro de dossier.
Par exemple :
N°D MTT DATEDATE
123 200 01/01/2010
123 100 02/12/2011
123 677 01/01/2016
123 500 01/01/2017
400 900 01/01/2015
500 700 01/01/2017
500 500 01/01/2019
700 400 05/09/2011
700 400 05/09/2016
700 400 05/09/2017

Résultat attendu

N°D MTT DATEDATE MTTDIFF DATEDIFF_EN_JOUR
123 200 01/01/2010 200-200 01/01/2010 - 01/01/2010
123 100 02/12/2011 100-200 02/12/2011 - 01/01/2010
123 600 01/01/2016 600-200 01/01/2016 - 01/01/2010
123 500 01/01/2017 500-200 01/01/2016 - 01/01/2010
400 900 01/01/2015 900-900 01/01/2015 - 01/01/2015
500 700 01/01/2017 700-700 01/01/2017 - 01/01/2017
500 500 01/01/2019 500-700 01/01/2019 - 01/01/2017
700 400 05/09/2011 400-400 05/09/2011 - 05/09/2011
700 500 05/09/2016 500-400 05/09/2016 - 05/09/2011
700 600 05/09/2017 600-400 05/09/2017 - 05/09/2011
 
Dernière édition:

chris

XLDnaute Barbatruc
Bonjour
Avec la tableau source nommé Dossiers2
VB:
let
    Source = Excel.CurrentWorkbook(){[Name="Dossiers2"]}[Content],
    #"Index ajouté" = Table.AddIndexColumn(Source, "Index", 0, 1, Int64.Type),
    Etat1 = Table.TransformColumnTypes(#"Index ajouté",{{"N°D", Int64.Type}, {"MTT", Int64.Type}, {"DATE", type date}}),
    #"Lignes groupées" = Table.Group(Etat1, {"N°D"}, {{"DATE DIFF", each List.Min([DATE]), type nullable date}}),
    #"Requêtes fusionnées1" = Table.NestedJoin(#"Lignes groupées", {"N°D", "DATE DIFF"}, Etat1, {"N°D", "DATE"}, "Etat1", JoinKind.Inner),
    Etat2 = Table.ExpandTableColumn(#"Requêtes fusionnées1", "Etat1", {"MTT", "Index"}, {"MTT", "Index"}),
    #"Requêtes fusionnées" = Table.NestedJoin(Etat1, {"N°D", "DATE"}, Etat2, {"N°D", "DATE DIFF"}, "Etat2", JoinKind.LeftOuter),
    #"Etat2 développé" = Table.ExpandTableColumn(#"Requêtes fusionnées", "Etat2", {"MTT","DATE DIFF"}, {"MTT DIFF","DATE DIFF"}),
    #"Lignes triées" = Table.Sort(#"Etat2 développé",{{"Index", Order.Ascending}}),
    #"Rempli vers le bas" = Table.FillDown(#"Lignes triées",{"MTT DIFF","DATE DIFF"}),
    #"Valeur remplacée" = Table.ReplaceValue(#"Rempli vers le bas",each [MTT DIFF],each Text.From([MTT])&" - "&Text.From([MTT DIFF]),Replacer.ReplaceValue,{"MTT DIFF"}),
    #"Valeur remplacée1" = Table.ReplaceValue(#"Valeur remplacée",each [DATE DIFF],each Text.From([DATE])&" - "&Text.From([DATE DIFF]),Replacer.ReplaceValue,{"DATE DIFF"}),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Valeur remplacée1",{"Index"})
in
    #"Colonnes supprimées"
 

mo_owen

XLDnaute Nouveau
Bonjour
Avec la tableau source nommé Dossiers2
VB:
let
    Source = Excel.CurrentWorkbook(){[Name="Dossiers2"]}[Content],
    #"Index ajouté" = Table.AddIndexColumn(Source, "Index", 0, 1, Int64.Type),
    Etat1 = Table.TransformColumnTypes(#"Index ajouté",{{"N°D", Int64.Type}, {"MTT", Int64.Type}, {"DATE", type date}}),
    #"Lignes groupées" = Table.Group(Etat1, {"N°D"}, {{"DATE DIFF", each List.Min([DATE]), type nullable date}}),
    #"Requêtes fusionnées1" = Table.NestedJoin(#"Lignes groupées", {"N°D", "DATE DIFF"}, Etat1, {"N°D", "DATE"}, "Etat1", JoinKind.Inner),
    Etat2 = Table.ExpandTableColumn(#"Requêtes fusionnées1", "Etat1", {"MTT", "Index"}, {"MTT", "Index"}),
    #"Requêtes fusionnées" = Table.NestedJoin(Etat1, {"N°D", "DATE"}, Etat2, {"N°D", "DATE DIFF"}, "Etat2", JoinKind.LeftOuter),
    #"Etat2 développé" = Table.ExpandTableColumn(#"Requêtes fusionnées", "Etat2", {"MTT","DATE DIFF"}, {"MTT DIFF","DATE DIFF"}),
    #"Lignes triées" = Table.Sort(#"Etat2 développé",{{"Index", Order.Ascending}}),
    #"Rempli vers le bas" = Table.FillDown(#"Lignes triées",{"MTT DIFF","DATE DIFF"}),
    #"Valeur remplacée" = Table.ReplaceValue(#"Rempli vers le bas",each [MTT DIFF],each Text.From([MTT])&" - "&Text.From([MTT DIFF]),Replacer.ReplaceValue,{"MTT DIFF"}),
    #"Valeur remplacée1" = Table.ReplaceValue(#"Valeur remplacée",each [DATE DIFF],each Text.From([DATE])&" - "&Text.From([DATE DIFF]),Replacer.ReplaceValue,{"DATE DIFF"}),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Valeur remplacée1",{"Index"})
in
    #"Colonnes supprimées"
Bonjour Chris c'est la réponse à la seconde question ? Je l'ai pas encore testé mais je ne vais pas tarder. Merci beaucoup.

Pour la première question t'auras une réponse merci
 

chris

XLDnaute Barbatruc
RE
Oui mais en fait tu veux plutôt une opération et non la juxtaposition (tes exemples sont ambigus)
VB:
let
    Source = Excel.CurrentWorkbook(){[Name="Dossiers2"]}[Content],
    #"Index ajouté" = Table.AddIndexColumn(Source, "Index", 0, 1, Int64.Type),
    Etat1 = Table.TransformColumnTypes(#"Index ajouté",{{"N°D", Int64.Type}, {"MTT", Int64.Type}, {"DATE", type date}}),
    #"Lignes groupées" = Table.Group(Etat1, {"N°D"}, {{"DATE DIFF", each List.Min([DATE]), type nullable date}}),
    #"Requêtes fusionnées1" = Table.NestedJoin(#"Lignes groupées", {"N°D", "DATE DIFF"}, Etat1, {"N°D", "DATE"}, "Etat1", JoinKind.Inner),
    Etat2 = Table.ExpandTableColumn(#"Requêtes fusionnées1", "Etat1", {"MTT", "Index"}, {"MTT", "Index"}),
    #"Requêtes fusionnées" = Table.NestedJoin(Etat1, {"N°D", "DATE"}, Etat2, {"N°D", "DATE DIFF"}, "Etat2", JoinKind.LeftOuter),
    #"Etat2 développé" = Table.ExpandTableColumn(#"Requêtes fusionnées", "Etat2", {"MTT","DATE DIFF"}, {"MTT DIFF","DATE DIFF"}),
    #"Lignes triées" = Table.Sort(#"Etat2 développé",{{"Index", Order.Ascending}}),
    #"Rempli vers le bas" = Table.FillDown(#"Lignes triées",{"MTT DIFF","DATE DIFF"}),
    #"Valeur remplacée" = Table.ReplaceValue(#"Rempli vers le bas",each [MTT DIFF],each [MTT]-[MTT DIFF],Replacer.ReplaceValue,{"MTT DIFF"}),
    #"Valeur remplacée1" = Table.ReplaceValue(#"Valeur remplacée",each [DATE DIFF],each Duration.Days([DATE]-[DATE DIFF]),Replacer.ReplaceValue,{"DATE DIFF"}),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Valeur remplacée1",{"Index"})
in
    #"Colonnes supprimées"
 

mo_owen

XLDnaute Nouveau
RE
Oui mais en fait tu veux plutôt une opération et non la juxtaposition (tes exemples sont ambigus)
VB:
let
    Source = Excel.CurrentWorkbook(){[Name="Dossiers2"]}[Content],
    #"Index ajouté" = Table.AddIndexColumn(Source, "Index", 0, 1, Int64.Type),
    Etat1 = Table.TransformColumnTypes(#"Index ajouté",{{"N°D", Int64.Type}, {"MTT", Int64.Type}, {"DATE", type date}}),
    #"Lignes groupées" = Table.Group(Etat1, {"N°D"}, {{"DATE DIFF", each List.Min([DATE]), type nullable date}}),
    #"Requêtes fusionnées1" = Table.NestedJoin(#"Lignes groupées", {"N°D", "DATE DIFF"}, Etat1, {"N°D", "DATE"}, "Etat1", JoinKind.Inner),
    Etat2 = Table.ExpandTableColumn(#"Requêtes fusionnées1", "Etat1", {"MTT", "Index"}, {"MTT", "Index"}),
    #"Requêtes fusionnées" = Table.NestedJoin(Etat1, {"N°D", "DATE"}, Etat2, {"N°D", "DATE DIFF"}, "Etat2", JoinKind.LeftOuter),
    #"Etat2 développé" = Table.ExpandTableColumn(#"Requêtes fusionnées", "Etat2", {"MTT","DATE DIFF"}, {"MTT DIFF","DATE DIFF"}),
    #"Lignes triées" = Table.Sort(#"Etat2 développé",{{"Index", Order.Ascending}}),
    #"Rempli vers le bas" = Table.FillDown(#"Lignes triées",{"MTT DIFF","DATE DIFF"}),
    #"Valeur remplacée" = Table.ReplaceValue(#"Rempli vers le bas",each [MTT DIFF],each [MTT]-[MTT DIFF],Replacer.ReplaceValue,{"MTT DIFF"}),
    #"Valeur remplacée1" = Table.ReplaceValue(#"Valeur remplacée",each [DATE DIFF],each Duration.Days([DATE]-[DATE DIFF]),Replacer.ReplaceValue,{"DATE DIFF"}),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Valeur remplacée1",{"Index"})
in
    #"Colonnes supprimées"
Bonjour oui disons une opération qui me permet de faire ce calcul
 

mo_owen

XLDnaute Nouveau
RE
Oui mais en fait tu veux plutôt une opération et non la juxtaposition (tes exemples sont ambigus)
VB:
let
    Source = Excel.CurrentWorkbook(){[Name="Dossiers2"]}[Content],
    #"Index ajouté" = Table.AddIndexColumn(Source, "Index", 0, 1, Int64.Type),
    Etat1 = Table.TransformColumnTypes(#"Index ajouté",{{"N°D", Int64.Type}, {"MTT", Int64.Type}, {"DATE", type date}}),
    #"Lignes groupées" = Table.Group(Etat1, {"N°D"}, {{"DATE DIFF", each List.Min([DATE]), type nullable date}}),
    #"Requêtes fusionnées1" = Table.NestedJoin(#"Lignes groupées", {"N°D", "DATE DIFF"}, Etat1, {"N°D", "DATE"}, "Etat1", JoinKind.Inner),
    Etat2 = Table.ExpandTableColumn(#"Requêtes fusionnées1", "Etat1", {"MTT", "Index"}, {"MTT", "Index"}),
    #"Requêtes fusionnées" = Table.NestedJoin(Etat1, {"N°D", "DATE"}, Etat2, {"N°D", "DATE DIFF"}, "Etat2", JoinKind.LeftOuter),
    #"Etat2 développé" = Table.ExpandTableColumn(#"Requêtes fusionnées", "Etat2", {"MTT","DATE DIFF"}, {"MTT DIFF","DATE DIFF"}),
    #"Lignes triées" = Table.Sort(#"Etat2 développé",{{"Index", Order.Ascending}}),
    #"Rempli vers le bas" = Table.FillDown(#"Lignes triées",{"MTT DIFF","DATE DIFF"}),
    #"Valeur remplacée" = Table.ReplaceValue(#"Rempli vers le bas",each [MTT DIFF],each [MTT]-[MTT DIFF],Replacer.ReplaceValue,{"MTT DIFF"}),
    #"Valeur remplacée1" = Table.ReplaceValue(#"Valeur remplacée",each [DATE DIFF],each Duration.Days([DATE]-[DATE DIFF]),Replacer.ReplaceValue,{"DATE DIFF"}),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Valeur remplacée1",{"Index"})
in
    #"Colonnes supprimées"
Bonjour, je n'arrive pas à retrouver ces étapes pourrais tu m'aider merci avec le détail

#"Rempli vers le bas" = Table.FillDown(#"Lignes triées",{"MTT DIFF","DATE DIFF"}),
#"Valeur remplacée" = Table.ReplaceValue(#"Rempli vers le bas",each [MTT DIFF],each [MTT]-[MTT DIFF],Replacer.ReplaceValue,{"MTT DIFF"}),
#"Valeur remplacée1" = Table.ReplaceValue(#"Valeur remplacée",each [DATE DIFF],each Duration.Days([DATE]-[DATE DIFF]),Replacer.ReplaceValue,{"DATE DIFF"}),
#"Colonnes supprimées" = Table.RemoveColumns(#"Valeur remplacée1",{"Index"})
in
#"Colonnes supprimées"
 

mo_owen

XLDnaute Nouveau
Bonjour, je n'arrive pas à retrouver ces étapes pourrais tu m'aider merci avec le détail

#"Rempli vers le bas" = Table.FillDown(#"Lignes triées",{"MTT DIFF","DATE DIFF"}),
#"Valeur remplacée" = Table.ReplaceValue(#"Rempli vers le bas",each [MTT DIFF],each [MTT]-[MTT DIFF],Replacer.ReplaceValue,{"MTT DIFF"}),
#"Valeur remplacée1" = Table.ReplaceValue(#"Valeur remplacée",each [DATE DIFF],each Duration.Days([DATE]-[DATE DIFF]),Replacer.ReplaceValue,{"DATE DIFF"}),
#"Colonnes supprimées" = Table.RemoveColumns(#"Valeur remplacée1",{"Index"})
in
#"Colonnes supprimées"
Bonjour Chris vraiment excuse moi de te déranger une nouvelle fois, j'ai oublié le détail le plus important dans ma demande d'ou je reviens encore une fois de plus.

Ma demande reste toujours la meme mais cette fois si il faudrait que celui qui envoi le dossier soit celui à qui le dossier est renvoyé.

VOICI UN EXEMPLE MAIS IL Y A UN FICHIER EXCEL EN PIECE JOINTE.

1663916712720.png



SUR CE PREMIER RESULTAT ATTENDU JE VEUX FAIRE UNE DIFFERENCE DE DATE EN JOUR
 

Pièces jointes

  • test3.xlsx
    10.6 KB · Affichages: 2

mo_owen

XLDnaute Nouveau
Bonjour

Bis repetita : pas de MP non sollicité
J'ai une vie et du boulot en dehors des forums : donc si je ne suis pas en ligne...

Si tu repends ce post https://excel-downloads.com/threads/excel-vba.20070627/page-2#post-20534892
il suffit à l'étape
Cliquer sur la double flèche près du titre Etat1 : décocher tout sauf STATUT
de garder aussi cochées les 2 personnes
Bonjour Chris oui effectivement mais désolé, il n'y a pas que deux personnes, dois je cocher manuellement toutes les personnes ? Et a cette étape le trie a déjà été fait du coup j'ai pas le résultat escompté.
 

Pièces jointes

  • Screenshot_2022-09-24-02-26-35-670_com.android.chrome.jpg
    Screenshot_2022-09-24-02-26-35-670_com.android.chrome.jpg
    344.7 KB · Affichages: 19

mo_owen

XLDnaute Nouveau
REBonjour Chris, une fois le groupage fait avec Min et Max de la colonne DATE, la condition sur la colonne Personne1 et Personne2 n'est pas respecté car le groupage récupere uniquement pour chaque numéro de dossier le dossier le plus ancien et le plus récent d'où la condition sur la Personne1 et la Personne2 n'est plus respecté.
Peut être que je me trompes, mais tu pourras affirmer ou infirmer mes dis et voir. Merci

je tiens également à te remercier pour te temps que tu m'accorde vraiment merci beaucoup
 

chris

XLDnaute Barbatruc
RE
VB:
let
    Source = Excel.CurrentWorkbook(){[Name="Dossiers"]}[Content],
    Etat1 = Table.TransformColumnTypes(Source,{{"N°DOSSIER ", Int64.Type}, {"DATE", type date}, {"STATUT", type text}, {"PERSONNE 1", type text}, {"PERSONNE 2", type text}}),
    #"Lignes groupées" = Table.Group(Etat1, {"N°DOSSIER "}, {{"1", each List.Min([DATE]), type nullable date}, {"2", each List.Max([DATE]), type nullable date}}),
    #"Personnalisée ajoutée" = Table.AddColumn(#"Lignes groupées", "Filtre", each if [1]=[2] then null else 1),
    #"Lignes filtrées" = Table.SelectRows(#"Personnalisée ajoutée", each ([Filtre] = 1)),
    #"Supprimer le tableau croisé dynamique des autres colonnes" = Table.UnpivotOtherColumns(#"Lignes filtrées", {"N°DOSSIER ","Filtre"}, "Ord", "DATE"),
    #"Requêtes fusionnées" = Table.NestedJoin(#"Supprimer le tableau croisé dynamique des autres colonnes", {"N°DOSSIER ", "DATE"}, Etat1, {"N°DOSSIER ", "DATE"}, "Etat1", JoinKind.Inner),
    #"Etat1 développé" = Table.ExpandTableColumn(#"Requêtes fusionnées", "Etat1", {"STATUT", "PERSONNE 1", "PERSONNE 2"}, {"STATUT", "PERSONNE 1", "PERSONNE 2"}),
    #"Lignes triées" = Table.Sort(#"Etat1 développé",{{"N°DOSSIER ", Order.Ascending}, {"DATE", Order.Ascending}}),
    Etat2 = Table.AddIndexColumn(#"Lignes triées", "Index", 0, 1, Int64.Type),
    #"Personnalisée ajoutée1" = Table.AddColumn(Etat2, "ENVOYEUR", each if [Ord]="1" or [Index]=0 then [PERSONNE 1] else Etat2[PERSONNE 2]{[Index]-1}),
    #"Personnalisée ajoutée2" = Table.AddColumn(#"Personnalisée ajoutée1", "RECEPTEUR", each if [Ord]="1" or [Index]=0 then [PERSONNE 2] else Etat2[PERSONNE 1]{[Index]-1}),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Personnalisée ajoutée2",{"Filtre", "Ord", "PERSONNE 1", "PERSONNE 2", "Index"})
in
    #"Colonnes supprimées"
 

Discussions similaires

Réponses
8
Affichages
158
Réponses
9
Affichages
289

Statistiques des forums

Discussions
312 215
Messages
2 086 324
Membres
103 179
dernier inscrit
BERSEB50