Le Coin des AutoCADiens
Le site français des développeurs pour AutoCAD
Vous pourrez ici apprendre à programmer en Visual Basic pour AutoCAD.
TRAITEMENT des LISTES en VBA
|
En VBA, on dispose de deux contrôles pour afficher les listes.
- La Zone de liste (ListBox) affiche une liste dans laquelle un ou plusieurs
éléménts peuvent être séléctionnés. Une barre de défilement est ajoutée automatiquement
si tous les éléments ne peuvent être affichés simultanément.
L'utilisateur ne peut rien ajouter dans une zone de liste.
- La Liste modifiable (ComboBox) combine une zone de texte et une zone de liste.
L'utilisateur peut saisir un nouvel élément dans la zone de texte ou sélectionner un
élément dans la zone de liste.
Il est possible d'interdire la saisie de nouveaux éléments.
|
Quelques PROPRIETES et METHODES de ListBox et ComboBox
|
Dans ces exemples, lstBoite est le nom du contrôle ListBox ou ComboBox
- Lire un élément de la liste : strElement = lstBoite.List(intIndex)
- Modifier un élément de la liste : lstBoite.List(intIndex) = strElement
- Nombre d'éléments de la liste : intNbre = lstBoite.ListCount
- Index de l'élément sélectionné dans la liste : intIndex = lstBoite.ListIndex
Attention, l'index commence à zéro. Le 3ème élément d'une liste aura pour index '2'.
- Ajouter un élément dans la liste : lstBoite.AddItem "Nouvel élément" [, index]
L'index définit la position dans la liste et est optionnel.
- Retirer un élément de la liste : lstBoite.RemoveItem(intIndex)
Exemple lstBoite.RemoveItem(1) supprime le 2ème élément de la liste.
- Supprimer tous éléments de la liste : lstBoite.clear
Il existe de nombreux autres méthodes et propriétés. Consultez l'aide en ligne.
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 :
- Une première zone de liste qui récupère et affiche la liste des calques.
- La seconde partie affiche dans une ComboBox une liste récupérée dans un fichier texte.
- La dernière partie affiche dans une autre ComboBox une colonne d'un fichier Excel.
Ces trois parties sont indépendantes l'une de l'autre, vous pourrez donc les tester au fur et à
mesure de l'écriture.
|
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 :
- Reportez vous au chapître 4 .
- Pompez sur le source que je vous donne en fin de cette page.
La feuille UserForm1
- On conserve le nom UserForm1
NOTA : Respecter les noms des contrôles que je vous donne ici, ils doivent correspondre
au code source, sinon modifiez-les dans le code également.
1er cadre
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
2ème cadre
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
3ème cadre
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() |
- Cette routine s'exécute automatiquement au lancement de la feuille
- La liste lstCalques est crée avec la méthode AddItem
- Déclaration des nom et répertoires par défaut des fichiers utilisés
dans les 2 autres parties. A personnaliser !
|
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() |
- Ce bouton n'a que pour seul but de vérifier la valeur de retour de l'élément choisi
- La propriété ListIndex donne l'index de l'élément sélectionné.
S'il est égal à -1, il n'y a rien de sélectionné.
- Sinon une boîte de dialogue donne l'index de l'élément choisi suivi de sa valeur.
|
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() |
- Ce bouton permet de retirer le calque 0 de la liste des calques
- On recherche d'abord l'index de l'élément à supprimer, puis
- La méthode RemoveItem permet de supprimer l'élément correspondant à l'index.
|
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() |
- Ce bouton permet de trier la liste par ordre alphabétique.
- La propriété sorted (trié) n'existant pas en VBA, on fait appel à une
fonction que l'on place dans module1 - Voir plus loin.
|
Private Sub cmdTri1_Click()
lstCalques = Tri_Liste(lstCalques)
End Sub
|
Procédure Private Sub cmdQuitter_Click() |
- Ce bouton permet de Quitter cet exercice.
|
Private Sub cmdQuitter_Click()
Unload Me
End Sub
|
Déclarations dans (Général) de Module1 |
Quelques explications sur le code :
- Option Explicit oblige à déclarer les variables, ce qui permet de réduire
les conséquences des fautes de frappe.
- Public : les valeurs de ces variables sont utilisées dans plusieurs procédures.
- La pocédure Listes sert à lancer le programme.
- La fonction Tri_Liste permet le tri d'une liste sans éléments identiques..
- La fonction ExtractFichier sert à extraire une liste d'un fichier texte (2ème partie).
|
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() |
- Cette routine vérifie par Dir$ si le fichier indiqué dans la zone de texte existe bien.
- Ensuite vide la liste par la méthode clear dans le cas ou on appelle plusieurs fois
cette routine.
- On exécute la fonction ExtractFichier pour récupérer la liste.
|
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() |
- Ce bouton permet de trier la liste par ordre alphabétique.
|
Private Sub cmdTri2_Click()
cboFichier = Tri_Liste(cboFichier)
End Sub
|
Procédure Private Sub cmdFichSel_Click() |
- Ce bouton donne la valeur de l'élément sélectionné..
|
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() |
- Cette routine vérifie par Dir$ si le fichier indiqué dans la zone de texte existe bien.
- Ensuite vide la liste par la méthode clear dans le cas ou on appelle plusieurs fois
cette routine.
- On ouvre l'application Excel et le fichier .xls
- On extrait chaque cellule de la colonne désirée par la méthode AddItem.
NOTA : Dans cet exemple, on utilise un fichier Excel obtenu par le programme Descript.
|
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() |
- Ce bouton permet de trier la liste par ordre alphabétique.
|
Private Sub cmdTri3_Click()
cboExcel = Tri_Liste(cboExcel)
End Sub
|
Procédure Private Sub cmdExcelSel_Click() |
- Ce bouton donne la valeur de l'élément sélectionné..
|
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
|
Des contrôles supplémentaires : découvrez WBloc+
© 1998-2007 FASOFT - Roger Rosec Tous droits réservés.
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|