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
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
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 EJ'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,