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
' a mettre dans un module
Sub ListeSansDoublon(ByRef MaPlage As Range, ByRef MaCombobox As ComboBox)
' on commence par verifier ce qui a été passé en parametre
If Not MaCombobox Is Nothing And Not MaPlage Is Nothing Then
If TypeOf MaCombobox Is ComboBox Then
Application.ScreenUpdating = False
' utilisation du filre de donnée élaboré
MaPlage.AdvancedFilter Action:=xlFilterInPlace, Unique:=True
' le filtre élaboré a besoin d'un colonne de donnée avec etiquette
' donc pour ne pas mettre cette etiquette dans la liste on se decale d'une ligne vers le bas
Set MaPlage = MaPlage.Offset(1, 0).Resize(MaPlage.Rows.Count - 1, 1)
' les données en doubles on été cachées par le filtre
' il suffit donc de ne recupérer que ce qui est visible
Set MaPlage = MaPlage.SpecialCells(xlCellTypeVisible)
' comme on ne peut pas attribuer les valeurs d'une plage composée de plusieurs area a une combobox
' on vas contourner le probleme par un copy paste des valeurs sur une plage temporaire
MaPlage.Copy
Range("Z1").PasteSpecial Paste:=xlPasteValues ' ici la plage temporaire est la colonne Z
MaCombobox.List() = Selection.Value
' on desactive le filtre
ActiveSheet.ShowAllData
' on efface la zone temporaire
Selection.ClearContents
' on centre l'affichage sur la plage d'origine
MaPlage.Cells(1, 1).Activate
Application.ScreenUpdating = True
End If
End If
End Sub
Remarque :
Code sans boucle mais specifique au VBA excel.