Comparer plusieurs colonnes en VBA

Résolu/Fermé
Pazzaki Messages postés 10 Date d'inscription mardi 3 décembre 2019 Statut Membre Dernière intervention 5 décembre 2019 - 3 déc. 2019 à 12:53
Pazzaki Messages postés 10 Date d'inscription mardi 3 décembre 2019 Statut Membre Dernière intervention 5 décembre 2019 - 5 déc. 2019 à 11:34
Bonjour,

voici mon problème,
J'aimerai comparer 2 listes de 4 colonnes chacune contenant Nom, date, heure et type (appelé bloc).
chaque liste est composé des mêmes bloc et mon objectif est de comparer ses deux listes afin de trouver les éventuelles erreur (1 bloc de la liste A ne correspond pas au bloc de la liste B).

J'ai réussi a faire un programme en VBA en m'aidant de divers forum mais mon programme marche uniquement si les blocs sont dans le même ordre dans les 2 listes.

voici ce que donne mon programme:



L'objectif finale est d'avoir une page excel ou on voit les deux listes l'une a coté de l'autre avec les blocs qui serait faux en couleur éventuellement.
Si il y a des questions, n'hésitez pas à les poster, en sachant que mon niveau de programmation est très bas :/
En espérant que quelqu'un puisse m'aider :)


Sub Résultat()
Dim DerLig As Long, Ligne As Long 'variables
With Worksheets("Feuil1") 'choisir la feuille

DerLig = .Range("B" & Rows.Count).End(xlUp).Row 'déterminer le N° de ligne de la dernière ligne non vide de la colonne B dans al variable dernLign

For Ligne = 1 To DerLig 'a partir de la premiere ligne jusqu'a la derniere

If Range("A" & Ligne).Value <> "" And Range("F" & Ligne).Value <> "" _
And Range("B" & Ligne).Value <> "" And Range("G" & Ligne).Value <> "" _
And Range("C" & Ligne).Value <> "" And Range("H" & Ligne).Value <> "" _
And Range("D" & Ligne).Value <> "" And Range("I" & Ligne).Value <> "" Then 'si valeur des 2 colones differentes alors dans colone K -> Different

If Range("A" & Ligne).Value = Range("F" & Ligne).Value _
And Range("B" & Ligne).Value = Range("G" & Ligne).Value _
And Range("C" & Ligne).Value = Range("H" & Ligne).Value _
And Range("D" & Ligne).Value = Range("I" & Ligne).Value Then 'si valeurs des 2 colones = alors dans k-> OK

Range("K" & Ligne).Value = "OK"
Else
Range("K" & Ligne).Value = "Different"
End If
Else
Range("K" & Ligne).Value = ""
End If
Next Ligne
End With
End Sub

10 réponses

via55 Messages postés 14494 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 26 octobre 2024 2 734
Modifié le 3 déc. 2019 à 13:52
Bonjour Pazzaki

Pourquoi en VBA alors qu'une simple mise en forme conditionnelle fera le job :
Sélectionne les 3 colonne ABC - Accueil - Mise en forme conditionnelle - Nouvelle règle - Utiliser une formule .. et entre la formule suivante :
=ET($A1<>"";NB.SI.ENS($F$1:$F$5000;$A1;$G$1:$G$5000;$B1;$H$1:$H$5000;$C1)=0) en respectant bien les $aux bons endroits
avant de choisir la couleur de remplissage
Répète l'opération pour les colonnes FGH avec la formule
=ET($G1<>"";NB.SI.ENS($A$1:$A$5000;$G1;$B$1:$B$5000;$H1;$C$1:$C$5000;$H1)=0)

Modifie les références si ton tableau va en deçà ou au delà de la ligne 5000

Cdlmnt
Via

1
Pazzaki Messages postés 10 Date d'inscription mardi 3 décembre 2019 Statut Membre Dernière intervention 5 décembre 2019
3 déc. 2019 à 13:51
bonjour,
En vba car j'aimerai réutiliser le code sur d'autre fichier excel. Avec une règle je serai obliger de refaire la manip a chaque fois il me semble ? Le but est d'être le plus optimisé possible (projet +/- professionnel).
Merci de ta réponse
0
via55 Messages postés 14494 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 26 octobre 2024 2 734
3 déc. 2019 à 18:27
Re

Je m'étais absenté cet après-midi

j'aimerai réutiliser le code sur d'autre fichier excel
ok à condition que les informations soient placées dans les mêmes colonnes sinon tu seras obligé quand-même d'adapter le code de la macro

Macro utilisant le même principe que la MFC, par un NB.SI.ENS (Countifs en VBA) on comptabilise les lignes avec les mêmes items, si 0, coloration en rouge et affichage en dernière colonne de Différent ou OK

