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: 2
  • TestFinal_Automatisation.xls
    50.5 KB · Affichages: 0
Dernière édition:

vgendron

XLDnaute Barbatruc
bon.. ce serait sympa d'arreter de dire "ca ne marche pas, je sais pas faire....."
ca donne quand meme l'impression que tu ne fais pas d'effort

1) je t'ai dit qu'il fallait trier tes données sur la colonne A, puis la colonne B==> la macro donnera donc le résultat attendu

2) dans ta feuille résultat attendu, je vois une ligne avec le dossier 4
il me semblait que tu avais dit que si on avait une seule ligne pour un dossier, alors, elle est supprimée...???
 

chris

XLDnaute Barbatruc
Bonjour

Pas de MP non sollicité, merci.

C'est une solution Excel mais elle peut fonctionner dans Power BI puisque PowerQuery fait aussi partie de Power BI

Si cela peut aider voici le code de la requête
VB:
let
    Source = Excel.CurrentWorkbook(){[Name="Dossiers"]}[Content],
    Etat1 = Table.TransformColumnTypes(Source,{{"N°DOSSIER ", Int64.Type}, {"DATE", type date}, {"STATUT", type text}}),
    #"Lignes groupées" = Table.Group(Etat1, {"N°DOSSIER "}, {{"D1", each List.Min([DATE]), type nullable date}, {"D2", each List.Max([DATE]), type nullable date}}),
    #"Personnalisée ajoutée" = Table.AddColumn(#"Lignes groupées", "Filtre", each if [D1] = [D2] 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 "}, "Attribut", "DATE"),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Supprimer le tableau croisé dynamique des autres colonnes",{"Attribut"}),
    #"Requêtes fusionnées" = Table.NestedJoin(#"Colonnes supprimées", {"N°DOSSIER ", "DATE"}, Etat1, {"N°DOSSIER ", "DATE"}, "Etat1", JoinKind.Inner),
    #"Etat1 développé" = Table.ExpandTableColumn(#"Requêtes fusionnées", "Etat1", {"STATUT"}, {"STATUT"}),
    #"Lignes triées" = Table.Sort(#"Etat1 développé",{{"N°DOSSIER ", Order.Ascending}, {"DATE", Order.Ascending}})
in
    #"Lignes triées"

Le tableau source a été mis sous forme de tableau structuré nommé Dossiers
 

mo_owen

XLDnaute Nouveau
bon.. ce serait sympa d'arreter de dire "ca ne marche pas, je sais pas faire....."
ca donne quand meme l'impression que tu ne fais pas d'effort

1) je t'ai dit qu'il fallait trier tes données sur la colonne A, puis la colonne B==> la macro donnera donc le résultat attendu

2) dans ta feuille résultat attendu, je vois une ligne avec le dossier 4
il me semblait que tu avais dit que si on avait une seule ligne pour un dossier, alors, elle est supprimée...???
Oui bien-sûr c'est exacte
 

mo_owen

XLDnaute Nouveau
Bonjour

Pas de MP non sollicité, merci.

C'est une solution Excel mais elle peut fonctionner dans Power BI puisque PowerQuery fait aussi partie de Power BI

Si cela peut aider voici le code de la requête
VB:
let
    Source = Excel.CurrentWorkbook(){[Name="Dossiers"]}[Content],
    Etat1 = Table.TransformColumnTypes(Source,{{"N°DOSSIER ", Int64.Type}, {"DATE", type date}, {"STATUT", type text}}),
    #"Lignes groupées" = Table.Group(Etat1, {"N°DOSSIER "}, {{"D1", each List.Min([DATE]), type nullable date}, {"D2", each List.Max([DATE]), type nullable date}}),
    #"Personnalisée ajoutée" = Table.AddColumn(#"Lignes groupées", "Filtre", each if [D1] = [D2] 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 "}, "Attribut", "DATE"),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Supprimer le tableau croisé dynamique des autres colonnes",{"Attribut"}),
    #"Requêtes fusionnées" = Table.NestedJoin(#"Colonnes supprimées", {"N°DOSSIER ", "DATE"}, Etat1, {"N°DOSSIER ", "DATE"}, "Etat1", JoinKind.Inner),
    #"Etat1 développé" = Table.ExpandTableColumn(#"Requêtes fusionnées", "Etat1", {"STATUT"}, {"STATUT"}),
    #"Lignes triées" = Table.Sort(#"Etat1 développé",{{"N°DOSSIER ", Order.Ascending}, {"DATE", Order.Ascending}})
in
    #"Lignes triées"

Le tableau source a été mis sous forme de tableau structuré nommé Dossiers
Merci beaucoup pour ton code prenez tous soin de vous
 

mo_owen

XLDnaute Nouveau
Bonjour

Pas de MP non sollicité, merci.

C'est une solution Excel mais elle peut fonctionner dans Power BI puisque PowerQuery fait aussi partie de Power BI

Si cela peut aider voici le code de la requête
VB:
let
    Source = Excel.CurrentWorkbook(){[Name="Dossiers"]}[Content],
    Etat1 = Table.TransformColumnTypes(Source,{{"N°DOSSIER ", Int64.Type}, {"DATE", type date}, {"STATUT", type text}}),
    #"Lignes groupées" = Table.Group(Etat1, {"N°DOSSIER "}, {{"D1", each List.Min([DATE]), type nullable date}, {"D2", each List.Max([DATE]), type nullable date}}),
    #"Personnalisée ajoutée" = Table.AddColumn(#"Lignes groupées", "Filtre", each if [D1] = [D2] 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 "}, "Attribut", "DATE"),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Supprimer le tableau croisé dynamique des autres colonnes",{"Attribut"}),
    #"Requêtes fusionnées" = Table.NestedJoin(#"Colonnes supprimées", {"N°DOSSIER ", "DATE"}, Etat1, {"N°DOSSIER ", "DATE"}, "Etat1", JoinKind.Inner),
    #"Etat1 développé" = Table.ExpandTableColumn(#"Requêtes fusionnées", "Etat1", {"STATUT"}, {"STATUT"}),
    #"Lignes triées" = Table.Sort(#"Etat1 développé",{{"N°DOSSIER ", Order.Ascending}, {"DATE", Order.Ascending}})
