Comparaison de 2 tableaux Excel
Résolu/Fermé
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
-
18 juin 2015 à 17:46
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 - 19 juin 2015 à 11:13
Kuartz Messages postés 850 Date d'inscription vendredi 13 février 2015 Statut Membre Dernière intervention 15 février 2019 - 19 juin 2015 à 11:13
A voir également:
- Comparaison de 2 tableaux Excel
- Liste déroulante excel - Guide
- Formule excel - Guide
- Tableau croisé dynamique excel - Guide
- Fusionner 2 tableaux excel - Guide
- 2 comptes whatsapp - Guide
4 réponses
PlacageGranby
Messages postés
393
Date d'inscription
mercredi 26 mars 2014
Statut
Membre
Dernière intervention
7 mars 2019
26
18 juin 2015 à 18:11
18 juin 2015 à 18:11
Bonjour,
J'ai pris une valeur pour faire le test soit 1006859271
J'ai ensuite été dans votre code VBA et j'ai ajouter deux espions pour voir le contenu des variable durant l'exécution du code.
soit les variable
Sheets(1).Range("C" & n).Value
Sheets(2).Range("B" & t).Value
Ensuite, j'ai ajouté le code suivant, et j'ai mis un point d'arret sur le MSGbox
Voici le contenu des variables avant la comparaison
Watch : : Sheets(1).Range("C" & n).Value : 1006859271 : Variant/Double : Module2.COMPARATIF
Watch : : Sheets(2).Range("B" & t).Value : "1006859271" : Variant/String : Module2.COMPARATIF
Donc, vous comparez un chiffre avec du texte.
une solution serait de forcer une conversion avant la comparaison avec cstr
Donc, on converti les deux valeur en texte.
J'ai pris une valeur pour faire le test soit 1006859271
J'ai ensuite été dans votre code VBA et j'ai ajouter deux espions pour voir le contenu des variable durant l'exécution du code.
soit les variable
Sheets(1).Range("C" & n).Value
Sheets(2).Range("B" & t).Value
Ensuite, j'ai ajouté le code suivant, et j'ai mis un point d'arret sur le MSGbox
If Sheets(1).Range("C" & n).Value = 1006859271 Then
If Sheets(2).Range("B" & t) = 1006859271 Then
MsgBox "ok"
End If
End If
Voici le contenu des variables avant la comparaison
Watch : : Sheets(1).Range("C" & n).Value : 1006859271 : Variant/Double : Module2.COMPARATIF
Watch : : Sheets(2).Range("B" & t).Value : "1006859271" : Variant/String : Module2.COMPARATIF
Donc, vous comparez un chiffre avec du texte.
une solution serait de forcer une conversion avant la comparaison avec cstr
Donc, on converti les deux valeur en texte.
If cstr(Sheets(1).Range("C" & n).Value) = cstr(Sheets(2).Range("B" & t).Value) Then
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
59
Modifié par Kuartz le 18/06/2015 à 21:34
Modifié par Kuartz le 18/06/2015 à 21:34
Merci infiniment de vous être penché sur mon problème.
Merci de m'avoir donné les clés pour mes prochains codes, je ne connaissais pas du tout tout ça.
Ce qui m'étonne c'est que je convertis en nombre à chaque fois mes valeurs mais excel les considère encore comme du texte...
Du coup, votre If cstr viendrait se mettre à quel endroit dans le code?
Merci d'avance.
Merci de m'avoir donné les clés pour mes prochains codes, je ne connaissais pas du tout tout ça.
Ce qui m'étonne c'est que je convertis en nombre à chaque fois mes valeurs mais excel les considère encore comme du texte...
Du coup, votre If cstr viendrait se mettre à quel endroit dans le code?
Merci d'avance.
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
59
Modifié par Kuartz le 18/06/2015 à 21:38
Modifié par Kuartz le 18/06/2015 à 21:38
Dim DLig As Long
Dim DLig2 As Long
DLig = Sheets(1).Range("C2").End(xlDown).Row
DLig2 = Sheets(2).Range("B3").End(xlDown).Row
x = 3
'boucle sur les lignes de Feuil2
For t = 3 To DLig2
' si ref n'existe pas en feuil 1 on recopie les colonnes en feuil3 + message
If Application.WorksheetFunction.CountIf(Sheets(1).Range("C:C"), Sheets(2).Range("B" & t)) = 0 Then
x = x + 1
For k = 1 To 18
Sheets(3).Cells(x, k) = Sheets(2).Cells(t, k)
Next
Sheets(3).Range("S" & x) = "La référence n'est pas chez le client"
End If
Next t
'boucle sur les lignes de Feuil1
For t = 2 To DLig
' si ref n'existe pas en feuil 2 message (on ne recopie pas lignes car pas même emplacements mais juste la ref)
If Application.WorksheetFunction.CountIf(Sheets(2).Range("B:B"), Sheets(1).Range("C" & t)) = 0 Then
x = x + 1
Sheets(3).Range("B" & x) = Sheets(1).Range("C" & t)
Sheets(3).Range("E" & x) = Sheets(1).Range("A" & t)
Sheets(3).Range("G" & x) = Sheets(1).Range("I" & t)
Sheets(3).Range("H" & x) = Sheets(1).Range("H" & t)
Sheets(3).Range("I" & x) = Sheets(1).Range("J" & t)
Sheets(3).Range("K" & x) = Sheets(1).Range("N" & t)
Sheets(3).Range("S" & x) = "La référence n'est pas chez nous"
End If
Next t
' boucle sur lignes en Feuil 1 et sur lignes en feuil2
For n = 2 To DLig
For t = 3 To DLig2
' si les ref correspondent
If CStr(Sheets(1).Range("C" & n).Value) = CStr(Sheets(2).Range("B" & t).Value) Then
If Sheets(1).Range("C" & n) = Sheets(2).Range("B" & t) Then
' alors on verifie que les prix correspondent et si pas correspondance on relève les colonnes + message et calcul de différence
If Sheets(1).Range("N" & n) <> Sheets(2).Range("K" & t) Then
x = x + 1
For k = 1 To 18
Sheets(3).Cells(x, k) = Sheets(2).Cells(t, k)
Next
Sheets(3).Range("S" & x) = "Ecart de prix"
Sheets(3).Range("t" & x) = Sheets(1).Range("N" & n) - Sheets(2).Range("K" & t)
End If
End If
End If
Next t
Next n
End Sub
Je l'ai ajouté ici mais ça ne change rien....
PlacageGranby
Messages postés
393
Date d'inscription
mercredi 26 mars 2014
Statut
Membre
Dernière intervention
7 mars 2019
26
18 juin 2015 à 21:55
18 juin 2015 à 21:55
Re-bonjour,
En ayant rajouter ma suggestion de Cstr().vous avez maintenant deux IF qui font la même chose.
Le premier converti en texte et compare si les valeurs sont égales.
Le deuxième IF, est toujours pareil, ce qui va causer l'erreur il compare encore un nombre avec du texte.
Il faut supprimer ce deuxième IF ainsi que le end if correspondant.
Ci-bas ton code corrigé
En ayant rajouter ma suggestion de Cstr().vous avez maintenant deux IF qui font la même chose.
Le premier converti en texte et compare si les valeurs sont égales.
Le deuxième IF, est toujours pareil, ce qui va causer l'erreur il compare encore un nombre avec du texte.
Il faut supprimer ce deuxième IF ainsi que le end if correspondant.
Ci-bas ton code corrigé
Dim DLig As Long
Dim DLig2 As Long
DLig = Sheets(1).Range("C2").End(xlDown).Row
DLig2 = Sheets(2).Range("B3").End(xlDown).Row
x = 3
'boucle sur les lignes de Feuil2
For t = 3 To DLig2
' si ref n'existe pas en feuil 1 on recopie les colonnes en feuil3 + message
If Application.WorksheetFunction.CountIf(Sheets(1).Range("C:C"), Sheets(2).Range("B" & t)) = 0 Then
x = x + 1
For k = 1 To 18
Sheets(3).Cells(x, k) = Sheets(2).Cells(t, k)
Next
Sheets(3).Range("S" & x) = "La référence n'est pas chez le client"
End If
Next t
'boucle sur les lignes de Feuil1
For t = 2 To DLig
' si ref n'existe pas en feuil 2 message (on ne recopie pas lignes car pas même emplacements mais juste la ref)
If Application.WorksheetFunction.CountIf(Sheets(2).Range("B:B"), Sheets(1).Range("C" & t)) = 0 Then
x = x + 1
Sheets(3).Range("B" & x) = Sheets(1).Range("C" & t)
Sheets(3).Range("E" & x) = Sheets(1).Range("A" & t)
Sheets(3).Range("G" & x) = Sheets(1).Range("I" & t)
Sheets(3).Range("H" & x) = Sheets(1).Range("H" & t)
Sheets(3).Range("I" & x) = Sheets(1).Range("J" & t)
Sheets(3).Range("K" & x) = Sheets(1).Range("N" & t)
Sheets(3).Range("S" & x) = "La référence n'est pas chez nous"
End If
Next t
' boucle sur lignes en Feuil 1 et sur lignes en feuil2
For n = 2 To DLig
For t = 3 To DLig2
' si les ref correspondent
If CStr(Sheets(1).Range("C" & n).Value) = CStr(Sheets(2).Range("B" & t).Value) Then
' alors on verifie que les prix correspondent et si pas correspondance on relève les colonnes + message et calcul de différence
If Sheets(1).Range("N" & n) <> Sheets(2).Range("K" & t) Then
x = x + 1
For k = 1 To 18
Sheets(3).Cells(x, k) = Sheets(2).Cells(t, k)
Next
Sheets(3).Range("S" & x) = "Ecart de prix"
Sheets(3).Range("t" & x) = Sheets(1).Range("N" & n) - Sheets(2).Range("K" & t)
End If
End If
Next t
Next n
End Sub
Kuartz
Messages postés
850
Date d'inscription
vendredi 13 février 2015
Statut
Membre
Dernière intervention
15 février 2019
59
19 juin 2015 à 11:13
19 juin 2015 à 11:13
J'ai tellement perdu de temps sur ce truc c'est incroyable.
Je vous remercie infiniment pour votre réponse et en plus, votre code marche à merveille ! Enfin ce code marche grâce à vous !
Merci encore.
Cordialement.
Je vous remercie infiniment pour votre réponse et en plus, votre code marche à merveille ! Enfin ce code marche grâce à vous !
Merci encore.
Cordialement.
18 juin 2015 à 18:16
On vérifie le contenu des variables et on voit pourquoi excel ne réagit pas comme prévu lors des boucles et des conditions.
Pour mettre un point d'arret, on click dans la marge de gauche, et pour ne pas se tapper 2000 ligne de code, on ajoute un if, comme dans mon exemple précédent pour aller directement à la valeur qui nous intéresse.