supprimer doublons

  • Initiateur de la discussion Alex
  • Date de début
A

Alex

Guest
Salut tlm !

G un petit pb...
Soit une listbox (fam) avec comme données de référence :

Private Sub userform_initialize()
Sheets("Matières I").Select
fam.RowSource = "a4:a" & Range("A200").End(xlUp).Row
end sub

la colonne A contient des données en double
j'aimerai qu'elle n'apparaissent qu'une seule fois dans ma listbox...

Comment je peux faire ca ?

Merci
 
Z

Zon

Guest
Salut,

Au lieu de passer par rowsource, passes par list

ex:

dim plage as range

with Sheets("Matières I")
set plage=range(.[A4],.[A200].end(xlup))
fam.list=recupdoublons(plage.value)
end with
end sub

Function RecupDoublons(T, Optional ColT As Byte = 1)'Zon
Dim I&, J&, Tablo As New Collection, Temp()
For I = LBound(T, 1) To UBound(T, 1)
On Error Resume Next
Tablo.Add T(I, ColT), CStr(T(I, ColT))
If Err = 0 Then
ReDim Preserve Temp(J)
Temp(J) = T(I, ColT)
J = J + 1
End If
Next I
RecupDoublons = Temp
End Function

A+++
 
A

Alex

Guest
lo !

merci bcp le code marche nickel !

cependant, j'comprend pas tout dans la fonction recupdoublons ...
y'aurai moyen que tu m'expliq rapidement ?

ca veut dire koi quand tu définis ta variable avec un & à coté ? (Dim I&)
c koi les fonctions LBound et UBound ?
c koi une collection et temp ?

...

Merci bcp d'avance :p

Alex
 
Z

Zon

Guest
Salut,

dim I& <=> dim I as long c'est juste un raccourci syntaxique

On peut passer 2 paramètres dont 1 obligatoire à la fonction Recupdoublons , le 1 er est un variant en fait c'est un tableau VBA . J'aurais pu écrire T() (comme tous les tableaux) mais XL97 bogue là dessus quand on définit un tableau à partir d'une plage de cellules.
Le parmaètre optionnel ColT permet si on a plusieurs colonnes de dédoublonner la colonne que l'on veut.
=>Ex: set plage=range([A1],[B65536].end(xlup)) , si tu veux dédoublonner la colonne B tu peux appeler T=recupdoublons(plage.value,2).

Plage.value te renvoie un tableau de n lignes sur p colonnes. Ici maxi 200 lignes sur 1 colonne.
SI ta plage va de A4 à A195 tu auras 192 éléments. Pour connaitre le nombre d'éléments on utilise Ubound(borne supérieure)=>192. Pour Lbound (borne inférieure), c'est soit 0 ou 1 avec les tableaux VBA , pour un tableau à partir d'une plage c'est toujours 1. Pour un tableau "plus classique" comme temp c'est 0.
=>>>
Donc pour passer élément par élément du tableau on fait une boucle de Lbound à Ubound.

En définissant Temp() comme ceci il n' y a rien dans mon tableau.
Pour construire un tableau tu peux faire directement dim Temp(0 to 99) ou temp(1 to 100) pour avoir 100 éléments ou en cours de code redim temp(100) .
Dans notre cas je ne connais pas le nb d'éléments que va contenir Temp.

=>j'utilise donc Redim preserve permet d'agrandir une tableau tout en conservant les éléments existants. Je l'incrémente de 1 à chaque fois grace au compteur I .

Ce que dit l'aide "Un objet Collection est un jeu d'éléments indexés auxquels il peut être fait référence comme s'ils constituaient un ensemble unique ".=> La clé devant être unique, On error resume next sert à gérer l'erreur dès qu'une valeur apparait une 2 eme fois dans la collection. Le test if Err=0 permet de voir qu'il n'y a pas d'erreur et donc on alimente Temp de valeurs uniques.
On affecte temp à recupdoublons pour retourner le tableau dans la listbox grâce à la propriété list.


A+++
 

Discussions similaires

Réponses
1
Affichages
222
Réponses
0
Affichages
196

Membres actuellement en ligne

Statistiques des forums

Discussions
312 779
Messages
2 092 046
Membres
105 168
dernier inscrit
makari69