in
    #"Lignes triées"

Le tableau source a été mis sous forme de tableau structuré nommé Dossiers
Merci beaucoup pour ton code
 

mo_owen

XLDnaute Nouveau
Bonjour

Pas de MP non sollicité, merci.

C'est une solution Excel mais elle peut fonctionner dans Power BI puisque PowerQuery fait aussi partie de Power BI

Si cela peut aider voici le code de la requête
VB:
let
    Source = Excel.CurrentWorkbook(){[Name="Dossiers"]}[Content],
    Etat1 = Table.TransformColumnTypes(Source,{{"N°DOSSIER ", Int64.Type}, {"DATE", type date}, {"STATUT", type text}}),
    #"Lignes groupées" = Table.Group(Etat1, {"N°DOSSIER "}, {{"D1", each List.Min([DATE]), type nullable date}, {"D2", each List.Max([DATE]), type nullable date}}),
    #"Personnalisée ajoutée" = Table.AddColumn(#"Lignes groupées", "Filtre", each if [D1] = [D2] 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 "}, "Attribut", "DATE"),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Supprimer le tableau croisé dynamique des autres colonnes",{"Attribut"}),
    #"Requêtes fusionnées" = Table.NestedJoin(#"Colonnes supprimées", {"N°DOSSIER ", "DATE"}, Etat1, {"N°DOSSIER ", "DATE"}, "Etat1", JoinKind.Inner),
    #"Etat1 développé" = Table.ExpandTableColumn(#"Requêtes fusionnées", "Etat1", {"STATUT"}, {"STATUT"}),
    #"Lignes triées" = Table.Sort(#"Etat1 développé",{{"N°DOSSIER ", Order.Ascending}, {"DATE", Order.Ascending}})
in
    #"Lignes triées"

Le tableau source a été mis sous forme de tableau structuré nommé Dossiers
Merci beaucoup pour ton code
RE

Finalement tu ne dis pas si tu as essayé le fichier Excel que j'avais joint et donne bien le résultat attendu sans VBA...
Désolé Chris je ne l'ai pas encore essayé je te fais le CR dans peu de temps.Merci
 

mo_owen

XLDnaute Nouveau
Bonjour, Heureux de t'écris ta requ
Bonjour

Pas de MP non sollicité, merci.

C'est une solution Excel mais elle peut fonctionner dans Power BI puisque PowerQuery fait aussi partie de Power BI

Si cela peut aider voici le code de la requête
VB:
let
    Source = Excel.CurrentWorkbook(){[Name="Dossiers"]}[Content],
    Etat1 = Table.TransformColumnTypes(Source,{{"N°DOSSIER ", Int64.Type}, {"DATE", type date}, {"STATUT", type text}}),
    #"Lignes groupées" = Table.Group(Etat1, {"N°DOSSIER "}, {{"D1", each List.Min([DATE]), type nullable date}, {"D2", each List.Max([DATE]), type nullable date}}),
    #"Personnalisée ajoutée" = Table.AddColumn(#"Lignes groupées", "Filtre", each if [D1] = [D2] 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 "}, "Attribut", "DATE"),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Supprimer le tableau croisé dynamique des autres colonnes",{"Attribut"}),
    #"Requêtes fusionnées" = Table.NestedJoin(#"Colonnes supprimées", {"N°DOSSIER ", "DATE"}, Etat1, {"N°DOSSIER ", "DATE"}, "Etat1", JoinKind.Inner),
    #"Etat1 développé" = Table.ExpandTableColumn(#"Requêtes fusionnées", "Etat1", {"STATUT"}, {"STATUT"}),
    #"Lignes triées" = Table.Sort(#"Etat1 développé",{{"N°DOSSIER ", Order.Ascending}, {"DATE", Order.Ascending}})
in
    #"Lignes triées"

Le tableau source a été mis sous forme de tableau structuré nommé Dossiers
Bonjour Chris, Heureux de t'écrire ta requête marche super bien sur mon jeu de données test encore une fois merci,
cependant je suis entrain de le testé sur mon jeu de données original, il marche très bien sauf que je suis bloqué au niveau de cette partie et si possible j'aimerais plus d'éclaircissement merci.


#"Supprimer le tableau croisé dynamique des autres colonnes" = Table.UnpivotOtherColumns(#"Lignes filtrées", {"N°DOSSIER "}, "Attribut", "DATE"),
#"Colonnes supprimées" = Table.RemoveColumns(#"Supprimer le tableau croisé dynamique des autres colonnes",{"Attribut"}),
#"Requêtes fusionnées" = Table.NestedJoin(#"Colonnes supprimées", {"N°DOSSIER ", "DATE"}, Etat1, {"N°DOSSIER ", "DATE"}, "Etat1", JoinKind.Inner),
#"Etat1 développé" = Table.ExpandTableColumn(#"Requêtes fusionnées", "Etat1", {"STATUT"}, {"STATUT"}),
#"Lignes triées" = Table.Sort(#"Etat1 développé",{{"N°DOSSIER ", Order.Ascending}, {"DATE", Order.Ascending}})
 

chris

XLDnaute Barbatruc
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
 

Discussions similaires

Réponses
8
Affichages
459

Statistiques des forums

Discussions
315 093
Messages
2 116 132
Membres
112 667
dernier inscrit
foyoman