comparaison de données de 2 listes

adrian

XLDnaute Nouveau
Bonjour à tous,

Je cherche à comparer 2 listes de données entre elles afin d'identifier les similitudes.

Le 1er onglet de mon fichier comprend la "liste comparative" avec 2 colonnes : A = "nom" et B = "n° de référence"

Le second onglet comprend le "fichier source" avec en colonne B un ou plusieurs "numéros de référence" pour chaque "produit" (colonne A)

Je souhaite identifier les produits (onglet "fichier source", col A) dont un ou plusieurs numéros de référence (onglet "fichier source", col B) apparaissent dans la liste comparative (1er onglet, col B).

Ensuite, il faudrait copier dans le fichier source pour chaque produit le(s) nom(s) ainsi que le(s) n° de référence qui apparaissent dans la liste comparative.

Je joins un fichier test avec la macro permettant de répondre à mon problème dans le cas où une seule référence est présente dans l'onglet "fichier source". Par contre, lorsqu'il y a plusieurs n°, ils sont séparés par une virgule dans la même cellule et je ne sais pas comment comparer chacun des n° indépendamment...

Si quelqu'un a une solution où même des éléments de réponse, je suis preneur.

D'avance merci et à bientôt pour poursuivre cette discussion avec vous.
 

Pièces jointes

  • test forum excel downloads_v1.xlsm
    18 KB · Affichages: 75

Fred0o

XLDnaute Barbatruc
Re : comparaison de données de 2 listes

Bonsoir adrian,

Voici la macro corrigée et qui fonctionne chez moi :
VB:
Sub liste_comparative()
    Dim i As Byte, j As Byte
    For i = 5 To 100
        If Sheets("liste comparative").Range("B" & i) <> "" Then
            For j = 5 To 100
                If Sheets("fichier source").Range("B" & j) <> "" Then
                    If InStr(1, Sheets("fichier source").Range("B" & j), Sheets("liste comparative").Range("B" & i)) > 0 Then
                        Sheets("fichier source").Range("D" & j) = "oui"
                        Sheets("fichier source").Range("E" & j) = Sheets("liste comparative").Range("B" & i)
                        Sheets("fichier source").Range("F" & j) = Sheets("liste comparative").Range("A" & i)
                    End If
                End If
            Next
        End If
        If Sheets("fichier source").Range("B" & i) <> "" And Sheets("fichier source").Range("D" & i) <> "oui" Then
            Sheets("fichier source").Range("D" & i) = "non"
            Sheets("fichier source").Range("E" & i) = "aucune"
            Sheets("fichier source").Range("F" & i) = "aucun"
        End If
    Next
End Sub

A+
 

adrian

XLDnaute Nouveau
Re : comparaison de données de 2 listes

Bonjour Fred0o, bonjour tout le monde,

Merci pour cette correction de macro qui fonctionne parfaitement. Est-ce que tu pourrais en quelques mots m'expliquer cette partie de code stp :
InStr(1, Sheets("fichier source").Range("B" & j), Sheets("liste comparative").Range("B" & i)) > 0

sinon juste une dernière question, est-ce qu'il serait possible de copier dans le "fichier source" plusieurs noms et n° de référence ? Je m'explique : pour le moment on écrit dans ce fichier si le produit comprend un N° de réf en commun avec la liste comparative, mais s'il y a plusieurs nom/réf en commun seul le 1er apparait. Ex sur le fichier joint en ligne 7 produit C, il y a 2 num de référence compris dans la liste comparative.

d'avance merci et à bientôt!!

J'ai résolu ce point en modifiant le précédent code ce qui me permet d'insérer une ligne si une référence a déjà été identifiée :

Code:
Sub liste_comparative()
Application.ScreenUpdating = False
Sheets("fichier source").Range("D5:F100").ClearContents
For k = 100 To 5 Step -1
    If Sheets("fichier source").Range("A" & k) = "" And Sheets("fichier source").Range("D" & k) = "" Then
    Rows(k).Delete
    End If
