Comparaison de chaines de caracteres dans 2 listes en VBA

Comparaison de chaines de caracteres dans 2 listes en VBA - VB/VBA/VBS - Programmation

Marsh Posté le 08-04-2010 à 17:47:43    

Salut a tous,  
 
Je débute en vba et je dois résoudre un petit probleme:
 
je dispose de 2 listes disposées en 2 colonnes (2000 et 4000 lignes) avec des noms de sociétés dans les 2. Je souhaite écrire un code qui me permettrait de voir s'il ya des doublons i.e si un nom est présent dans les 2 listes a la fois.
 
Le soucis c'est que par exemple, je peux avoir "accenture" dans une liste et que "accent." dans l'autre.
 
Donc ce que j'aimerai faire c'est une boucle for qui "enregistre" la chaine de caractere de la 1ere cellule de la liste 1 (1ere colonne) et qui cherche si cette chaine réapparait dans la liste 2 (2eme colonne) meme partiellement.
 
S'il y a au moins une occurence en liste 2, je voudrais mettre un fond rouge sur la cellule de la liste 1.
 
voila j'espere que c'est clair parce que la j'ai vraiment besoin d'aide
 
Merci pour tout

Reply

Marsh Posté le 08-04-2010 à 17:47:43   

Reply

Marsh Posté le 09-04-2010 à 01:10:37    

bonjour,
A mon avis ce n'est pas du ressort d'un débutant en VBA. (A moins que tu sois déjà un programmeur confirmé dans 2 ou 3 autres langages)
Si c'est le cas tu peux consulter ce topic qui traite précisément de la comparaison de bribes de chaînes. Ce topic à été la sage de l'été ...2005 ! Néanmoins on y trouve encore quelques liens vers des fichiers démo qui sont encore actifs et qui permettent de comprendre la démarche.
Néanmoins je t'avoue que je ne suis pas prêt à me relancer dans une nouvelle saga 2010...  
Au reste à mon avis les explications sont relativement claires. Néanmoins comme nous avons un moment correspondu par Tel et par email certains points peuvent te sembler obscurs. Tu peux toujours demander quelques précisions...
A+

Reply

Marsh Posté le 09-04-2010 à 09:34:03    

Voila ce que j'ai réussi a faire pour le moment:
 
Sub comparaison()
'test chaque cellule col A // chaque cellule col B (nom exact)
 
 
Dim i As Long
Dim j As Long
 
For i = 1 To 3600    'dimension colonne A
    For j = 1 To 5000     'dimension colonne B
        If Cells(i, 3).Value = Cells(j, 4).Value Then
        Cells(i, 3).Select
        Selection.Interior.ColorIndex = 3
        End If
    Next j
Next i
 
End Sub
 
1er souci: ca ne marche que pour les noms exactement identiques
2: C'est looong mais ca a la limite c'est pas grave
 
Des idées pour que ca marche avec des occurences meme partielles (disons 3 ou 4 caracteres communs)???

Reply

Marsh Posté le 09-04-2010 à 09:54:07    

galopin01 a écrit :

bonjour,
A mon avis ce n'est pas du ressort d'un débutant en VBA. (A moins que tu sois déjà un programmeur confirmé dans 2 ou 3 autres langages)
Si c'est le cas tu peux consulter ce topic qui traite précisément de la comparaison de bribes de chaînes. Ce topic à été la sage de l'été ...2005 ! Néanmoins on y trouve encore quelques liens vers des fichiers démo qui sont encore actifs et qui permettent de comprendre la démarche.
Néanmoins je t'avoue que je ne suis pas prêt à me relancer dans une nouvelle saga 2010...  
Au reste à mon avis les explications sont relativement claires. Néanmoins comme nous avons un moment correspondu par Tel et par email certains points peuvent te sembler obscurs. Tu peux toujours demander quelques précisions...
A+


 
Salut Galopin01,  
 
Deja merci pour ta réponse. Ca ma permis de regler le probleme de lenteur !!!! j'ai réussis a adapter le code de l'autre topic et ca marche j'arrive au même résultat mais en quasi instantané!!!! merci
 
Par contre je suis tjs a la recherche d'une solution pour reconnaitre les occurences partielles je continue a lire...


Message édité par jt75 le 09-04-2010 à 10:04:51
Reply

Marsh Posté le 09-04-2010 à 10:23:01    

Eplucher le lien donné précédemment : Tout y est expliqué ! :D  
 
ca ne marche que pour les noms exactement identiques
 
C'est normal tu veux pas faire en 10 lignes ce qu'on a résolu en 80 et 3 mois de travail !
 
C'est looong mais ca a la limite c'est pas grave
 
relire le lien donné précédemment : j'y explique qu'en travailant sur des instances et des Array c'est 20 fois plus rapide...
De plus en supprimant les Select et en saupoudrant de
 
