Doublons Listbox

Résolu
91ced Messages postés 20 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006 - 27 juin 2006 à 14:22
91ced Messages postés 20 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006 - 28 juin 2006 à 11:24
Hello,

comment empêcher les doublons dans une Listbox...?
Mon code actuel est :
Private Sub selection_Click()
Dim files
Dim i As Byte

files = Application.GetOpenFilename(, , "Sélectionner les fichiers à " _
& "imprimer", , True)
If VarType(files) = vbBoolean Then
    GoTo fin
    Else
    GoTo suite
End If
suite:
For i = 1 To UBound(files)
       ListBox1.AddItem (files(i)) 'Remplissage Listbox
Next
fin:
End Sub

Si qqu'un peut m'ajouter ce qu'il faut pour empêcher les doublons ce serait génial !!!!

Merci d'avance

21 réponses

jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
27 juin 2006 à 16:53
Oui,

Dans ce cas il suffit de déclarer ton dictionnaire dans le UserForm et non dans la routine.

(Je suppose que tu es en VBA Excel et non en VB6)

Donc il suffit de faire

Private Elements As New Dictionary 

....Code
Private Sub selection_Click() 
Dim files 
Dim i As Byte 
files =  Application.GetOpenFilename(, , "Sélectionner les fichiers à " _ 
& "imprimer", , True) 
If  VarType (files)  = vbBoolean Then 
    GoTo fin 
    Else 
    GoTo suite 
End If 
suite: 
For i = 1 To UBound(files) 
    If Not Elements.Exists(files(i)) Then 
        Call ListBox1.AddItem(files(i))   'Remplissage Listbox
        Call Elements.Add(files(i), files(i))  'memorisation de l'elements dans le dictionnaire
    End If 
Next 
fin: 
End Sub 

 

<small> Coloration syntaxique automatique [AFCK]</small>

Je pense que cela devrait marcher.
@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement/FONT>
3
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
28 juin 2006 à 09:19
Salut,

On peut essayer autre chose pour ne pas que l'utilisateur est à cocher

Décoche d'abord Microsoft Scripting Runtime puis remplace:

Private Elements As New Dictionary

Par

Private Elements As Object 

Private Sub UserForm_Initialize() 
   Set Elements = CreateObject("Scripting.Dictionary") 
End Sub 

<small> Coloration syntaxique automatique [AFCK]</small>
       

Normalement ceci devrait faire exactement la même chose et te permettra de ne rien avoir à cocher.

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement/FONT>
3
domsig Messages postés 125 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 11 mai 2010
27 juin 2006 à 14:32
salut

avant de faire ton listbox1.additem je pense qu'il faut parcourir tout ton listbox1, et regarder si chaque ligne lue est égale à ce que tu veux ajouter. A la première ligne égale, tu sors de la boucle, sinon à la fin de la boucle tu fais ton additem...

bon courage
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
27 juin 2006 à 14:54
Salut,

Ou alors avant de remplir ton listbox tu passe par un Dictionnaire.

Pour ce faire ajoute la référence Microsoft Sripting Runtime  a ton projet pour pouvoir etre en mesure d'utiliser cet objet.

Et ensuite tu adapte ton code de la manière suivante.

Private Sub selection_Click() 
Dim files 
Dim i As Byte 
Dim Elements As New Dictionary 
files =  Application.GetOpenFilename(, , "Sélectionner les fichiers à " _ 
& "imprimer", , True) 
If  VarType (files)  = vbBoolean Then 
    GoTo fin 
    Else 
    GoTo suite 
End If 
suite: 
For i = 1 To UBound(files) 
    If Not Elements.Exists(files(i)) Then 
        Call ListBox1.AddItem(files(i))   'Remplissage Listbox
        Call Elements.Add(files(i), files(i))  'memorisation de l'elements dans le dictionnaire
    End If 
Next 
fin: 
End Sub 

 

<small> Coloration syntaxique automatique [AFCK]</small>
       

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement/FONT>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
91ced Messages postés 20 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
27 juin 2006 à 15:32
Ben oui je sais mais justement c'est ça le problème : je ne parviens à "pondre" le code correspondant....
0
91ced Messages postés 20 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
27 juin 2006 à 15:35
Merci Julien,
Je pense privilégier ta solution, qui me semble rapide et efficace.
Par contre j'ai un message d'erreur :
Erreur de compilation
Type défini par l'utilisateur non défini

concernant apparement Dim Elements As New Dictionary

Une idée ?
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
27 juin 2006 à 15:38
Salut,

Tu as oublié la première partie de mon message qui dit:

"Pour ce faire ajoute la référence Microsoft Sripting Runtime  a ton projet pour pouvoir etre en mesure d'utiliser cet objet."

Si tu ne sais pas faire:

Depuis vb6 Menu Outils => Références => Microsoft Scripting Runtime => OK

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement/FONT>
0
91ced Messages postés 20 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
27 juin 2006 à 16:01
Autant pour moi, désolé.........

1.Plus de message maintenant, mais cela marchera t-il si exécuté sur un autre poste...

2. Problème résolu mais le problème initial reste entier, cela n'empêche pas les doublons....
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
27 juin 2006 à 16:04
re,

"Problème résolu mais le problème initial reste entier, cela n'empêche pas les doublons...."

C'est pas un peu contradictoire ca comme phrase?????

Peu tu donner le contenu de ton fichier pour le test s'il te plait.

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement/FONT>
0
91ced Messages postés 20 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
27 juin 2006 à 16:11
Je voulais dire que le problème concernant le message d'erreur était résolu, mais pas celui concernant les doublons.