Next
For i = 5 To 100
    If Sheets("liste comparative").Range("B" & i) <> "" Then
        For j = 5 To 100
            If Sheets("fichier source").Range("B" & j) <> "" Then
                If InStr(1, Sheets("fichier source").Range("B" & j), Sheets("liste comparative").Range("B" & i)) > 0 Then
                    If Sheets("fichier source").Range("D" & j) = "" Then
                    Sheets("fichier source").Range("D" & j) = "oui"
                    Sheets("fichier source").Range("E" & j) = Sheets("liste comparative").Range("B" & i)
                    Sheets("fichier source").Range("F" & j) = Sheets("liste comparative").Range("A" & i)
                    Else
                    Rows(j + 1).Insert
                    Sheets("fichier source").Range("D" & j + 1) = "oui"
                    Sheets("fichier source").Range("E" & j + 1) = Sheets("liste comparative").Range("B" & i)
                    Sheets("fichier source").Range("F" & j + 1) = Sheets("liste comparative").Range("A" & i)
                    End If
                End If
            End If
        Next
    End If
    If Sheets("fichier source").Range("B" & i) <> "" And Sheets("fichier source").Range("D" & i) <> "oui" Then
    Sheets("fichier source").Range("D" & i) = "non"
    Sheets("fichier source").Range("E" & i) = "aucune"
    Sheets("fichier source").Range("F" & i) = "aucun"
    End If
Next
End Sub
 
Dernière édition:

adrian

XLDnaute Nouveau
Re : comparaison de données de 2 listes

rebonjour,

en faisant tourner la macro sur le fichier complet, je me suis aperçu d'un autre soucis :

si l'un des numéros de référence d'un produit comprend une partie d'une référence de la liste comparative (ex : 12xx-xx-x pour le produit et xx-xx-x pour la liste) celui-ci est noté comme appartenant à la liste comparative ce qui ne devrait pas être le cas.

ci-joint le fichier test avec en ligne 12 le produit H dont l'un des numéros est le "34590-94-8", un "interdit 3" a également été ajouté sur la liste comparative ("90-94-8"). La macro reconnait la fin de cette chaine de caractère dans la référence du produit H alors que les références sont en réalité différentes.

Comment puis-je résoudre ce petit problème svp ?

PS : ah la joie du VBA, dès que ça se complique un peu, je prends l'eau et suis perdu... un grand merci aux utilisateurs de ce forum!!

Par contre pour ce point je n'ai toujours pas trouvé de solution, est-ce que quelqu'un aurait la possibilité de m'aiguiller svp ?
 

Pièces jointes

  • test forum excel downloads_v2.xlsm
    18.3 KB · Affichages: 47
Dernière édition:

adrian

XLDnaute Nouveau
Re : comparaison de données de 2 listes

hello le forum,

la modification d'un message ne remontant pas le sujet dans le fil des discussions sur la page d'accueil du forum, je rajoute celui-ci et en profite pour vous transmettre la dernière version du fichier test.

le dernier problème identifié à résoudre est donc celui du post précédent.

D'avance merci de votre aide.
 

Pièces jointes

  • test forum excel downloads_v3.xlsm
    19.7 KB · Affichages: 45
  • test forum excel downloads_v3.xlsm
    19.7 KB · Affichages: 49
  • test forum excel downloads_v3.xlsm
    19.7 KB · Affichages: 48

adrian

XLDnaute Nouveau
Re : comparaison de données de 2 listes

Bonjour tout le monde,

Désolé de revenir à la charge avec mon problème de comparaison de chaînes de caractères, mais j'ai beau me torturer le crâne et chercher des solutions je n'arrive pas à résoudre mon problème.

les chaînes de caractères comparées comportent bien une partie commune mais ne sont pas en tout point identiques, du coup la fonction InStr retourne bien un résultat positif alors que je ne souhaite pas les identifier comme tel.

Est-ce que quelqu'un aurait une solution, même juste une piste pour orienter mes recherches svp ?

merci
 
Dernière édition:

adrian

XLDnaute Nouveau
Re : comparaison de données de 2 listes

Bonjour le forum,

Je tente un dernier appel à l'aide sur ce sujet. Sinon je ferais sans et conserverais une partie "manuelle" dans l'utilisation de mon fichier.

Est-ce que quelqu'un aurait une piste pour comparer 2 chaînes de caractères, et donner un résultat positif si et seulement si les 2 chaînes sont rigoureusement identiques ? Si une partie de la chaîne est commune, le résultat retourné doit être négatif.

D'avance merci de votre aide

et dans l'espoir de voir apparaitre une réponse, je vous souhaite à tous une bonne journée ;)
 

pierrejean

XLDnaute Barbatruc
Re : comparaison de données de 2 listes

bonjour adrian
Salut FredO0

Un essai (en supposant avoir compris)
 

Pièces jointes

  • test forum excel downloads_v3.xlsm
    24 KB · Affichages: 58
  • test forum excel downloads_v3.xlsm
    24 KB · Affichages: 62
  • test forum excel downloads_v3.xlsm
    24 KB · Affichages: 59

adrian

XLDnaute Nouveau
Re : comparaison de données de 2 listes

bonjour pierrejean, rebonjour le fil,

merci pour cette réponse, en effet tu as tout compris à ma demande.

Avec cette solution le problème de comparaison des chaînes de caractère est résolu, 312xx-xx-x est bien noté comme différent de xx-xx-x.