Application.ScreenUdating = False c'est également (beaucoup) plus rapide
Cells(i, 3).Interior.ColorIndex = 3  
 
Des idées pour que ca marche avec des occurences meme partielles
Bien digérer le lien donné précédemment ou trouver un programmeur expérimenté !
 
La clef du problème c'est InStr mais le noeud du problème c'est le parametrage de InStr en longueur et "en glissant".
Bref il faut avoir des patins et savoir y faire un double sarko arrière sur une planche à clou !  :heink:  
 
Bon. Heu... Je peux me tromper, je suis pas "un pro", just a "bricolo" mais je pense que personne ne me contredira avec des arguments étayés...
A+


Message édité par galopin01 le 09-04-2010 à 11:23:27
Reply

Marsh Posté le 09-04-2010 à 10:46:29    

Bon j'ai mieux épluché ton lien et effectivement mes réponses y étaient....
 
Je crois que j'ai ma solution, dans tous les cas je te remercie beaucoup tu ma enlevé une belle épine du pied!!!!
 
Merciiiii

Reply

Marsh Posté le 09-04-2010 à 11:39:13    

Le seul problème (résolu dans ce topic par une boite de dialogue XL 5)
c'est le paramétrage de Instr.
Je crois qu'il n'est pas possible (enfin ce n'était pas possible à l'époque) de visualiser la bribe de chaine pour la modifier pendant le processus.
En effet cela nécessite des contrôles TextBox ou il est possible de mettre en évidence une partie du texte en gras ou en coloration.
Cela nécessite je crois une propriété (ou un contrôle ?) de Type RichText qui existait à l'époque et qui a disparu ensuite dans les USF et n'est plus documenté.
Je crois qu'on retrouve ces propriétés (RichText) dans ACCESS mais plus dans Excel...  
D'ou la nécessité d'utiliser ces boites de Dialogue qui commencent à dater un peu.
 
En grattant un peu dans le code du module "Dial" de soluce.xls tu devrais trouver les méthodes nécessaires.
Nota : il faut télécharger le zip. Le fichier n'est pas endommagé mais bizarement, il refuse de s'ouvrir dans IE
A+

Reply

Marsh Posté le 09-04-2010 à 11:47:02    

Ouai merci je vais voir ca...  
 
Sinon juste un ptit truc: a la fin du prog j'aimerai lui demander de regrouper en haut de la liste 1 les lignes en rouge... genre:
 
or i = 4000 To 1 Step -1
    If Cells(i, 1).Interior.ColorIndex = 3 Then
    Cells(i, 1).Select
    Selection.EntireRow Shift:=xlUp
    End If
Next i
 
sauf que vu qu'il y a deux feuilles je ne sais pas comment lui dire que c'est sur la feuille 1! ca pour le coup je pense pas que c'est trés difficile mais comme je débute...
 
Merci mec

Reply

Marsh Posté le 09-04-2010 à 15:53:54    

Comme tu débutes on considèrera que ce n'est pas possible.  :D  (car le déplacement influe sur la numérotation de toutes les lignes)
Il est préférable de mettre un flag sur la première collonne inutilisée et quand la boucle est terminée filtrer sur la colonne des flags.
Genre :
 
For i = 4000 To 1 Step -1  
    If Worksheets(1).Cells(i, 1).Interior.ColorIndex = 3 Then  Worksheets(1).Cells(i, 10) = 1  
Next
 
Rappel : Les Select doivent être bannis de ton vocabulaire...
 
A+


Message édité par galopin01 le 09-04-2010 à 15:55:37
Reply

Marsh Posté le 09-04-2010 à 18:12:11    

Hey galopin01,  
 
Ok, j'ai compris pour les Select ! c'est vrai que ta méthode a l'air bcp plus rapide...
 
Merci pour ta dernière astuce pour grouper les couleurs.
 
Super sympa vraiment ca fait plaisir!
 
A bientot

Reply

Marsh Posté le 09-04-2010 à 18:12:11   

Reply

Marsh Posté le 12-04-2010 à 08:46:24    

Hello
 
Une petite aide supplémentaire :
Pour trouver les doublons avec des valeurs exactes, une formule suffi.
 
Je pars du principe que tes sociétés sont en colonne A et B, et commencent à la seconde ligne :
En C2 :
=SI(NB.SI($A$2:$A$65536;B2)>=1;1;0)
Si les sociétés de la colonne B sont en colonne A, il te mettra un 1, sinon un 0
 
Ca permet, dans un premier temps d'epurer ta source pour ensuite y passer des boucles en VBA un peu plus longue et fastidieuse.
 
Cordialement


---------------
Soyez malin, louez entre voisins !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed