Comparaison de deux colonnes sous vba [Résolu/Fermé]

Signaler
-
 Damien -
Bonjour,
Je souhaiterais comparer deux colonnes (contenant des références) dans deux feuilles excel différentes appartenant à un même classeur.
Tout d'abord je comparre les deux colonnes (colonne A feuille 1 avec colonne A feuille 2)avec plusieurs boucles while puis je souhaite voir apparaitre dans la colonne B feuille 2 les références qui étaient présente dans la colonne A feuille 1 mais qui n'étaient pas présente dans la colonne A feuille 2. Voila le code que j'ai tapé, mais il ne fonctionne pas (Dépassement de capacité). ce n'est surement pas grand chose, mais je tourne en rond :

Dim VALEURA As String, i As Integer, x As Integer, y As Integer, valeurB As String
i = 2
x = 2
y = 2
Do While i <> "200"
VALEURA = Sheets("feuille1").Range("A" & i).Value
valeurB = Sheets("feuille2").Range("A" & x).Value
Do While VALEURA <> valeurB
x = x + 1
If x = 200 Then
While Sheets("feuille2").Range("B" & y).Value <> ""
y = y + 1
Sheets("feuille2").Range("B" & y).Value = VALEURA
Wend
Else
i = i + 1
End If
Loop
i = i + 1
Loop
End Sub

7 réponses

Messages postés
17242
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
6 octobre 2020
4 284
Salut,

Tu peux traiter ce problème par formule

=SI(NB.SI(Feuil1!$A$1:$A$37;Feuil2!A4)=0;Feuil1!A4;"")

Si tu tiens au VBA, je suis obligé de m'absenter je t'écrierai un bout de code en début d'après midi si personne n'est venu en aide

A+
Salut,

En fait le code que tu m'as confié ne résoud pas mon problème à 100%. Je m'explique : Ton code fonctionne lorsque les données inscrite sur la feuille 1 colonne A et feuille 2 colonne A suivent la même logique ou sont inscrites dans le même ordre. Cependant, dans mon cas, les données ne sont pas nécessairement rangées dans le même ordre. Si bien que ton code me renvoit à chaque fois l'ensemble des données inscrites sur la feuille1 colonne A.

En fait mon idée était de prendre chaque donnée de la feuille 1 colonne A puis de vérifié que celle-ci était bien présente dans la feuille 2 colonne A (mais pas nécessairement sur la meme ligne). Si c'est bien le cas alors on passe à la donnée suivante de la feuille 1 colonne A. Cependant, si ce n'est pas le cas alors cette donées doit etre inscrite sur la feuille 2 colonne B

J'espère que tu pourras m'aider de nouveau.

Merci
Messages postés
17242
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
6 octobre 2020
4 284 > Damien
Salut,

Comme tu à mis ton psot sous 1, je suppose que tu traites ton problème par formule.
testes ces formules que tu colles dans une cellule ligne 2 et tu incremente vers le bas sur la feuille 1

=SI(A2="";"";SI(ESTNA(EQUIV(A2;Feuil2!$A$2:$A$100;0));A2;""))

=SI(NB.SI(Feuil1!$A$2:$A$100;A2)+NB.SI(Feuil2!$A$2:$A$100;A2)>1=VRAI;"";Feuil1!A2)

ou ci dessous sur la feuille 2
=SI(A2="";"";SI(ESTNA(EQUIV(Feuil1!A2;Feuil2!$A$2:$A$100;0));Feuil1!A2;""))

=SI(NB.SI(Feuil1!$A$2:$A$100;A2)+NB.SI(Feuil2!$A$2:$A$100;A2)>1=VRAI;"";Feuil1!A2)
A+
Messages postés
17242
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
6 octobre 2020
4 284
Re,

Pas de nouvelles !

comme promis un bout de code pour comparer la colonne A feuille1 de la colonneA feuille2 et copie en colonne B feuille2 des données présente colonne A de la feuille 1 absente feuille 2

Sub Absent_Feuille_Deux()

Dim Plag1 As Range, Plag2 As Range
Dim Tablo1, Tablo2, Plag3 As Range
Dim A As Long, B As Integer, C As Long, D As Integer
Set Plag1 = Sheets("Feuil1").Range("A1:A100") 'première plage de recherche
Set Plag2 = Sheets("Feuil2").Range("A1:A100") 'plage de comparaison
Set Plag3 = Sheets("Feuil2").Range("B1") 'début de plage de réception des différences
'comparaison des plages
If Plag1.Rows.Count <> Plag2.Rows.Count Then
MsgBox "Les plages à comparer ne sont pas identiques"
Exit Sub
End If
Range("B1:B100").ClearContents 'efface la plage de réception
Tablo1 = Plag1: Tablo2 = Plag2: D = 1
Application.ScreenUpdating = False
For A = 1 To UBound(Tablo1, 1)
For B = 1 To UBound(Tablo1, 2)
If Tablo1(A, B) <> Tablo2(A, B) Then
C = C + 1
Plag3(C, D) = Tablo1(A, B)
End If
Next
Next
End Sub

