Valeurs uniques entre deux colonnes

Bonjour tout le monde

Alors voila, je veux comparer deux colonnes d'un même classeur et sortir les valeurs de la colonne A non présentes dans la colonne C

Je fais un exemple :

A B C D E

TOTO 20160805 TOTO TOTOO 20160805

TOTOO 20160805 TOTI TOTOOO 20160805

TOTOOO 20160805 TOTA

TOTO 20160804 TOTE

TOTOO 20160804 TOT

TOTOOO 20160804 TOLO

Donc voila mon programme doit analyser la colonne A et C et garder la date de B la plus récente

Les données uniques sont notés en D et E

A savoir que c'est pour plusieurs milliers de lignes, donc un delete des doublons de la colonne A n'est pas la meilleure idée je pense

Hello,

Alors si j'ai bien compris :

1) Si doublon sur deux lignes alors tu veux garder celle avec la date en col B la plus récente?

2) Les données dans les col E et D tu t'en préoccupe pas ?

Si tu peux fournir un fichier ça serait pas mal . Pense avoir un code pour toi.

Je me suis mal expliqué

Ma colonne en A peut contenir des doublons au sein meme de sa colonne (plusieurs fois la meme donnée mais pas à la même date)

Mon but c'est de comparer A et C et de mettre les valeurs de A non présente en C dans la colonne D avec en E sa date la plus recente

Ma data vient de deux fichiers separés

Donc je pensais faire :

Windows ("DataARecupEnColonneA").Activate
Sheets("DataenA").Select
Range(Cells(1, "A"), Cells(150000, "B")).Select
Selection.Copy

 Windows("Comparaison").Activate
Sheets("Sheet1").Select
Sheets("Sheet1").Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

'nettoie les doublons + date recente
For i = Range("A150000").End(xlUp).Row To 2 Step -1
   For j = i-1 To 2 Step -1
    If Cells(i, 1) = Cells(j, 1)  then
  if cells(i,"B").value < cells(j,"B").value then
       Cells(i, 1).EntireRow.ClearContents
else 
 Cells(j, 1).EntireRow.ClearContents
    End If
  next j
Next i

[A:A].SpecialCells(xlCellTypeBlanks).EntireRow.Delete

  Windows("DataDeNotreBDD.xlsx").Activate
  Sheets("Sheet1").Select
 Columns("A").Select
  Range("A12:A8000").Copy
 Windows("Comparaison").Activate
  Sheets("Sheet1").Select
 Sheets("Sheet1").Range("C1").Select
  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
      :=False, Transpose:=False

'la je bloque :/

trop long en fait de faire ca , j'ai bcp trop de lignes pour me permettre cette double boucle for ^^

Désolé mais je te pose des questions, c'est pas facile de comprendre à distance.

Donc ton test s'applique sur une ligne à chaque fois. Tu as pas de test avec la ligne inférieure ou supérieure?

test ligne 1 par exemple,

A test vs C => si A = C on fait quoi?

A test vs C => si A <> C on remplace la valeur de D par A avec en E la date de B?

Je suis bon ? lol

Les boucles imbriquées perso sur des milliers de ligne tu vas avoir ton excel qui va planter . Déjà eu cette mauvaise expérience lol.

MojitoDu75 a écrit :

Bonjour tout le monde

Alors voila, je veux comparer deux colonnes d'un même classeur et sortir les valeurs de la colonne A non présentes dans la colonne C

Je fais un exemple :

A B C D E

TOTO 20160805 TOTO TOTOO 20160805

TOTOO 20160805 TOTI TOTOOO 20160805

TOTOOO 20160805 TOTA

TOTO 20160804 TOTE

TOTOO 20160804 TOT

TOTOOO 20160804 TOLO

Donc voila mon programme doit analyser la colonne A et C et garder la date de B la plus récente

Les données uniques sont notés en D et E

A savoir que c'est pour plusieurs milliers de lignes, donc un delete des doublons de la colonne A n'est pas la meilleure idée je pense

Sans fichier c'est pas facile de t'aider

Pour repondre à nonesofar13,

A test vs C => si A = C on fait quoi? --> Si A est présent dans C on s'en fiche, on passe au suivant dans A

A test vs C => si A <> C on remplace la valeur de D par A avec en E la date de B?

A test vs C => si A <> C --> La valeur A que l'on ne trouve pas dans la colonne C est copié en colonne D avec en plus la date la plus recente de cette valeur en A

Donc est il mieux de faire d'abord, je copie ma data et ses dates dans les colonnes A et B puis je supprime tout les doublons pour garder une valeur en A sans doublon avec la date la plus recente pour chaque valeur

Ou j'essaye de faire tout d'un coup en comparant avec C en meme temps ?

Pour patrick, compliqué de joindre un fichier car c'est dans une macro que je realise et qui fait déja un million de trucs , j'aimerai juste rajouter dedans cette comparaison la

Dim j As Long
    Application.ScreenUpdating = False
    a = Range("A1:B" & [B170000].End(xlUp).Row)
    Set dico = CreateObject("Scripting.Dictionary")
    For j = LBound(a) To UBound(a)
        If a(j, 2) > dico(a(j, 1)) Then dico(a(j, 1)) = a(j, 2)
    Next j

    [E1].Resize(dico.Count) = Application.Transpose(dico.keys)
    [F1].Resize(dico.Count) = Application.Transpose(dico.Items)

ca me permet de supprimer les doublons et en plus d'avoir la date la plus recente, j'avance bien

mtn faut que je compare avec la colonne C pour trouver les uniques que j'ai sorti !

Hello,

Sinon essaye de fournir un fichier avec juste la macro que tu souhaites faire, sans le reste du programme !!

Perso ton code avec dico, me semble un peu complexe, je connais pas ton niveau vba mais je te conseille de faire un test simple de ce type.

Juste comme ça sans tester je ferais ça

Dim mytxt As String

for i=1 to dernligne

if cells(i,"a")=cells(i,"c") then

'on ne fait rien

elseif cells(i,"a")<>cells(i,"c") then

mytxt = cells(i,"a")

cells(i,"d").value = mytxt

'pareil pour E

J'ai reussi à trouver avec mes dico au final

J'ai deux fonctions, une qui supprime tout les doublons en gardant la date la plus recente et un autre qui me sort les uniques

 Dim j As Long
    Application.ScreenUpdating = False
    a = Range("A1:B" & [B150000].End(xlUp).Row)
    Set dico = CreateObject("Scripting.Dictionary")
    For j = LBound(a) To UBound(a)
        If a(j, 2) > dico(a(j, 1)) Then dico(a(j, 1)) = a(j, 2)
    Next j

    [E1].Resize(dico.Count) = Application.Transpose(dico.keys)
    [F1].Resize(dico.Count) = Application.Transpose(dico.Items)

    Columns("A:B").Delete

     a = Range("A2:A" & [A65000].End(xlUp).Row)
  Set MonDico1 = CreateObject("Scripting.Dictionary")
  For Each c In a
    If Not MonDico1.exists(c) Then MonDico1.Add c, c
  Next c
  b = Range("C2:C" & [C65000].End(xlUp).Row)
  Set MonDico2 = CreateObject("Scripting.Dictionary")
  For Each c In b
    If Not MonDico1.exists(c) Then If Not MonDico2.exists(c) Then MonDico2.Add c, c
  Next c
  [I2].Resize(MonDico2.Count, 1) = Application.Transpose(MonDico2.Items)

Good bravo,

Rechercher des sujets similaires à "valeurs uniques entre deux colonnes"