Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
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.
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
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
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 ?
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é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 ?
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 😉
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.
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
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 ^^
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD