comparer deux plages Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
j
justnew
Nouveau venu
Nouveau venu
Messages : 4
Inscrit le : 17 février 2019
Version d'Excel : 2010

Message par justnew » 17 février 2019, 21:16

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.
test_forum.xlsx
(8.73 Kio) Téléchargé 6 fois
J'éspère que c'est clair et faisable.
Merci pour votre aide
S
Soleusterm
Membre habitué
Membre habitué
Messages : 68
Appréciation reçue : 1
Inscrit le : 26 octobre 2018
Version d'Excel : 2016 FR

Message par Soleusterm » 18 février 2019, 00:36

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.
test_forum resolu.xlsx
(10.55 Kio) Téléchargé 2 fois
j
justnew
Nouveau venu
Nouveau venu
Messages : 4
Inscrit le : 17 février 2019
Version d'Excel : 2010

Message par justnew » 18 février 2019, 09:36

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
h
h2so4
Passionné d'Excel
Passionné d'Excel
Messages : 7'787
Appréciations reçues : 211
Inscrit le : 16 juin 2013
Version d'Excel : 2013 UK Windows 10

Message par h2so4 » 18 février 2019, 11:30

bonjour,

solution via une macro
test_forum.xlsm
(17.19 Kio) Téléchargé 5 fois
j
justnew
Nouveau venu
Nouveau venu
Messages : 4
Inscrit le : 17 février 2019
Version d'Excel : 2010

Message par justnew » 18 février 2019, 14:22

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 :-D
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
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message