Excel - Power Query - Power Pivot - VBA

VBA14 | Piloter le tableau des ventes

Énoncé

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

Travail demandé

  • 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).

Corrigé

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)

Afficher la ligne Total

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

Pour aller plus loin