[Resolu] Trier 2 feuilles ou classeur

Bearn 64

XLDnaute Occasionnel
Bonjour le Forum,

Je viens vers vous pour une piste ou correction d'une macro trouvée sur le net et qui plante.
(par ma méconnaissance du VBA). Et de multiple recherches sur Excel Download que je n'ai su adapter.

Le but est de trier 2 classeurs excel qui sont mis a jour mensuellement.

Dans les fichiers joints :
soit 2 classeurs Ancien et Nouveau ou dans le même classeur macro Feuil1 ancien, Feuil2 nouveau

La feuille resultat devant contenir
en jaune les modifications,
en vert les ajouts sur nouveau par rapport a ancien.
en rouge les suppressions sur nouveau par rapport a ancien.

Le classeur joint est fait a titre d'exemple a la main.

La colonne CODE est avec des valeurs unique.
La colonne EMAIL peu être mise a jour.


Merci de toute aide ou piste pour arriver a bon port.
 

Pièces jointes

  • ancien.xlsx
    10.3 KB · Affichages: 35
  • ancien.xlsx
    10.3 KB · Affichages: 40
  • Classeur1.xlsm
    23 KB · Affichages: 58
  • Classeur1.xlsm
    23 KB · Affichages: 53
  • nouveau.xlsx
    10.4 KB · Affichages: 37
  • nouveau.xlsx
    10.4 KB · Affichages: 36
Dernière édition:

KIM

XLDnaute Accro
Bonjour Dranreb,
Bonjour le fil et le forum,
J'utilise ta macro depuis un bon moment. Elle est très pratique pour comparer des bases d'une année à une autre et surtout en intégrant une MeFC pour bien indiquer les cases modifiées.
Je compare 2016 à 2017, 2015 à 2017, etc.
Je me permets de revenir vers toi car je n'ai pas réussi à :
1/ Rajouter en col 46 le nom de la feuille de la ligne concernée
2/ Je souhaite comparer 5 années avec la dernière année : de 2012 à 2016 avec 2017 ?
Merci d'avance pour ton aide.
KIM
PS : Ci-dessous la macro utilisée :

Sub Comparaison1()
Dim Te(), Le&, Ts(), Ls&, Code As SsGroup, Détail, C&, VLgNou(), VlgAnc(), Différent As Boolean, Cas As Byte
CréerTableUnique Te, Array(PlgUti(Feuil1.[A2]), PlgUti(Feuil2.[A2]))
ReDim Ts(1 To UBound(Te, 1), 1 To 45)
For Each Code In GroupOrg(Te, 3)
Cas = 0
For Each Détail In Code.Contenu
If Détail(0) = 0 Then
VlgAnc = Détail: Cas = 1
Else
VLgNou = Détail: Cas = Cas + 2
End If: Next Détail
Select Case Cas
Case 1: Ls = Ls + 1
For C = 1 To UBound(VlgAnc): Ts(Ls, C) = VlgAnc(C): Next C
Ts(Ls, 45) = "Supprimé"
Case 2: Ls = Ls + 1
For C = 1 To UBound(VLgNou): Ts(Ls, C) = VLgNou(C): Next C
Ts(Ls, 45) = "Ajouté"
Case Else:
For C = 1 To UBound(VLgNou)
Différent = VLgNou(C) <> VlgAnc(C): If Différent Then Exit For
Next C
If Différent Then
Ls = Ls + 1
For C = 1 To UBound(VlgAnc): Ts(Ls, C) = VlgAnc(C): Next C
Ts(Ls, 45) = "(Original)"
Ls = Ls + 1
For C = 1 To UBound(VLgNou): Ts(Ls, C) = VLgNou(C): Next C
Ts(Ls, 45) = "Modifié"
End If
End Select
Next Code
Feuil3.Rows(2).Resize(1000).ClearContents
Feuil3.[A2].Resize(Ls, UBound(Ts, 2)).Value = Ts
End Sub
 

Dranreb

XLDnaute Barbatruc
Bonjour.
1) — Déclarez NomsF(), au début faites NomsF = Array(Feuil1.Name, Feuil2.Name)
Vous aurez ainsi vos noms de feuille dépendant du Détail(0)
2) — Il est possible de spécifier plus de 2 tableaux au second paramètre de CréerTableUnique. Attention, il y aura aussi du coup plus de 2 valeur différentes de Détail(0).
 
Dernière édition:

KIM

XLDnaute Accro
Re Dranreb et le fil,
Merci pour ton retour rapide.
1/ J'ai rajouté les déclarations de NomF. Pour avoir le nom de l'onglet j'ai saisi en dur
Ts(Ls, 46) = NomsF(0) ou NomsF(1) selon la condition. J'ai contrôlé, c'est OK.
Par contre je n'ai pas pu faire le lien avec Détail(0). Comment faire?
2/ Je vais essayer.
Ci-joint le fichier avec tes derniers modules
Merci d'avance.
KIM
 

Pièces jointes

  • T_KIM_2017_v3.xlsm
    84.8 KB · Affichages: 18

Dranreb

XLDnaute Barbatruc
Je dirais :
Code:
CréerTableUnique Te, Array(PlgUti(Feuil1.[A2], CMin:=46), PlgUti(Feuil2.[A2], CMin:=46))
Et plus loin :
VB:
For Each Détail In Code.Co
      Détail(46) = NomsF(Détail(0))
      If Détail(0) = 0 Then
         etc.
Supprimez plus loin les affectation à Ts(Ls, 46): ce sera fait par la boucle, qui prendra d'office 46 colonnes avec le nom de feuille dans la dernière.
 

KIM

XLDnaute Accro
Re,
Merci encore de ton aide.
J'ai suivi à la lettre tes modifs dans la macro comparaison2. Je retrouve toutes lignes des 2 onglets même si elles sont identiques (20 lignes).
Je mets en commentaire la ligne ' Détail(46) = NomsF(Détail(0))
et je retrouve les 8 lignes différentes des 2 onglets. Est-ce le fait que les 2 cellules Détail(46) ne sont pas identiques ?
Merci d'avance
KIM
 

Pièces jointes

  • T_KIM_2017_v31.xlsm
    95.1 KB · Affichages: 16

KIM

XLDnaute Accro
Bonsoir Dranreb,
J'ai remplace For C = 1 To UBound(VlgAnc) et For C = 1 To UBound(VLgNou) par For C=1 To 45, je retrouve mes 8 lignes de différences par contre sans le nom de l'onglet en col 46 ne s'affiche plus.
Pourquoi quand on rajoute en col 45 les commentaires "(Original)" et "Modifié" la macro ne considère pas que toutes les lignes des 2 feuilles sont différentes ?
Merci pour ta patience
KIM
 

KIM

XLDnaute Accro
Bonjour Dranreb et le fil,
Journée chargée, en effet je viens d'appliquer la boucle For C=1 To 45 sur la variable nommée Différent.
Test OK.
Pour le cas 2, comparer plusieurs années de 2012 à 2017, j'applique la macro sur chaque année avec la 2017. J'ai 5 onglets de type Résultat et ensuite je créé un seul onglet avec les données de ces 5 onglets Résultat.
Cette méthode fonctionne.
Sans vouloir abuser, j'ai compris que c'est possible de traiter ces onglets avec CréerTableUnique par contre les boucles deviennent lourdes à gérer. Si le temps te permet je suis preneur de ta solution. Cela me permet de traiter cette comparaison avec une seule macro et évitre de la dupliquer pour chaque couple d'années.
Merci encore pour ton aide.
J'utilise déjà la macro dans son état actuel sans problème.
Bonne fin de journée
KIM
 

Dranreb

XLDnaute Barbatruc
Bonsoir.
Écrivez le vous même.
Comme dit l'aide de GigIdx :
Function TableUnique(ParamArray TP() As Variant) As Variant()
Renvoie un tableau unique où sont empilés l'un derrière l'autre plusieurs tableaux de
diverses sources. La seconde dimension des différents tableaux doit commencer à 1.
Cependant dans le tableau résultant elle commencera à 0,
l'élément 0 restituant le numéro d'ordre de la source, la 1ère étant 0.
Bien que 2 soit le plus fréquent, il n'y a donc pas de limite théorique au nombre d'expressions tableaux qu'on peut empiler.
Après il faut réfléchie à ce qu'il faut écrire derrière pour l'exploiter comme on veut, c'est tout.
 

KIM

XLDnaute Accro
Bonsoir Dranreb,
Bonsoir le fil & le forum,
1/ En effet cela revient toujours à comparer à chaque fois 2 onglets. Pour les 2 onglets, je définis :
NomsF = Array(Feuil1.Name, Feuil2.Name)
CréerTableUnique Te, Array(PlgUti(Feuil1.[A2], CMin:=46), PlgUti(Feuil2.[A2], CMin:=46))
La suite de la macro est toujours le même quelque soit les noms des onglets.
Dans ce cas est-il possible de :
- Définir la liste des onglets avec le 1ier onglet comme onglet nouveau, suivra les autres onglets anciens.
Ex : NomsF = Array(Feuil5.Name,, Feuil1.Name, Feuil2.Name, Feuil3.Name)
Ecrire une boucle
pour i = 2 jusqu'à la fin du tableau NomsF
CréerTableUnique Te, Array(PlgUti(NomsF(2).[A2], CMin:=46), PlgUti(NomsF(1).[A2], CMin:=46))
la suite du code
next i

2/ Si oui, que faut-il rajouter pour écrire la comparaison dans l'onglet résultat l'une à la suite de l'autre ?

Merci encore
KIM
 

Dranreb

XLDnaute Barbatruc
Non, il y a des choses incorrectes dans ce que vous écrivez.
NomsF(2).[A2] ça ne passera pas. Worksheets(NomsF(2)).[A2] déjà mieux.
Si le traitement se fait toujours avec 2 feuilles vous pourriez aussi les passer en paramètres ByVal FeuilX As Worksheet à une procédure qui le fait pour ces 2 feuilles, en y utilisant ces paramètres à la place de Feuil1 et Feuil2.

Vous seul savez ce qu'il faut écrire derrière, parce que vous seul savez ce que vous voulez comme résultat.
 
Dernière édition:

KIM

XLDnaute Accro
Merci Dranreb,
Tu as raison, il faut définir le résultat souhaité quand il s'agit d'analyser l'évolution de sa base sur plusieurs années Je vais tester le paramétrage proposé.
En tout cas la comparaison de 2 bases se déroule correctement.
Merci encore et bonne journée.
KIM
 

Discussions similaires

Réponses
10
Affichages
228

Statistiques des forums

Discussions
312 335
Messages
2 087 386
Membres
103 531
dernier inscrit
dieubrice