Comment éviter les doublons de lignes dans une listbox

papapaul

XLDnaute Impliqué
:) Bonjour le Forum,
Je suis en train de réaliser un outil de recherche par mot
dans l'ensemble d'un classeur.
Ca m'a l'air de tourner pas trop mal mais y a un problème
que j'arrive pas à résoudre (j'ai peut-être pas bien rechercher).
Si dans une ligne j'ai 2 fois un même mot
exemple :1 WankaNews 01/03/2007 XLD Wanka XLD
La listbox et ma feuille résultat affiche 2 fois cette ligne.
Je n'arrive pas éviter les doublons de lignes dans la listbox.:(
J'ai essayé de mettre un module avec la macro de l'autre fichier
ci-joint(supprlignes_entieres_doublons) qui marche bien
dans mon fichier "Wanka" sur la feuille résultat
mais pas dans listbox.
Si quelqu'un a un peu de temps pour m'aiguiller
je le remercie d'avance.
Bonne journée à tous:rolleyes:
 

Pièces jointes

  • supprlignes_entières_doublons.xls
    37 KB · Affichages: 75
  • supprlignes_entières_doublons.xls
    37 KB · Affichages: 83
  • supprlignes_entières_doublons.xls
    37 KB · Affichages: 77
  • wanka_avecdate_xld.zip
    38 KB · Affichages: 31

Hervé

XLDnaute Barbatruc
Re : Comment éviter les doublons de lignes dans une listbox

bonjour

ton souci viens du fait que tu recherche (find) la valeur (XLD) sur l'ensemble de la feuille, et renvoi le résultat dans tablo sans avoir testé si cette ligne était déjà present dans le tablo.

deux solutions :

soit tu boucles sur chaque ligne, et chaque colonne, tu recherches ta valeur, et si celle-ci est présente, tu renvoi la ligne dans tablo et sort de la boucle de colonne.

soit, dès que tu trouves la données par l'intermédiaire find, tu concatènes la ligne et la renvoi dans une collection gérant les doublons. ensuite, il te faudra spliter chaque données de la collection pour la renvoyer dans la listbox.

la premiere solution me semble plus simple ^^

salut
 

papapaul

XLDnaute Impliqué
Re : Comment éviter les doublons de lignes dans une listbox

:) Salut Forum, Hervé.
Merci de ta réponse, mais je crois que Split ne fonctionne pas avec 97.
J'ai donc cherché avec ta solution 1 mais je m'en sors pas :mad:
C'est pas trés grave puisque mes résultats de recherche sont
corrects sur la feuille Résultat. Enfin je crois.
J'aurais bien voulu quand même garder la listbox(sans doublons de lignes)
car avec le code ci-dessous (merci Thierry) :

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
Sheets(CStr(ListBox1.Column(6))).Activate
Range(ListBox1.Column(7)).Activate
Unload Me
End Sub
(Dans cet exemple 6 était le nom des feuilles et 7 les cellules détectés).
Ca permet de retourner directement sur la feuille ou on a
repèré une anomalie ou quelquechose de bizarre et faire la correction.
C'est pratique.
Je continue à chercher, sinon, si vous voyez des trucs qui clochent
pour mes recherches, y en a surement, dites le moi,
Bonne soirée et merci tous les xldeurs
 

Pièces jointes

  • Résultatrecherche_xld.zip
    33.6 KB · Affichages: 33
  • Résultatrecherche_xld.zip
    33.6 KB · Affichages: 30
  • Résultatrecherche_xld.zip
    33.6 KB · Affichages: 27

skoobi

XLDnaute Barbatruc
Re : Comment éviter les doublons de lignes dans une listbox

Re,
comme le fait remarquer Hervé, ta recherche se fait sur l'ensemble de la feuille.Du coup, si ta valeure se trouve plusieurs fois sur la même ligne, celà sera ajouté autant de fois dans le "tablo".
La solution (je pense) serait de détecter si lors de le recherche suivante (findnext) la ligne a changé ou non.
Ci-joint un exemple de ce que je veux dire (execute la macro en pas à pas "F8"pour mieux comprendre).
A adapter et à placer dans ton fichier.

A te relire.

Skoobi
 

Pièces jointes

  • find_findnext.xls
    42.5 KB · Affichages: 53

papapaul

XLDnaute Impliqué
Re : Comment éviter les doublons de lignes dans une listbox

