Comparaison de deux colonnes sous vba
Résolu/Fermé
A voir également:
- Comparer deux colonnes excel vba
- Comparer deux feuilles excel et afficher différence vba - Meilleures réponses
- Comparer deux colonnes et afficher difference vba - Meilleures réponses
- Comparaison de deux colonnes sous vba ✓ - Forum - VB / VBA
- Comparer plusieurs colonnes en VBA ✓ - Forum - Excel
- Comparer une valeur entre 2 colonnes Excel VBA ✓ - Forum - Excel
- Comparer deux colonnes excel ✓ - Forum - Excel
- Comparer 2 colonnes Excel ✓ - Forum - Excel
7 réponses
Mike-31
24 avril 2009 à 11:50
- Messages postés
- 17941
- Date d'inscription
- dimanche 17 février 2008
- Statut
- Contributeur
- Dernière intervention
- 13 mai 2022
24 avril 2009 à 11:50
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+
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+
Mike-31
24 avril 2009 à 22:54
- Messages postés
- 17941
- Date d'inscription
- dimanche 17 février 2008
- Statut
- Contributeur
- Dernière intervention
- 13 mai 2022
24 avril 2009 à 22:54
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+
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+
Mike-31
25 avril 2009 à 13:59
- Messages postés
- 17941
- Date d'inscription
- dimanche 17 février 2008
- Statut
- Contributeur
- Dernière intervention
- 13 mai 2022
25 avril 2009 à 13:59
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+
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+
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Mike-31
28 avril 2009 à 16:47
- Messages postés
- 17941
- Date d'inscription
- dimanche 17 février 2008
- Statut
- Contributeur
- Dernière intervention
- 13 mai 2022
28 avril 2009 à 16:47
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+
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
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
Mike-31
29 avril 2009 à 11:50
- Messages postés
- 17941
- Date d'inscription
- dimanche 17 février 2008
- Statut
- Contributeur
- Dernière intervention
- 13 mai 2022
29 avril 2009 à 11:50
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
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
28 avril 2009 à 09:01
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
28 avril 2009 à 15:58
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+