Zone de liste modifiable (combobox), entrée alphabétique et objet de collection, Excel VBA

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

 

S’abonner
Notifier de
0 Commentaires
Inline Feedbacks
Voir tous les commentaires

Initiation à Excel

Fonctions Excel

Excel VBA

Macros VBA Utiles

Plus d'outils

Sur Facebook

Sur YouTube

0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x