:) Bonjour Forum, merci skoobi,
Je vais étudier ta proposition dès ce soir.
Pour ta 1ère réponse, j'ai bien sur penser aux filtres.
Je peux en faire avant mes recherches.
Mais en vrai j'ai des dizaines de feuilles de plusieurs centaines de lignes.
et ca va augmenter. En plus c'est pas tjs moi qui saisis.
Donc si je cherche par exemple l' article "xyz", mais que je me souviens plus de la date ni du journal, avec les filtres ca risque d'être fastidieux.:eek:
Avec mes recherches successives en commencant par xyz,
si je trouve pas je persiste avec xy ou même y tout seul etc...
..mon truc a l'air correct.
En tout cas merci à toi, je continue pour l'histoire de la listbox.
 

Excel_lent

XLDnaute Impliqué
Re : Comment éviter les doublons de lignes dans une listbox

Salut à tous et aux autres,

Avec « i = C.Row » au lieu de « i = i + 1 » dans la partie recherche, tu n’auras plus les doublons mais apparaîtront des lignes vides. Ce n’est pas gênant quand on voit la simplicité de la procédure pour les effacer.
J'ai fait d'autres transformations pour cette partie mais je n’ai pas regardé la suite.
A tester :
Recherche ---> "wanka" ---> Affiner la recherche : vois si cela t’inspire.
 

Pièces jointes

  • DoublonsListeEliminés.zip
    25.9 KB · Affichages: 32
Dernière édition:

papapaul

XLDnaute Impliqué
Re : Comment éviter les doublons de lignes dans une listbox

