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:

mo_owen

XLDnaute Nouveau
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"
Bonjour Chris merci pour ta réponse je te reviens
 

mo_owen

XLDnaute Nouveau
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"
Bonjour Chris, je te remercie encore une fois,
j'ai appliqué le code, le résultat escompté est bon pour certains dossiers et pas pour tous les dossiers notamment les N° DOSSIER 123, 145 au niveau de la condition Personne 1 et Personne 2 (Pour ces dossiers, la date et le statut ne correspondent pas, ces lignes ont été involontairement supprimer par le filtre de date). Je penses qu'on devrait appliquer le filtre sur les personnes 1&2 (garder tous les Dossiers qui respectent la condition sur les Personnes 1&2 puis appliquer le filtre de la date (enfin je penses) pourras tu le confirmer avec moi. Merci)

Merci pour ton temps.
ci joint une image
1664081079674.png
 

chris

XLDnaute Barbatruc
Bonjour
A toi de préciser davantage tes règles : on démarre par les dates extrêmes mais il semble que cela ne soit plus cela
Indiques clairement toutes les règles parce que là on n'y comprend plus rien...

Par ailleurs arrête de citer à chaque fois le message précédent en particulier quand tu y réponds directement, cela nuit à le lisibilité
 

mo_owen

XLDnaute Nouveau
Bonjour
A toi de préciser davantage tes règles : on démarre par les dates extrêmes mais il semble que cela ne soit plus cela
Indiques clairement toutes les règles parce que là on n'y comprend plus rien...

Par ailleurs arrête de citer à chaque fois le message précédent en particulier quand tu y réponds directement, cela nuit à le lisibilité
Bonjour Chris,

Pour chaque numéro de dossier, il y a la date d'envoi du dossier et la personne qui a envoyé le dossier donc on peut avoir un historique sur le dossier.
Normalement pour chaque dossier, il devrait y avoir un retour ou une réponse au dossier à la personne qui a envoyé le dossier si on a pas ce retour le dossier est supprimé.

Donc l'envoi du dossier avec pour sens A vers B se fait à une date puis la réponse ou le retour fait B vers A a une autre date.

sauf que pour le sens A vers B (l'envoi du dossier), je veux récupérer la date la plus ancienne et pour le sens B vers A (le retour du dossier), je veux récupérer la date la plus récente.

Il est a noter, tout envoi de dossier pars toujours de A (A envoi toujours le dossier aux personnes B ou Z ou I ou H etc... d'ou on peut avoir les sens A vers B, ou A vers C ou A vers Z etc....)

C'est la personne qui reçoit le dossier envoyé par A qui renvoi le dossier a A. d'où
A vers B
B vers A
Ou
A vers Z
Z vers A

Quelque soit le dossier, A est toujours l'envoyeur et le récepteur lors de la réponse ou du retour du dossier.

Celui qui reçoit le dossier de A, doit être celui qui renvoi le dossier a A.

pour l'envoi du dossier je veux l'envoi avec la date la plus ancienne et pour la réponse ou le retour du dossier, je veux la réponse ou le retour avec la date la plus récente.

Merci et désolé si je n'ai pas été clair dans mes explications et mes demandes precendantes.
 

Discussions similaires

Réponses
8
Affichages
459

Statistiques des forums

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