Nous allons créer une application simple qui, lors de la saisie de données, par exemple des noms de famille, via la zone de texte d’une comboBox, les trie automatiquement par ordre alphabétique. Dans ce cas, les données saisies immédiatement après avoir appuyé sur la touche <Entrée> sont affichées dans la liste déroulante par ordre alphabétique. Lorsque la fenêtre est fermée, toutes les données de la liste déroulante sont entrées dans les cellules de la feuille de calcul comme le montre la figure suivante.
Figure : Tri des données par ordre alphabétique

Pour implémenter cette application, nous utiliserons l’objet Collection, qui est un stockage dynamique pratique d’autres objets. Pour travailler avec l’objet Collection, il n’existe qu’une seule propriété, Count, qui renvoie le nombre d’éléments, et trois méthodes: Item (renvoyer un élément), Add (ajouter un nouvel élément) et Remove (supprimer un élément). Le code ci-dessous, d’une part, est un bon exemple montrant comment travailler avec l’objet Collection (l’endroit dans la famille où un nouvel élément est inséré est déterminé à l’aide de l’algorithme de recherche binaire), et d’autre part, il montre comment à partir de la zone de texte les zones de liste déroulante saisissent les données dans la liste elle-même.
Alors, nous allons créer un formulaire, placez-y une zone de liste déroulante, et dans le module de formulaire tapez le code suivant :
Private ABC As Collection
Private Sub UserForm_Initialize()
Me.Caption = "Zone de liste modifiable"
Set ABC = New Collection
End Sub
Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)
If KeyCode = vbKeyReturn Then
Dim i As Integer
Insert ComboBox1.Text
ComboBox1.Clear
For i = 1 To ABC.Count
ComboBox1.AddItem ABC.Item(i)
Next
End If
End Sub
Private Sub UserForm_Terminate()
Range("A:A").Clear
Dim i As Integer
With ABC
For i = 1 To .Count
Cells(i, 1).Value = .Item(i)
Next
End With
Columns(1).AutoFit
End Sub
Sub Insert(element As Variant)
Dim min As Integer, max As Integer, middle As Integer
If ABC.Count = 0 Then
ABC.Add element
Exit Sub
End If
min = 1
max = ABC.Count
If element <= ABC.Item(min) Then
ABC.Add element, Before:=min
Exit Sub
End If
If element >= ABC.Item(max) Then
ABC.Add element, After:=max
Exit Sub
End If
Do Until max - min <= 1
middle = (min + max) / 2
If ABC.Item(middle) < element Then
min = middle
Else
max = middle
End If
Loop
ABC.Add element, Before:=max
End Sub