Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1984 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Comparaison de chaines de caracteres dans 2 listes en VBA

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Comparaison de chaines de caracteres dans 2 listes en VBA

n°1982118
jt75
Posté le 08-04-2010 à 17:47:43  profilanswer
 

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

mood
Publicité
Posté le 08-04-2010 à 17:47:43  profilanswer
 

n°1982290
galopin01
Posté le 09-04-2010 à 01:10:37  profilanswer
 

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+

n°1982336
jt75
Posté le 09-04-2010 à 09:34:03  profilanswer
 

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)???

n°1982357
jt75
Posté le 09-04-2010 à 09:54:07  profilanswer
 

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
n°1982380
galopin01
Posté le 09-04-2010 à 10:23:01  profilanswer
 

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
n°1982399
jt75
Posté le 09-04-2010 à 10:46:29  profilanswer
 

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

n°1982433
galopin01
Posté le 09-04-2010 à 11:39:13  profilanswer
 

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+

n°1982438
jt75
Posté le 09-04-2010 à 11:47:02  profilanswer
 

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

n°1982606
galopin01
Posté le 09-04-2010 à 15:53:54  profilanswer
 

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
n°1982669
jt75
Posté le 09-04-2010 à 18:12:11  profilanswer
 

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

mood
Publicité
Posté le 09-04-2010 à 18:12:11  profilanswer
 

n°1983077
dje69r
Arme de distraction massive
Posté le 12-04-2010 à 08:46:24  profilanswer
 

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


---------------
Plus tu pédales moins vite, moins tu avances plus vite — SuperLoustic ! La radio des Loustics !

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Comparaison de chaines de caracteres dans 2 listes en VBA

 

Sujets relatifs
Formule VBA Cells.findLangage C : concaténation de chaines de caractères
[MYSQL] Lister valeur supérieure ou égale à 8 caractèresComparaison de chaine de caractères / Question à la con
Comptage des voyelles d'une suite de caracteres, plusieurs questions..Transfert de données d'une feuille excel vers un tableau VBA
[VBA - Macro Excel] Masquer colonne sous conditionFaire un tableau en parsant des chaines issues de pages HTML dynamique
Plus de sujets relatifs à : Comparaison de chaines de caracteres dans 2 listes en VBA


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR