Comparer deux plages
Bonsoir tout le Forum,
je suis nouveau chez vous et j'aimerais réaliser une macro si c'est possible.
J'ai deux plages que je veux comparer en se basant sur la colonne ID car l'ID est unique:
1- si ID existe dans les deux plages ==> dans Colonne E (bleu) il me note "actif" (en updatant Prénom, Nom et Mail s'il y a changement)
2- si ID n'existe que dans la premiere plage ==> dans Colonne E (bleu) il me note "quitté" en concervant les données
3- si ID n'existe que dans la deuxième plage ==> dans Colonne E (bleu) il me note "nouveau" en copiant les dnnées correspondantes.
J'éspère que c'est clair et faisable.
Merci pour votre aide
- Messages
- 85
- Excel
- 2019 FR
- Inscrit
- 26/10/2018
- Emploi
- Conseiller Formateur Ecrivain de l'ouvrage "Je crée mon Excel " aux éditions du Puits Fleuri.
Bonsoir, il est difficile de le faire en une seule formule sans prioriser la colonne A ou D.
Et je ne vois pas l'intérêt d'une macro dans ce cas parce que le problème est biaisé.
Je m'explique.
En A4, existe un ID présent non pas sur la même ligne en G mais une en dessous.
Si G4 était vide, il faudrait écrire Actif puisque la valeur est bien présente en A et G mais que faire dans ce cas de la valeur présente en G4?
Il me semble qu'il faut éviter de trouver en G une valeur différente à celles présente en A sur la même ligne…
La solution est simple. Remplir le tableau avec les mêmes ID toujours présents en A et D en ne pas utiliser le N° ID comme Test mais au contraire une autre cellule remplie ou non.
Exemple
Si l'ID "7" est présent en A et G avec des données liées à A en B et à G en H, alors on notera Actif
Si l'ID "7" est présent en A et G mais qu'il n'y a pas de données liées à G soit H vide, alors on notera Quitté
Enfin, si ID "7" est présent en A et G mais qu'il n'y a pas de données liées à A soit B vide, alors on notera nouveau.
Et ce quelles que soient les données des colonnes B et H, identiques ou non. Ce qui revient à gérer l'ID.
De plus, l'ID doit automatiquement se noter en G dès sa saisie en A.
Ainsi, il sera bien plus facile de gérer ce classeur.
J'ai réalisé cette action et voici le tableau corrigé.
Merci de
Cordialement.
Merci Soleusterm pour ta réponse,
j'ai 43 feuilles avec chaqu'une de 18000 à 27000 lignes! donc je veux bien régler mon problème avec une macro.
Merci
Merci beaucoup h2so4!
ca fonctionne trés bien, j'ai juste ajouté une branche "suivant" si la première plage est vide, sinon ca cause une erreur 400
Sub aargh()
With Sheets("feuil1")
dl1 = .Cells(Rows.Count, 1).End(xlUp).Row
If dl1 = 1 Then GoTo suivant:
.Cells(2, 1).Resize(dl1 - 1, 5).Sort key1:=.Cells(2, 1), order1:=xlAscending, Header:=xlNo
suivant:
dl2 = .Cells(Rows.Count, 7).End(xlUp).Row
.Cells(3, 7).Resize(dl2 - 2, 4).Sort key1:=.Cells(3, 7), order1:=xlAscending, Header:=xlNo
ptr1 = 2
cle1 = .Cells(ptr1, 1)
ptr2 = 3
cle2 = .Cells(ptr2, 7)
nl = dl1
Do Until cle1 = Chr(255) And cle2 = Chr(255)
If cle1 = cle2 Then
.Cells(ptr1, 2).Resize(, 3).Value = .Cells(ptr2, 8).Resize(, 3).Value
.Cells(ptr1, 5) = "actif"
If ptr1 < dl1 Then ptr1 = ptr1 + 1: cle1 = .Cells(ptr1, 1) Else cle1 = Chr(255)
If ptr2 < dl2 Then ptr2 = ptr2 + 1: cle2 = .Cells(ptr2, 7) Else cle2 = Chr(255)
ElseIf cle1 < cle2 Then
.Cells(ptr1, 5) = "quitté"
If ptr1 < dl1 Then ptr1 = ptr1 + 1: cle1 = .Cells(ptr1, 1) Else cle1 = Chr(255)
Else
nl = nl + 1
.Cells(nl, 1).Resize(, 4).Value = .Cells(ptr2, 7).Resize(, 4).Value
.Cells(nl, 5) = "nouveau"
If ptr2 < dl2 Then ptr2 = ptr2 + 1: cle2 = .Cells(ptr2, 7) Else cle2 = Chr(255)
End If
DoEvents
Loop
.Cells(2, 1).Resize(nl - 1, 5).Sort key1:=.Cells(2, 1), order1:=xlAscending, Header:=xlNo
End With
End Sub