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