- Thème : tableaux (objets ListObject) | Durée : 35 min | Niveau : intermédiaire.
- Classeur de départ :
VBA14_ventes.xlsm (feuille Ventes : Zone, Commercial, Produit, CA). - Contexte : les ventes du trimestre sont saisies dans une plage simple. Vous la transformez en Tableau (objet ListObject), puis vous l'enrichissez par macro : nouvelle ligne, colonne calculée TTC, ligne Total, tri et filtre.
- Ouvrir le classeur, puis l'éditeur Visual Basic (Alt+F11) et le module
Module1. - Transformer la plage en Tableau : macro
CreerTableau. - Ajouter une vente à la fin du tableau : macro
AjouterVente. - Ajouter la colonne calculée TTC : macro
AjouterTTC. - Afficher la ligne Total : macro
AfficherTotaux. - Trier le tableau par CA décroissant : macro
TrierParCA. - Filtrer la zone Nord et parcourir les lignes : macro
FiltrerNord. - Répondre au questionnaire de fin de lab (5 questions, 80 % pour valider).
Transformer la plage en Tableau
Sub CreerTableau()
Dim tblVente As ListObject
Set tblVente = ActiveSheet.ListObjects.Add(xlSrcRange, Range("A1").CurrentRegion, , xlYes)
tblVente.Name = "tblVente"
End Sub
- ListObjects.Add crée un Tableau à partir d'une plage. xlYes indique que la première ligne contient les en-têtes. Un nom explicite (tblVente) permet ensuite de le désigner sans dépendre de son numéro.
- Résultat attendu :
- Un Tableau nommé tblVente couvre A1:D13
Ajouter une vente à la fin du tableau
Sub AjouterVente()
Dim tblVente As ListObject, NewLine As ListRow
Set tblVente = Worksheets("Ventes").ListObjects("tblVente")
Set NewLine = tblVente.ListRows.Add
NewLine.Range.Cells(1, tblVente.ListColumns("Zone").Index).Value = "Ouest"
NewLine.Range.Cells(1, tblVente.ListColumns("Commercial").Index).Value = "Nina Guérin"
NewLine.Range.Cells(1, tblVente.ListColumns("Produit").Index).Value = "Capot CX-200"
NewLine.Range.Cells(1, tblVente.ListColumns("CA").Index).Value = 4200
End Sub
- ListRows.Add ajoute une ligne au Tableau et la renvoie. ListColumns("CA").Index donne le numéro de la colonne : le code reste juste si l'ordre des colonnes change.
- Résultat attendu :
- Le tableau compte 13 lignes de données, la dernière : Ouest, Nina Guérin, Capot CX-200, 4 200
Ajouter la colonne calculée TTC
Sub AjouterTTC()
Dim tblVente As ListObject, NewCol As ListColumn
Set tblVente = Worksheets("Ventes").ListObjects("tblVente")
Set NewCol = tblVente.ListColumns.Add
NewCol.Name = "TTC"
NewCol.DataBodyRange.Cells(1).Formula = "=[@CA]*1.2"
NewCol.DataBodyRange.NumberFormat = "#,##0.00"
End Sub
- Une formule écrite dans la première cellule d'une colonne vide de Tableau est recopiée sur toute la colonne : c'est une colonne calculée. [@CA] désigne la valeur de CA sur la même ligne.
- En VBA, la propriété Formula s'écrit en anglais, avec un point décimal (1.2). Excel l'affiche ensuite en français (1,2).
- Résultat attendu :
- La colonne TTC (E) fait partie du tableau
- Chaque ligne affiche CA × 1,2 (formule recopiée sur les 13 lignes)
Sub AfficherTotaux()
Dim tblVente As ListObject
Set tblVente = Worksheets("Ventes").ListObjects("tblVente")
tblVente.ShowTotals = True
tblVente.ListColumns("CA").TotalsCalculation = xlTotalsCalculationSum
tblVente.ListColumns("TTC").TotalsCalculation = xlTotalsCalculationSum
End Sub
- ShowTotals affiche la ligne Total sous le Tableau. TotalsCalculation choisit la fonction de chaque colonne : la formule SOUS.TOTAL ignore les lignes masquées par un filtre.
- Résultat attendu :
- La ligne Total affiche la somme de CA et de TTC
Trier le tableau par CA décroissant
Sub TrierParCA()
Dim tblVente As ListObject
Set tblVente = Worksheets("Ventes").ListObjects("tblVente")
tblVente.Sort.SortFields.Clear
tblVente.Sort.SortFields.Add Key:=Range("tblVente[[#Headers],[#Data],[CA]]"), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With tblVente.Sort
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
- L'objet Sort du Tableau mémorise les clés de tri : SortFields.Clear efface les anciennes, SortFields.Add ajoute la nouvelle, Apply exécute le tri. Range("tblVente[[#Headers],[#Data],[CA]]") désigne la colonne CA par son nom.
- Résultat attendu :
- La première ligne est la plus grosse vente (Profilé PF-25, 10 953,90)
- Les CA sont rangés du plus grand au plus petit
Filtrer la zone Nord et parcourir les lignes
Sub FiltrerNord()
Dim tblVente As ListObject, VariableLigne As ListRow
Set tblVente = Worksheets("Ventes").ListObjects("tblVente")
tblVente.Range.AutoFilter Field:=1, Criteria1:="Nord"
For Each VariableLigne In tblVente.ListRows
If VariableLigne.Range.Columns(1).Value = "Nord" Then
Debug.Print VariableLigne.Range.Columns(2).Value, VariableLigne.Range.Columns(4).Value
End If
Next
End Sub
- AutoFilter Field:=1 filtre la première colonne du Tableau. For Each ... In tblVente.ListRows parcourt toutes les lignes, y compris celles masquées par le filtre : d'où le test sur la zone.
- Lancez FiltrerNord, puis regardez la feuille (seules les ventes Nord restent visibles) et la fenêtre Exécution (Ctrl+G). Pour retirer le filtre : tblVente.Range.AutoFilter Field:=1.
- Résultat attendu :
- Le tableau est filtré sur la zone Nord
- La fenêtre Exécution liste les 4 ventes Nord