:( Merci Excel Lent, excuse moi de répondre tardivement.
J'ai fait comme tu me dis de remplacer i = i+1 par i=C.Row
mais ca fonctionne moins bien qu'avant.
Si je recherche xld , alors dans la listebox apparait 2 fois cette ligne
9 Wanka 01/03/2007 XLD Wanka XLD
et ca insère des lignes vides dans la liste.
Avant j'avais seulement le problème de doublons.
Quelque chose que j'ai oublié ou pas compris ? :confused:
Si quelqu'un pouvais m'expliquer ce qui cloche.
Merci d'avance et bonne journée.:)
 

Pièces jointes

  • Résultatrecherche_listbox_xld.zip
    37.6 KB · Affichages: 29

Bebere

XLDnaute Barbatruc
Re : Comment éviter les doublons de lignes dans une listbox

bonsoir Papapaul,Hervé,Skoobi,Excel_lent
j'ai peut être raté un épisode,on verra bien
l'idée faire le choix de la colonne,auteur ou thème ou journal,etc...
de là faire une liste sans doublons et là choisir pour la recherche
et après le code qui suit(à adapter col,montexte)

Sub MaRecherche()
Dim Plg As Variant, Cel As Range, I As Long, L As Long, C As Byte, NbC As Byte
Dim Firstaddress As String, MonTexte As String, Col As Byte
Dim MaLigne(1 To 1, 1 To 6) As Variant
'bebere
'basé sur la colonne 5,auteur
Col = 5
MonTexte = "La Pompe" 'Wanka,papapaul,La Pompe

Application.ScreenUpdating = False
With Sheets("Feuil1")

.Range("A1").Sort Key1:=.Columns(Col), Header:=xlGuess
Set Cel = .Columns(Col).Find(MonTexte, LookIn:=xlValues, LookAt:=xlPart)
If Not Cel Is Nothing Then
Firstaddress = Cel.Address
C = Cel.Row
Do
I = I + 1 'compte
Set Cel = .Columns(Col).FindNext(Cel)
Loop While Not Cel Is Nothing And Cel.Address <> Firstaddress
End If

Plg = .Range("A" & C & ":G" & I + C - 1)

End With
For I = 1 To UBound(Plg, 1)
For C = 2 To UBound(Plg, 2) - 1
MaLigne(1, C - 1) = Plg(I, C)
Next C
MaLigne(1, 6) = I 'n° de la ligne unique
For L = I To UBound(Plg, 1)
If L <> MaLigne(1, 6) Then
For C = 1 To UBound(MaLigne, 2)
If Plg(L, C + 1) = MaLigne(1, C) Then NbC = NbC + 1 'compte
Next C

If NbC = 5 Then
Plg(L, 7) = "d": NbC = 0 'marque doublons
Else: NbC = 0
End If
End If
Next L

Next I

I = 1
With Sheets("Résultat")
.Range("A2:F" & .Range("A65536").End(xlUp).Row).ClearContents
For L = I To UBound(Plg, 1)
If Plg(L, UBound(Plg, 2)) = "" Then
I = I + 1
For C = 1 To UBound(Plg, 2) - 1
.Cells(I, C).Value = Plg(L, C)
Next C
End If
Next L
End With

Application.ScreenUpdating = True

End Sub

à bientôt
 

Épaf

XLDnaute Occasionnel
Re : Comment éviter les doublons de lignes dans une listbox

papapaul à dit:
Merci de ta réponse, mais je crois que Split ne fonctionne pas avec 97.
Si c'est le split qui te manque sur VBA 97, en voilà un vite fait
Code:
Sub DecouperLaPhrase()
Dim LaPhrase, Tableau, separateur, LetCol, i
    separateur = " "
    LaPhrase = Cells(15, 57).value
    Tableau = Spliit(LaPhrase, separateur)

    'Affichage du tableau
    For i = 0 To UBound(Tableau)
        MsgBox Tableau(i)
    Next
End Sub

Function Spliit(LaPhrase, separateur)
Dim Tableau(), Phrase, i As Byte, j As Byte
    Phrase = LaPhrase
    i = 1
    j = 0
    Do While i < Len(Phrase)
        If Mid(Phrase, i, 1) = separateur Then
            ReDim Preserve Tableau(j)
            Tableau(j) = Left(Phrase, InStr(Phrase, separateur) - 1)
            Phrase = Right(Phrase, Len(Phrase) - InStr(Phrase, separateur))
            j = j + 1
            i = 0
        End If
        i = i + 1
    Loop
    ReDim Preserve Tableau(j)
    Tableau(j) = Phrase
    Spliit = Tableau
End Function
A toutes fins utiles
Mais as-tu penser à utiliser xlWhole à la place de XlPart dans find ? C'est un paramètre de LookIn ou de LookAt. Permet de contrôler le contenu total d'une cellule plutôt qu'une partie de ce contenu. Un coup d'oeil dans l'aide, peut-être ;)
 

skoobi

XLDnaute Barbatruc
Re : Comment éviter les doublons de lignes dans une listbox

Bonsoir skoobi, :)
Comme tu peux le voir j'ai pas réussi à adapter,
que veux tu je suis pas doué :(
Je continue à chercher.

Re,
J'ai analysé ta macro et fait les modifs nécessaires (enfin je pense).
Test voir le fichier modifié.

A+
 

Pièces jointes

  • Résultatrecherche_xld.zip
    33.3 KB · Affichages: 34
  • Résultatrecherche_xld.zip
    33.3 KB · Affichages: 39
  • Résultatrecherche_xld.zip
    33.3 KB · Affichages: 43

papapaul

XLDnaute Impliqué
Re : Comment éviter les doublons de lignes dans une listbox

:) Skoobie, je crois que c'est bon cette fois, mille mercis
Juste 1 petit truc, quand je recherchais xld,
la ligne : 9Wanka01/03/2007XLDWankaXLD

n'apparaissait pas. :confused: Donc j'ai seulement déplacé nouv_ligne = C.Row
et maintenant je crois que ca colle.

Set C = .Find(Text, LookIn:=xlValues, LookAt:=xlPart)
If Not C Is Nothing Then
Firstaddress = C.Address
' nouv_ligne = C.Row
anc_ligne = nouv_ligne
Do
nouv_ligne = C.Row
If anc_ligne <> nouv_ligne Then
ReDim Preserve Tablo(8, i)

Je fais d'autres tests au cas ou.

Bonne soirée et vive xld:)
 

skoobi

XLDnaute Barbatruc
Re : Comment éviter les doublons de lignes dans une listbox

Oui exact, en fait tu peux laisser nouv_ligne = C.Row à son emplacement de départ et changer juste en-dessous anc_ligne = nouv_ligne par anc_ligne = 0.
nouv_ligne = C.Row après Do n'est pas nécessaire car tu le retrouve plus bas.

Voili voilou

skoobi
 

Statistiques des forums

Discussions
312 305
Messages
2 087 070
Membres
103 453
dernier inscrit
Choupi