Sub Résultat()
Dim DerLig As Long, Ligne As Long 'variables
 'choisir la feuille ici
With Worksheets("Feuil1")

DerLig = .Range("B" & Rows.Count).End(xlUp).Row 'déterminer le N° de ligne de la dernière ligne non vide de la colonne B dans al variable dernLign

For Ligne = 1 To DerLig 'a partir de la premiere ligne jusqu'a la derniere
    ' verif que bloc dans ABCD existe dans FGHI
    If Application.WorksheetFunction.CountIfs(.Range("F1:F" & DerLig), .Range("A" & Ligne), .Range("G1:G" & DerLig), .Range("B" & Ligne), .Range("H1:H" & DerLig), .Range("C" & Ligne), .Range("I1:I" & DerLig), .Range("D" & Ligne)) = 0 Then
    .Range("E" & Ligne) = "Différent"
     .Range("A" & Ligne & ":D" & Ligne).Select
     Selection.Interior.Color = 255
     Else
    .Range("E" & Ligne) = "OK"
    .Range("A" & Ligne & ":D" & Ligne).Interior.Pattern = xlNone
     End If
    
     ' verif que bloc dans FGHI existe dans ABCD
    If Application.WorksheetFunction.CountIfs(.Range("A1:A" & DerLig), .Range("F" & Ligne), .Range("B1:B" & DerLig), .Range("G" & Ligne), .Range("C1:C" & DerLig), .Range("H" & Ligne), .Range("D1:D" & DerLig), .Range("I" & Ligne)) = 0 Then
    .Range("J" & Ligne) = "Différent"
     .Range("F" & Ligne & ":I" & Ligne).Select
     Selection.Interior.Color = 255
     Else
    .Range("J" & Ligne) = "OK"
    .Range("F" & Ligne & ":I" & Ligne).Interior.Pattern = xlNone
     End If
 
 Next
 
 End With
 End Sub


La macro fonctionne correctement si les deux groupes de 4 colonnes ont le même nombre de lignes
Dans le cas contraire il faudrait rajouter entre les deux parties de codes faisant les verifs :
Next

DerLig = .Range("F" & Rows.Count).End(xlUp).Row 'déterminer le N° de ligne de la dernière ligne non vide de la colonne F dans al variable dernLign

For Ligne = 1 To DerLig 'a partir de la premiere ligne jusqu'a la derniere

Cdlmnt
Via
1
Pazzaki Messages postés 10 Date d'inscription mardi 3 décembre 2019 Statut Membre Dernière intervention 5 décembre 2019
4 déc. 2019 à 08:28
Bonjour,
Avant tout merci d'avoir prit le temps de m'aider ! Le soucis est que j'ai le même problème avec votre programme (qui cela étant dit fonctionne mieux que le miens) qu'avec le miens. Cette à dire que si les blocs ne sont pas dans l'ordre alors cela me note qu'ils sont different.

