TRAITEMENT des LISTES en VBA |
En VBA, on dispose de deux contrôles pour afficher les listes.
|
Quelques PROPRIETES et METHODES de ListBox et ComboBox |
Dans ces exemples, lstBoite est le nom du contrôle ListBox ou ComboBox
Attention, d'autres propriétés, telles que sorted (trié) sont disponibles en VB mais pas en VBA (du moins version 1998). |
Un exercice en 3 volets |
L'exercice proposé ici comporte 3 parties :
|
Placer les Contrôles |
Commencez par insérer un nouveau module, puis dans ce Module1, ouvrez une nouvelle feuille "UserForm1" et placez les contrôles suivant le modèle et les indications ci-dessous. NOTA : Cette fois je ne vous donnerai pas les propriétés de tous les contrôles. Je ne vous indiquerai que les particularités. En particulier, je ne vous donne pas les propriétés Caption. N'oubliez pas de les modifier. En cas de problème :
La zone de liste (ListBox) Propriété (Name) : lstCalques Le bouton de commande Sélectionner Propriété (Name) : cmdCalqueSel Le bouton de commande Trier la liste Propriété (Name) : cmdTri1 Le bouton de commande Oter calque 0 Propriété (Name) : cmdCalque0 La zone de texte (TextBox) Propriété (Name) : txtNomFich La liste modifiable (ComboBox) Propriété (Name) : cboFichier Le bouton de commande Extraire Propriété (Name) : cmdExtraire Le bouton de commande Trier la liste Propriété (Name) : cmdTri2 Le bouton de commande Sélectionner Propriété (Name) : cmdFichSel La zone de texte (TextBox) Propriété (Name) : txtNomExcel La liste modifiable (ComboBox) Propriété (Name) : cboExcel Propriété (Style) : 2 - fmStyleDropDownList En donnant la valeur 2 à la propriété Style vous empèchez la saisie d'une nouvelle entrée. Le bouton de commande Extraire Propriété (Name) : cmdExtrExcel Le bouton de commande Trier la liste Propriété (Name) : cmdTri3 Le bouton de commande Sélectionner Propriété (Name) : cmdExcelSel Le bouton de commande Quitter Propriété (Name) : cmdQuitter |
Le code de la 1ère partie |
Procédure Private Sub UserForm_Initialize() |
|
Private Sub UserForm_Initialize() Dim objCalque As AcadLayer For Each objCalque In ThisDrawing.Layers lstCalques.AddItem objCalque.Name Next txtNomFich.Text = "d:\vbatest\listest.txt" txtNomExcel.Text = "d:\vbatest\test3.xls" End Sub |
Procédure Private Sub cmdCalqueSel_Click() |
|
Private Sub cmdCalqueSel_Click() Dim strCalque As String selection% = lstCalques.ListIndex If selection% = -1 Then MsgBox "Aucun calque n'a été sélectionné !", vbCritical Else strCalque = lstCalques.List(selection%) MsgBox "Le calque Index N°" & selection% & " - Nom : " & strCalque & " a été sélectionné" End If End Sub |
Procédure Private Sub cmdCalque0_Click() |
|
Private Sub cmdCalque0_Click() For Cpt1% = 0 To lstCalques.ListCount - 1 If lstCalques.List(Cpt1%) = "0" Then lstCalques.RemoveItem Cpt1% MsgBox "Calque 0 enlevé de la liste" Exit Sub End If Next Cpt1% MsgBox "Calque 0 déjà enlevé !" End Sub |
Procédure Private Sub cmdTri1_Click() |
|
Private Sub cmdTri1_Click() lstCalques = Tri_Liste(lstCalques) End Sub |
Procédure Private Sub cmdQuitter_Click() |
|
Private Sub cmdQuitter_Click() Unload Me End Sub |
Le code de Module1 |
Déclarations dans (Général) de Module1 |
Quelques explications sur le code :
|
Option Explicit Public Sub Listes() UserForm1.Show End Sub '********** Function Tri_Liste ********************************** ' Objet : Tri une liste d'éléments d'une liste par ' ordre alphabétique croissant ' Entrée : lstA_Trier : la liste des éléments à trier ' Retour : La liste triée '***************************************************************** Public Function Tri_Liste(lstA_Trier) Dim intIndex() As Integer ' index des éléments de la liste Dim Cpt1, Cpt2 As Integer ' compteurs ReDim lstOriginale(lstA_Trier.ListCount - 1) As String ReDim intIndex(lstA_Trier.ListCount - 1) As Integer For Cpt1 = 0 To lstA_Trier.ListCount - 1 lstOriginale(Cpt1) = lstA_Trier.List(Cpt1) Next Cpt1 For Cpt1 = LBound(lstOriginale) To UBound(lstOriginale) For Cpt2 = LBound(lstOriginale) To UBound(lstOriginale) If lstOriginale(Cpt1) > lstOriginale(Cpt2) Then _ intIndex(Cpt1) = intIndex(Cpt1) + 1 Next Cpt2 Next Cpt1 For Cpt1 = LBound(lstOriginale) To UBound(lstOriginale) lstA_Trier.AddItem lstOriginale(Cpt1), intIndex(Cpt1) lstA_Trier.RemoveItem intIndex(Cpt1) + 1 Next Cpt1 End Function '********** Function ExtractFichier ****************************** ' Objet : Extrait une liste d'un fichier texte ' Notes : - Chaque ligne devient un élément de la liste ' : donc un seul élément par ligne ! ' : - On peut donner n'importe quelle extension au fichier, ' : du moment que c'est un fichier texte. ' Entrées: NomFich : Nom du fichier texte avec son chemin complet ' : Liste : Le nom de liste ' Retour : La liste '***************************************************************** Public Function ExtractFichier(NomFich As String, Liste) Dim FNum As Integer ' numero de fichier Dim Texte As String ' la ligne extraite On Error Resume Next ' FreeFile renvoie le prochain numéro de fichier disponible FNum = FreeFile() ' ouverture du fichier en lecture, accès partagé Open NomFich For Input Access Read Shared As FNum If Err <> 0 Then MsgBox "Impossible d'ouvrir le fichier '" & NomFich & "' !" Exit Function End If ' Lecture de chaque ligne et ajout dans la liste Do While Not EOF(FNum) Line Input #FNum, Texte Liste.AddItem Texte Loop Close #FNum End Function |
Le code de la 2ème partie |
Procédure Private Sub cmdExtraire_Click() |
|
Private Sub cmdExtraire_Click() ' Bouton de commande de l'extraction d'un fichier texte If Dir$(txtNomFich.Text) = "" Then MsgBox "ATTENTION : le fichier de données n'existe pas !", 16 Exit Sub End If cboFichier.Clear cboFichier = ExtractFichier(txtNomFich.Text, cboFichier) End Sub |
Procédure Private Sub cmdTri2_Click() |
|
Private Sub cmdTri2_Click() cboFichier = Tri_Liste(cboFichier) End Sub |
Procédure Private Sub cmdFichSel_Click() |
|
Private Sub cmdFichSel_Click() Dim strFich As String selection% = cboFichier.ListIndex If selection% = -1 Then If Trim(cboFichier.Text) <> "" Then strFich = cboFichier.Text MsgBox "L'élément : " & strFich & " a été sélectionné" Else MsgBox "Aucun élément n'a été sélectionné !", vbCritical End If Else strFich = cboFichier.List(selection%) MsgBox "L'élément : " & strFich & " a été sélectionné" End If End Sub |
Le code de la 3ème partie |
Procédure Private Sub cmdExtrExcel_Click() |
|
Private Sub cmdExtrExcel_Click() Dim AppExcel As Object ' Variable objet Application Excel Dim FeuilleXL As Object Dim intRangee As Integer Dim blnRang As Boolean ' on récupère le nom du fichier If Dir$(txtNomExcel.Text) = "" Then MsgBox "ATTENTION : le fichier Excel n'existe pas !", 16 Exit Sub End If cboExcel.Clear On Error Resume Next ' Ouvre le fichier Excel Set AppExcel = GetObject(txtNomExcel.Text) ' Sinon il y a une erreur If Err <> 0 Then MsgBox "Impossible d'ouvrir le fichier '" & txtNomExcel.Text & "' !" Exit Sub End If ' Entrez ici le nom de la feuille Set FeuilleXL = AppExcel.Worksheets("Calques") If Err <> 0 Then MsgBox "Impossible d'ouvrir la feuille 'Calques' !" Exit Sub End If 'Desactivation du gestionnaire d'erreur On Error GoTo 0 intRangee = 2 ' rangée de départ blnRang = True ' drapeau cellule non vide While blnRang = True intRangee = intRangee + 1 If FeuilleXL.Cells(intRangee, 1) = "" Then ' colonne 1 blnRang = False Else cboExcel.AddItem FeuilleXL.Cells(intRangee, 1) ' colonne 1 End If Wend End Sub |
Procédure Private Sub cmdTri3_Click() |
|
Private Sub cmdTri3_Click() cboExcel = Tri_Liste(cboExcel) End Sub |
Procédure Private Sub cmdExcelSel_Click() |
|
Private Sub cmdExcelSel_Click() Dim strFich As String selection% = cboExcel.ListIndex If selection% = -1 Then MsgBox "Aucun élément n'a été sélectionné !", vbCritical Else strFich = cboExcel.List(selection%) MsgBox "L'élément : " & strFich & " a été sélectionné" End If End Sub |
Cliquez sur l'icône pour télécharger le projet Listes.dvb (27 ko), avec exemples de fichiers .txt et .xls |