Par contre pour le cas où plusieurs références sont communes, je souhaiterais finalement conserver ma solution d'ajout d'une ligne par n° de référence en commun. Ne maîtrisant pas du tout les tableaux, je suis pour le moment incapable de modifier la macro "test" que tu as créée... Est-ce qu'il serait possible d'avoir une version modifiée ?

Dans tous les cas je cherche de mon côté, ce sera l'occasion pour moi de me familiariser avec les tableaux.

D'avance merci.
 
Dernière édition:

pierrejean

XLDnaute Barbatruc
Re : comparaison de données de 2 listes

Re

Vois si cela convient
 

Pièces jointes

  • test forum excel downloads_v3.xlsm
    27.7 KB · Affichages: 50
  • test forum excel downloads_v3.xlsm
    27.7 KB · Affichages: 48
  • test forum excel downloads_v3.xlsm
    27.7 KB · Affichages: 50

adrian

XLDnaute Nouveau
Re : comparaison de données de 2 listes

bonjour Pierrejean, bonjour le forum,

Merci pour cette modification, cette fois-ci on en viens presque au bout, juste 2 dernières remarques :

- j'ai ajouté ce morceau de code au début pour remettre à zéro le fichier lorsque l'on souhaite lancer la comparaison, ça évite lorsque l'on clique plusieurs fois sur le bouton d'avoir les résultats qui se cumulent les uns aux autres :

Code:
Application.ScreenUpdating = False 'évite le rafraichissement de l'écran et donc de ralentir la macro
Range("D5:F100").ClearContents 'supprime les résultats précédemment saisis

'la boucle suivante permet de supprimer les lignes vides (qui ont été ajoutées dans la version précédente du fichier si le produit
'comporte plusieurs n° de référence à suivre)
For k = Range("A" & Rows.Count).End(xlUp).Row To 5 Step -1
    If Range("A" & k) = "" And Range("D" & k) = "" Then
    Rows(k).Delete
    End If
Next

- Et enfin il reste un petit soucis, en effet les boucle "for" sont définies jusqu'à Range("F" & Rows.Count).End(xlUp).Row, hors s'il y a plusieurs références en commun ce nombre de ligne ne sera pas fixe vu que l'on insère des lignes. Concrètement le problème est le suivant : sur les derniers produits qui possèdent plusieurs références en commun, celles-ci sont bien identifiés mais toutes recopiées dans la même cellule.

Pour solder ce soucis, j'ai changer le Range("F" & Rows.Count).End(xlUp).Row en Range("F" & Rows.Count).End(xlDown).Row, mais ça ralenti considérablement l'exécution de la macro.

Est-ce qu'il y aurait une autre solution plus fluide svp ?

PS : j'ai également ajouté ce bout de code à la fin pour remplir les cellules dans le cas où les n° de référence ne correspondent pas :

Code:
For l = 5 To Range("A" & Rows.Count).End(xlUp).Row
    If Range("B" & l) <> "" And Range("D" & l) = "" Then
    Range("D" & l) = "non"
    Range("E" & l) = "aucune"
    Range("F" & l) = "aucun"
    End If
Next
 

Pièces jointes

  • test forum excel downloads_v4.xlsm
    29.5 KB · Affichages: 38
  • test forum excel downloads_v4.xlsm
    29.5 KB · Affichages: 40
  • test forum excel downloads_v4.xlsm
    29.5 KB · Affichages: 43

pierrejean

XLDnaute Barbatruc
Re : comparaison de données de 2 listes

Re

Pas tres orthodoxe mais je n'ai pas trouvé mieux
 

Pièces jointes

  • test forum excel downloads_v4.xlsm
    29.4 KB · Affichages: 66
  • test forum excel downloads_v4.xlsm
    29.4 KB · Affichages: 71
  • test forum excel downloads_v4.xlsm
    29.4 KB · Affichages: 64

adrian

XLDnaute Nouveau
Re : comparaison de données de 2 listes

re,

bien vu pierrejean, la petite astuce du *2 me plais beaucoup, traitement rapide, une référence par ligne, uniquement les références strictement identique, tout y est!!

Merci beaucoup à toi et Fred0o pour votre aide, et merci à tous les utilisateurs de ce forum qui regorge de bonnes idées, grâce à vous je progresse de jour en jour sur cet outil passionnant qu'est excel avec ses macros et son langage vba.

A bientôt peut-être pour de nouvelles questions et pourquoi pas même pour apporter des réponses avec mes modestes compétences ^^
 

Statistiques des forums

Discussions
312 320
Messages
2 087 220
Membres
103 497
dernier inscrit
JP9231