A+
Merci beaucoup de ta réponse, ça marche!!!!!
Et désolé de ne pas avoir répondu plus tot.

MERCI
Messages postés
17242
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
6 octobre 2020
4 284
Salut,

Content que tu ais trouvé la solution sur comment ça marche, n'oublies pas de mettre ton statut en résolu en haut de ton post, ou clic sur le triangle jaune pour demander à un modérateur de la faire

Merci et A+
Salut,

A vrai dire j'utilisais plutot la version VBA. Excuse moi de t'avoir fait perdre ton temps sur l'autre.

Aurais-tu la solution miracle en VBA ?

Merci de ton aide
Messages postés
17242
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
6 octobre 2020
4 284
Re,

Normalement ce code te donne sur la feuille2 colonne B ce qui se trouve sur la feuille1 colonne A et qui est absent sur la feuille2 colonne A quelque soit l'ordre

Sub Absent_Feuille_Deux()

Dim Plag1 As Range, Plag2 As Range
Dim Tablo1, Tablo2, Plag3 As Range
Dim A As Long, B As Integer, C As Long, D As Integer
Set Plag1 = Sheets("Feuil1").Range("A2:A100") 'première plage de recherche
Set Plag2 = Sheets("Feuil2").Range("A2:A100") 'plage de comparaison
Set Plag3 = Sheets("Feuil2").Range("B2") 'début de plage de réception des différences
'comparaison des plages
If Plag1.Rows.Count <> Plag2.Rows.Count Then
MsgBox "Les plages à comparer ne sont pas identiques"
Exit Sub
End If
Range("C1:C100").ClearContents 'efface la plage de réception
Tablo1 = Plag1: Tablo2 = Plag2: D = 1
Application.ScreenUpdating = False
For A = 1 To UBound(Tablo1, 1)
For B = 1 To UBound(Tablo1, 2)
If Tablo1(A, B) <> Tablo2(A, B) Then
C = C + 1
Plag3(C, D) = Tablo1(A, B)
End If
Next
Next
End Sub

A+
Salut,

J'ai de nouveau testé ton code :

feuille1 colonne A :

10
5
6
7
32
58
21
54
85
42
231
65
87
45
12
35

Feuille 2 colonne A :
85
12
45
231
7
42
5
32


Ce que j'obtiens avec ton code Feuille 2 colonne B :
10
5
6
7
32
58
21
54
85
42
231
65
87
45
12
35


Ci-dessous, ce que je souhaiterais obtenir :

10
5
6
58
21
54
65
87
35

Je ne comprends pas trop ton code et ne suis donc pas en mesure d'y apporter des modifications :)

Merci de ton aide
Messages postés
17242
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
6 octobre 2020
4 284
Salut,

Récupéres un exemple avec le lien ci-dessous.

https://www.cjoint.com/?fbbvHTPCde

J'ai revu le code en supposant que les plage à contrôler et de réception commencent à la ligne 2

Sub essai()
Dim colonne1 As Range, colonne2 As Range, cellule As Range, trouve As Range, suite As Range

'Compare la colonne A des feuilles 1 et 2
Set colonne1 = Sheets("Feuil1").Range(("A2"), Sheets("Feuil1").Range("A2").End(xlDown))
Set colonne2 = Sheets("Feuil2").Range(("A2"), Sheets("Feuil2").Range("A2").End(xlDown))

'Efface la plage de réception
Sheets("Feuil2").Range("B2:B65536").ClearContents

'Retranscrit les données différente de la feuille1 sur la feuille2
For Each cellule In colonne1
Set suite = Sheets("Feuil2").[B65536].End(xlUp).Offset(1, 0)
Set trouve = colonne2.Find(cellule.Value, LookIn:=xlValues, lookat:=xlWhole)
If trouve Is Nothing Then suite.Value = cellule.Value
Next
End Sub

Ci-dessous le même code mais avec des plages nommées, la colonne A feuille 1 nommée toto
colonne A feuille 2 nommée titi
et la plage de réception colonne B feuille 2 nommée tutu.
l'intérêt de nommer les plages raccourci les formules, et nous n'avons pas besoin d'identifier la feuille et la plage

Sub essai()
Dim colonne1 As Range, colonne2 As Range, cellule As Range, trouve As Range, suite As Range

'Compare la colonne A des feuilles 1 et 2 nommées
Set colonne1 = Range([toto], [toto].End(xlDown))
Set colonne2 = Range([titi], [titi].End(xlDown))

'Efface la plage de réception
[tutu].ClearContents

'Retranscrit les données différente de la feuille1 sur la feuille2
For Each cellule In colonne1
Set suite = Sheets("Feuil2").[B65536].End(xlUp).Offset(1, 0)
Set trouve = colonne2.Find(cellule.Value, LookIn:=xlValues, lookat:=xlWhole)
If trouve Is Nothing Then suite.Value = cellule.Value
Next
End Sub
Salut,

Dsl j'étais en congé depuis une semaine.

Je te remercie bcp pour ces améliorations, tout fonctionne correctement maintenant.

Merci bcp