|
| 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 |