Mon but est de savoir si les blocs dans la liste colonnes A B C D apparaissent aussi dans la liste colonne F G H I. (ceux n'apparaissant pas serait alors faux). désolé si je m'était mal exprimé.
Si vous avez une idée pour résoudre ça je suis preneur, merci !
cdt
Paz
0
Pazzaki Messages postés 10 Date d'inscription mardi 3 décembre 2019 Statut Membre Dernière intervention 5 décembre 2019
4 déc. 2019 à 09:08
D’ailleurs a force de chercher je me suis rendu compte que je n'avait peux etre pas besoin de 4 colonnes. J'ai besoin que que 1 ligne soit un bloc entier.
Donc que nom, date, heure, (utc) soit rechercher en un 1 bloc de la liste 1 vers la liste 2.
Cela change du coup pas mal de chose et il faut dire que je suis un peu perdu du coup.
Désolé, pouvez-vous m'aiguiller vers une solution ?
cdt
Paz
0
via55 Messages postés 14494 Date d'inscription mercredi 16 janvier 2013 Statut Membre Dernière intervention 26 octobre 2024 2 734
Modifié le 4 déc. 2019 à 13:33
Bonjour

Mon code compare bien les 4 valeurs ensembles et fonctionne sans accroc
Dans ton exemple les blocs ne sont pas dans le désordre ils sont bel et bien différents
ex ligne 2 (4 premières colonnes) : Mbd2006 24/10/2019 12.52 (utc) qui est bien différent de la ligne 5 (4 autres colonnes Mbd2006 27/10/2019 15.52 (utc)

Cdlmnt
Via
0
Pazzaki Messages postés 10 Date d'inscription mardi 3 décembre 2019 Statut Membre Dernière intervention 5 décembre 2019
5 déc. 2019 à 11:33
Après avoir ré-essayer je me rend bien compte que finalement ton code correspond parfaitement a ce que je voulais ! 1000 merci tu m'a était d'une très grande aide !

Je pense que je peut passer le forum sur résolu !
0
yora-senior Messages postés 22 Date d'inscription mardi 3 décembre 2019 Statut Membre Dernière intervention 22 mai 2021 4
Modifié le 4 déc. 2019 à 10:20
Bonjour,

En effet, j'avais mal défini la dernière colonne pour écrire "Différent" dans la suivante.
Pour changer le nombre de colonnes, il n'y a qu'une variable à modifier.
Je dois m'absenter, je vous adresse les modifications et les explications en début d'après-midi.
1
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié le 4 déc. 2019 à 10:53
Bonjour,

pourrais tu mettre une copie de ton classeur, ce qui faciliterait mon travail (bosser sur du réel)
pour cela
Mettre le classeur sans données confidentielles en pièce jointe sur 
https://mon-partage.fr
Dans lien de téléchargement
faire un clic droit- copier l’adresse du lien et le coller dans votre message en cours sur ccm

Il y a possibilité sans trop de problème de comparer tes 2 blocs de hauteurs différentes
surtout si tu as un grand nombre de lignes(combien?)

ci joint un exemple de comparaison de 2 listes d'1 colonne sur 10000 lignes en moins d'une seconde et qui serait bien sûr à modifier pour l'adapter à ton souci
https://mon-partage.fr/f/SPyJRJWN/

dans l'attente


1
Pazzaki Messages postés 10 Date d'inscription mardi 3 décembre 2019 Statut Membre Dernière intervention 5 décembre 2019
4 déc. 2019 à 12:48
bonjour,
malheureusement j'ai un proxy ne me permettant pas d’accéder au site. J’essaie demain sur mon pc perso.
Merci
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
4 déc. 2019 à 13:39
OK, j'attends demain. si possible le matin :o)

@+
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yora-senior Messages postés 22 Date d'inscription mardi 3 décembre 2019 Statut Membre Dernière intervention 22 mai 2021 4
Modifié le 4 déc. 2019 à 11:05
Voici le code modifié pour 2 fois 4 colonnes à comparer, la 1re série étant séparée de la 2e par une colonne vide.

Option Explicit
Dim i%, n%, dl%, x%, dc%
Sub Compare()
' i = n° ligne
'n = n° 1re série de colonnes
'dl = dernière ligne
'dc = dernière colonne
'x = n + 4 (colonnes à comparer)

dl = Range("A65536").End(xlUp).Row
dc = Cells(1, Columns.Count).End(xlToLeft).Column
For n = 1 To 4
For i = 1 To dl
x = n + 5
If Cells(i, n) <> Cells(i, x) Then
Cells(i, n).Font.ColorIndex = 3
Cells(i, x).Font.ColorIndex = 3
Cells(i, dc + 1) = "Différent"
End If
Next i
Next n
End Sub
1
Pazzaki Messages postés 10 Date d'inscription mardi 3 décembre 2019 Statut Membre Dernière intervention 5 décembre 2019
4 déc. 2019 à 12:38
Effectivement ton code marche bel et bien. comme j'ai repondu à via55 au dessus, mon problème et un peu différent au final. Il s'agirait de comparer toute une ligne de la liste 1 avec les lignes de la liste 2 (dans le désordre du coup) :/

message d'au dessus :
Pazzaki - 4 déc. 2019 à 09:08
D’ailleurs a force de chercher je me suis rendu compte que je n'avait peux etre pas besoin de 4 colonnes. J'ai besoin que que 1 ligne soit un bloc entier.
Donc que nom, date, heure, (utc) soit rechercher en un 1 bloc de la liste 1 vers la liste 2.
Cela change du coup pas mal de chose et il faut dire que je suis un peu perdu du coup.
Désolé, pouvez-vous m'aiguiller vers une solution ?
cdt
Paz
0
yora-senior Messages postés 22 Date d'inscription mardi 3 décembre 2019 Statut Membre Dernière intervention 22 mai 2021 4
Modifié le 4 déc. 2019 à 14:05
A priori, si j'ai bien compris la réponse, le code fonctionne pour un série de X premières colonnes comparées à un même nombre d'une 2e série de colonnes.

Il s'agirait maintenant de comparer les données de 2 colonnes, a priori rien de plus facile, mais vous indiquez :
Il s'agirait de comparer toute une ligne de la liste 1 avec les lignes de la liste 2 (dans le désordre du coup
et là, il y a un besoin de précision.

Il n'est pas nécessaire de joindre un fichier, mais au moins un exemple précis et explicité.
1
yora-senior Messages postés 22 Date d'inscription mardi 3 décembre 2019 Statut Membre Dernière intervention 22 mai 2021 4
Modifié le 4 déc. 2019 à 16:42
J'ai relu votre réponse : pour le cas où vous auriez compacté les 4 premières colonnes en une seule et les 4 autres également, ce serait encore plus simple, bien évidemment, mais est-ce le cas ?
Ici, j'ai prévu en colonne vide entre les deux autres, si ce n'est pas le cas il suffit de modifier :
"pc+2" en "pc+1" (deux fois) et pc+3 en pc+2

Option Explicit
Dim pl%, pc%, dl%

Sub Compare()
pl = 1 'n° première ligne
pc = 1 'première colonne
dl = Range("A65536").End(xlUp).Row
'ici on affecte la couleur noire au données des colonnes 1 et 3, puis on supprime la colonne 4
'pour le cas où vous auriez modifié et que vous vouliez relancer à nouveau
Range(Cells(pl, pc), Cells(dl, pc+2)).Select
Selection.Font.ColorIndex = 0
Columns(4).Delete Shift:=xlToLeft
For i = pl To dl
If Cells(i, pc) <> Cells(i, pc + 2) Then
Cells(i, pc).Font.ColorIndex = 3
Cells(i, pc + 2).Font.ColorIndex = 3
Cells(i, pc + 3) = "Différent"
End If
Next i
End Sub
1
Pazzaki Messages postés 10 Date d'inscription mardi 3 décembre 2019 Statut Membre Dernière intervention 5 décembre 2019
5 déc. 2019 à 11:00
L'idée serai de toujours avoir les données espacer en 4 colonnes (finalement uniquement pour une question de pratique / présentation) mais qu'elles soit prise en compte comme 1 seul bloc. Enfaite le nom, date, heure doit fonctionner ensemble. je sais pas si je suis assez clair.


Je ré-explique mon probleme avec des screen au cas ou.

J'aimerai, a l’échelle de 500 lignes environ, savoir pour chaque bloc de la liste gauche, si elles sont bien dans la liste droite. Donc même si "Mbd12020 12/11/2019 ...etc est a la ligne 19 dans la liste gauche, avoir un "ok" dans al colonne E si elle fait bien parti de la liste droite (même si elle se trouve a la ligne 24 par exemple)

ici dans la cellule 19E il y aurait ecrit "ok"
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
5 déc. 2019 à 09:07
Bonjour tt le monde,

C'est en cours d'essai sur environ 30 lignes colonne A: il n'y a pas besoin de la colonne test J
Je dois m'absenter quelques heures, merci d'^tre patient

mais si tu as plusieurs milliers de lignes, il faudrait s'y prendre autrement question rapidité
1
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 310
Modifié le 5 déc. 2019 à 10:46
Re,

ci joint proposition avec une maquette
https://mon-partage.fr/f/ryuY3BL1/

Si cela te convient, je peux améliorer le avec des procédures paramétrées pour aérer l'ensemble (similitude de code entre les 2 blocs). Tu dis...

Edit10:40H
Oups!... :-/
étourderie dans la macro nettoyer dans le module routines; écrire
Sub nettoyer()
Cells.Interior.Color = xlNone
Range("A1").Select
End Sub
0
yora-senior Messages postés 22 Date d'inscription mardi 3 décembre 2019 Statut Membre Dernière intervention 22 mai 2021 4
3 déc. 2019 à 19:11
Bonjour,

Comme l'écrit Via55, si le nombre de lignes est constant pour les deux groupes de trois colonnes, cela devrait fonctionner :
Option Explicit
Dim i%, n%, dl%, x%
Sub Compare()
dl = Range("A65536").End(xlUp).Row
For n = 1 To 3
For i = 1 To dl
x = n + 4
If Cells(i, n) <> Cells(i, x) Then
Cells(i, n).Font.ColorIndex = 3
Cells(i, x).Font.ColorIndex = 3
Cells(i, n + 1) = "Différent"
End If
Next i
Next n
End Sub


On peut bien sûr modifier le nombre de colonnes (valeur de "n").
0
Pazzaki Messages postés 10 Date d'inscription mardi 3 décembre 2019 Statut Membre Dernière intervention 5 décembre 2019
4 déc. 2019 à 08:51
Bonjour,

Merci d'avoir prit le temps de m'aider. Je ne comprend pas tout a fait ce que fait votre code. Chez moi il indique exécute ca :

j'ai changer le n pour avoir 4 colonnes.
0
Pazzaki Messages postés 10 Date d'inscription mardi 3 décembre 2019 Statut Membre Dernière intervention 5 décembre 2019
5 déc. 2019 à 11:34
La réponse de via55 correspondant parfaitement a mon problème je clos le sujet, merci a tous ceux qui ont prit le temps de m'aider ! :)
0