Dim cResult(cbTest.Items.Count) As String
For Each item As String In cbTest.Items
cResult(cbTest.Items.IndexOf(item)) = item
Next
cResult.Sort(cResult)
cResult.Reverse(cResult)
Dim newindex As Integer
For Each item As String In cResult
If item Is Nothing Then
newindex = cResult.IndexOf(cResult, item)
Exit For
End If
Next
Dim cnewResult(newindex - 1)
cResult.Copy(cResult, 0, cnewResult, 0, newindex)
cnewResult.Sort(cnewResult)
cbTest.Items.Clear()
cbTest.Items.AddRange(cnewResult)
MsgBox("End Clear")
Remarque :
cbTest est un combobox
Mettre le code dans une procédure
Private Sub NoDupesInCombo(ByRef cbo As ComboBox)
Dim i As Long, j As Long
For i = 0 To cbo.ListCount - 1
For j = cbo.ListCount - 1 To i + 1 Step -1
If cbo.List(i) = cbo.List(j) Then cbo.RemoveItem (j)
Next j
Next i
End Sub
Private Sub UserForm_Initialize() 'Form_Load pour vb6
With ComboBox1
.AddItem "1"
.AddItem "2"
.AddItem "3"
.AddItem "1"
.AddItem "2"
.AddItem "3"
.AddItem "1"
.AddItem "1"
.AddItem "2"
.AddItem "2"
.AddItem "3"
.AddItem "3"
End With
End Sub
' *** Exemple d'appelle :
Private Sub CommandButton1_Click()
Call NoDupesInCombo(Me.ComboBox1)
End Sub
Langage :
VB6
,
VBA
Date ajout :
24/04/2007
Posté par
jrivet
[
Liste]
DateMAJ :
24/04/2007
Dim i As Integer
Dim Elements As New Collection
On Error Resume Next
'Pour chaque éléments de la combo
For i = 0 To Combo1.ListCount - 1
'On l'ajoute a la collection
'Si il existe déja => Erreur (ignorée)
Call Elements.Add(Combo1.List(i), Combo1.List(i))
Next
On Error GoTo 0
'On Vide le Combo
Call Combo1.Clear
'POur chaque éléments de la collection
For i = 1 To Elements.Count
'On l'ajoute au combo
Call Combo1.AddItem(Elements(i))
Next
Remarque :
Ce code utilise Les collections (peu être un peu trop juste pour des doublons mais ca montre le principe).
Code à placer aussi dans une procédure. Combo1 est le comboBox.
<select id="combobox"
size=5>
<option>1
<option>2
<option>3
<option>1
<option>2
<option>3
<option>1
<option>1
<option>2
<option>2
<option>3
<option>3
</select>
<script type="text/javascript">
var sel=document.getElementById("combobox");
var i=0;
do
{
j=i+1;
do
{
if ( sel.options[i].text==sel.options[j].text )
{ sel.remove(j); }
else { j++; }
} while ( j<sel.length )
i++;
} while ( i<(sel.length-1) )
</script>
for(int i=0; i<this.comboBox.Items.Count - 1; i++)
{
for (int j = this.comboBox.Items.Count - 1; j>i; j--)
{
if (comboBox.Items[i] == comboBox.Items[j])
{
comboBox.Items.RemoveAt(j);
}
}
}
procedure DeleteDoublets(const AList: TStrings);
var
StringList: TStringList;
begin
StringList := TStringList.Create;
with StringList do
try
Sorted := True;
Assign(AList);
AList.Assign(StringList);
finally
Free;
end;
end;
// exemple d'utilisation :
procedure TForm1.Button1Click(Sender: TObject);
begin
DeleteDoublets(ComboBox1.Items);
end;
Remarque :
Cette fonction s'applique à tous les objets contenant une liste de chaînes : TComboBox, TMemo, TListBox, etc...
A noter que la propriété TStringList.Duplicates (librement consultable dans l'unité Classe.pas, ainsi que dans l'aide en ligne de Delphi, touche F1) est à dupIgnore par défaut, mais c'est elle qui explique le fonctionnement du code.
Autre méthode en utilisant uniquement le Combobox :
var
i: Integer;
begin
with ComboBox1.Items do
for i:= Count - 1 downto 1 do
if IndexOf(Strings[i]) < i then
Delete(i);
end;
Ainsi on peut garder l'ordre d'origine des items.
Si on veut classer par ordre alphabétique : il suffit de mettre la propriété "Sorted" du Combobox1 à true (ou mettre Combobox1.Sorted:=True)
J'ai mis "downto 1" (et pas "downto 0") car l'item "0" n'a pas besoin d'être traité
Pour les puristes une boucle "try" peut être rajoutée.
Toutefois le code ne coince pas même s'il n'y a aucun item dans le Combobox.
Le même raisonnement peut être utilisé pour l'élimination de doublons dans une liste d'éléments (TStringlist par exemple) en gardant l'ordre d'origine (càd qu'on enlève les "Add" supplémentaires supposés avoir été rajoutés ultérieurement)
drjerome