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
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
A voir également:
- Comparer deux colonnes excel vba
- Liste déroulante excel - Guide
- Déplacer une colonne excel - Guide
- Classer par ordre alphabétique excel plusieurs colonnes - Guide
- Fusionner deux colonnes excel - Guide
- Formule moyenne excel plusieurs colonnes - Guide
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
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
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
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
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
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 :
Cdlmnt
Via
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
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
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
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
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
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
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
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
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
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
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
5 déc. 2019 à 11:33
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
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.
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.
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
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
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
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
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
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
malheureusement j'ai un proxy ne me permettant pas d’accéder au site. J’essaie demain sur mon pc perso.
Merci
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
4 déc. 2019 à 13:39
OK, j'attends demain. si possible le matin :o)
@+
@+
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
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
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
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
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
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
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 n'est pas nécessaire de joindre un fichier, mais au moins un exemple précis et explicité.
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é.
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
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
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
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
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"
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"
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
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é
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é
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
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
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
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
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 :
On peut bien sûr modifier le nombre de colonnes (valeur de "n").
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").
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
4 déc. 2019 à 08:51
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
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 ! :)
3 déc. 2019 à 13:51
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