Contenu excel par exemple :
<colgroup><col style=\"WIDTH: 178pt; mso-width-source: userset; mso-width-alt: 8667\" width=\"237\" /></colgroup>----
D:\f1526_p4p800_e_deluxe.pdf
<colgroup><col style=\"WIDTH: 178pt; mso-width-source: userset; mso-width-alt: 8667\" width=\"237\" /></colgroup>----
D:\test.doc
<colgroup><col style=\"WIDTH: 178pt; mso-width-source: userset; mso-width-alt: 8667\" width=\"237\" /></colgroup>----
C:\spybot.txt
<colgroup><col style=\"WIDTH: 178pt; mso-width-source: userset; mso-width-alt: 8667\" width=\"237\" /></colgroup>----
C:\acpEGath.xml

et ma macro, comme modifié selon tes indications :
Private Sub selection_Click()
'---------------Sélection des fichiers-----------------
Dim files
Dim i As Byte
Dim compt As Byte
Dim Elements As New Dictionary

files = Application.GetOpenFilename(, , "Sélectionner les fichiers à " _
& "imprimer", , True)
If VarType(files) = vbBoolean Then
    GoTo fin
    Else
    GoTo suite
End If

suite:
For i = 1 To UBound(files)
    If Not Elements.Exists(files(i)) Then
        Call ListBox1.AddItem(files(i))   'Remplissage Listbox
        Call Elements.Add(files(i), files(i))  'Memorisation element dans le dictionnaire
    End If
Next

For compt = 0 To ListBox1.ListCount - 1
    Worksheets("Liste").Cells(compt + 1, 1) = ListBox1.List(compt) 'Remplissage excel
Next

fin:
End Sub

Merci pour ton aide précieuse, je tourne en rond moi....
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
27 juin 2006 à 16:24
Salut,

J dois être bête mais je vois pas ou cela coince. IL ne peux pas y avoir de doublons si tu selectionnes des fichiers, vu que deux fichiers ne peuvent pas s'appeler pareil.

Si tu entends par doublons le fait de d'appuyer deux fois sur le bouton et de selectionner deux fois les meme fichiers.
alors il suffisait d'ajouter a ton code de départ

Call ListBox1.Clear juste au debut de ta routine.

Si ce n est pas ca il faut expliquer de nouveau car je ne vois pas ou est le problème.

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement/FONT>
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
27 juin 2006 à 16:30
Salut,

Y'a mieux, télécharge ma source et t'as le code dedans. (un peu de pub, ça fait du bien)
http://www.vbfrance.com/codes/TRIEUR-DOUBLONS_38162.aspx

@ ++

Mortalino
0
91ced Messages postés 20 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
27 juin 2006 à 16:37
En fait, ce que je souhaite, c'est que lorsque l'utilisateur appuie à nouveau sur le bouton de sélection, s'il a oublié des fichiers ou pour x raisons, qu'il ne puisse pas re-sélectionner un fichier qui est déjà dans la liste (par mégarde ou exprès).

Je ne pense pas que listbox1.clear soit la solution, ça va me réinitialiser ma liste, non ?
0
domsig Messages postés 125 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 11 mai 2010
27 juin 2006 à 17:33
je suis peut-être de mauvaise foi mais il me semble que ma soluce est vaaaachement plus simple...
c'est vous qui voyez !
0
91ced Messages postés 20 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
28 juin 2006 à 08:54
Merci Julien ça marche.
Oui je suis sous VBA Excel, je n'ai peut-être pas bien choisi la rubrique. Vu que la version de VBA est la 6.0 sur ma machine, j'ai confondu avec VB6...

Sinon dernière chose : le fait d'avoir cocher Microsoft Scripting Runtime sur mon poste impose t-il que chaque utilisateur qui utilisera ma macro devra faire de même ????
Ou y a t-il moyen de faire autrement ?

Encore merci.
0
91ced Messages postés 20 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
28 juin 2006 à 08:57
Merci Mortalino.
Mais pour le moment je préfère garder ma soluce : Je débute en VBA, alors je ne suis pas peu fier d'avoir déjà réussi à pondre ce bout de code !!!!

Mais je te remercie et je vais regarder ta soluce de près ce matin.
Histoire de voir comment j'aurais pu également faire, et d'apprendre de nouvelles choses.

Merci à toi
0
91ced Messages postés 20 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
28 juin 2006 à 10:36
V'là que ça coince là du coup ???? :

If Not Elements.Exists(files(i)) Then

Une idée ....?
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
28 juin 2006 à 10:48
Re,

Tu as bien tout fait comme je te le propose car de mon côté cela ne coince pas du tout.

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement/FONT>
0
91ced Messages postés 20 Date d'inscription vendredi 5 mai 2006 Statut Membre Dernière intervention 5 juillet 2006
28 juin 2006 à 10:50
Houps autant pour moi ça fonctionne.
Excuse.

Merci énormément pour ton aide.

J'aurais encore besoin d'aide sur un point : si le but est de pouvoir ensuite d'afficher ou imprimer les documents, ça ne fonctionne pas avec des fichiers excel !!! Word, PDF, XML, etc....pas de problème mais XLS non.
Je fait un nouveau post pour ça
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
28 juin 2006 à 11:02
Alors je sais pas j ai jamais fait d'impression automatique.

En revanche ce que je peux te conseiller c'est d'utiliser l'enregistreur de macro fourni avec Excel. Ainsi tu verras la suite de commande qu'effectue excel pour imprimer.

@+, Julien
Pensez: Moteur de Recherche, Réponse Acceptée
Mais Surtout: Règlement/FONT>
0
Rejoignez-nous