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